Python,Tensorflow ValueError:没有为任何变量提供梯度

问题描述

我有一个名为 RL_Brain 的类:

class RL_Brain():
    def __init__(self,n_features,n_action,memory_size=10,batch_size=32,gamma=0.9,fi_size=10):
        self.n_features = n_features
        self.n_actions = n_action

        self.encoder = keras.Sequential([
            Input((self.n_features,)),Dense(16,activation='relu',kernel_initializer='glorot_normal',name='encoder_1'),name='encoder_2'),name='encoder_3'),Dense(self.fi_size,activation='softmax',name='fi'),])

        self.decoder = keras.Sequential([
            Input((self.fi_size,name='decoder_1',trainable=True),name='decoder_2',name='decoder_3',Dense(self.n_features,activation=None,name='decoder_output',trainable=True)
        ])

    def learn(self,state,r,a,state_):
        encoded = tf.one_hot(tf.argmax(self.encoder(state),axis=1),depth=self.fi_size)
        encoded_ = tf.one_hot(tf.argmax(self.encoder(state_),depth=self.fi_size)
        decoded_state = self.decoder(encoded).numpy()
        with tf.GradientTape() as tape:
            loss1 = mean_squared_error(state,decoded_state)
        grads = tape.gradient(loss1,self.decoder.trainable_variables)
        self.opt.apply_gradients(zip(grads,self.decoder.trainable_variables))

当我运行 learn 函数时,出现以下错误

File "/Users/wangheng/app/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/optimizer_v2/utils.py",line 78,in filter_empty_gradients raise ValueError("No gradients provided for any variable: %s." % ...

ValueError: No gradients provided for any variable: ['decoder_1/kernel:0','decoder_1/bias:0','decoder_2/kernel:0','decoder_2/bias:0','decoder_3/kernel:0','decoder_3/bias:0','decoder_output/kernel:0','decoder_output/bias:0'].

解决方法

以下行导致该错误

decoded_state = self.decoder(encoded).numpy()

一旦这样做,就没有从损失函数到可训练变量的路径,因此无法计算梯度。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...