TensorFlow自编码器报错:No gradients provided for any variable 求解
问题描述
训练自编码器时触发以下错误:
ValueError: No gradients provided for any variable: (['dense_12/kernel:0', 'dense_12/bias:0', 'dense_13/kernel:0', 'dense_13/bias:0'],). Provided
grads_and_varsis ((None, <tf.Variable 'dense_12/kernel:0' shape=(784, 2) dtype=float32>), (None, <tf.Variable 'dense_12/bias:0' shape=(2,) dtype=float32>), (None, <tf.Variable 'dense_13/kernel:0' shape=(2, 784) dtype=float32>), (None, <tf.Variable 'dense_13/bias:0' shape=(784,) dtype=float32>)).
错误原因
代码中call方法的返回值逻辑错误:你返回的是原始输入x的reshape结果,而非解码器生成的重构输出。这导致损失函数计算的是输入与自身的均方误差,完全没有用到编码器和解码器的输出,因此无法产生梯度来更新模型参数。
修正方案
修改call方法,将返回值改为解码器输出decoded的reshape结果,同时移除重复的Flatten操作(编码器内部已包含该层),并删除未使用的冗余方法:
class autoencoder(Model): def __init__(self, output_dim = 2): super(autoencoder, self).__init__() self.output_dim = output_dim self.encoder = tf.keras.Sequential([ layers.Flatten(), layers.Dense(2, activation='relu') ]) self.decoder = tf.keras.Sequential([ layers.Dense(784, activation='relu') ]) def call(self, x, train = None): encoded = self.encoder(x) decoded = self.decoder(encoded) # 返回解码器生成的重构结果,恢复为输入的形状 return tf.reshape(decoded, (-1,28,28)) model = autoencoder() model.compile(optimizer='adam', loss=losses.MeanSquaredError()) model.fit(X_train, X_train, epochs=1, shuffle=True, validation_data=(X_test, X_test))
额外说明
自编码器的核心是输入重构,模型输出必须是解码器对编码特征的重构结果,这样损失函数才能衡量输入与重构结果的差异,驱动模型参数更新。
内容的提问来源于stack exchange,提问作者gülsümmm

