You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow自编码器报错:No gradients provided for any variable 求解

解决TensorFlow自编码器训练时的梯度缺失错误

问题描述

训练自编码器时触发以下错误:

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_vars is ((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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 21:05:21