【问题标题】:No gradients provided for any variable - LSTM autoencoder没有为任何变量提供梯度 - LSTM 自动编码器
【发布时间】:2021-06-09 17:56:36
【问题描述】:

我正在尝试构建一个 LSTM 编码器。我正在 MNIST 数据集上对其进行测试,以检查任何错误,然后再在我的实际数据集上使用它。我的代码:

import tensorflow as tf
from tensorflow import keras as K
from tensorflow.keras.datasets import mnist
from tensorflow.keras import layers
(x_train, y_train), (x_test, y_test) = mnist.load_data()

encoder_input = K.Input(shape=(x_train.shape[1], x_train.shape[2]))
layer1 = layers.LSTM(
    units=64, return_sequences=True
)(encoder_input)
layer2, state1, state2 = layers.LSTM(
    units=128, return_state=True,
)(layer1)
hidden_representations = layers.Dense(1024)(layer2)

encoder_state = [state1, state2]

rep_vec = layers.RepeatVector(n=x_train.shape[1])(hidden_representations)
decode_l1 = layers.LSTM(units=128, 
                        return_sequences=True)(rep_vec,
                                                initial_state=encoder_state)
decode_l2 = layers.LSTM(units=64, return_sequences=True)(decode_l1)
decoder_out = layers.TimeDistributed(
    layers.Dense(units=x_train.shape[2], activation="sigmoid")
  )(decode_l2)

AE = K.Model(inputs=encoder_input, outputs=[decoder_out, 
                                            hidden_representations])

到目前为止,一切看起来都不错,摘要为我提供了正确的维度,当我尝试在训练前进行预测时,我得到了正确的输出。但是,一旦我尝试将模型拟合到我的数据中,我就会收到以下错误消息:

AE.fit(x_train)
OUT:

ValueError: in user code:

    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:855 train_function  *
        return step_function(self, iterator)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:845 step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/distribute/distribute_lib.py:1285 run
        return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/distribute/distribute_lib.py:2833 call_for_each_replica
        return self._call_for_each_replica(fn, args, kwargs)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/distribute/distribute_lib.py:3608 _call_for_each_replica
        return fn(*args, **kwargs)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:838 run_step  **
        outputs = model.train_step(data)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:799 train_step
        self.optimizer.minimize(loss, self.trainable_variables, tape=tape)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/optimizer_v2/optimizer_v2.py:530 minimize
        return self.apply_gradients(grads_and_vars, name=name)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/optimizer_v2/optimizer_v2.py:630 apply_gradients
        grads_and_vars = optimizer_utils.filter_empty_gradients(grads_and_vars)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/optimizer_v2/utils.py:76 filter_empty_gradients
        ([v.name for _, v in grads_and_vars],))

    ValueError: No gradients provided for any variable: ['lstm_63/lstm_cell_63/kernel:0', 'lstm_63/lstm_cell_63/recurrent_kernel:0', 'lstm_63/lstm_cell_63/bias:0', 'lstm_64/lstm_cell_64/kernel:0', 'lstm_64/lstm_cell_64/recurrent_kernel:0', 'lstm_64/lstm_cell_64/bias:0', 'dense_27/kernel:0', 'dense_27/bias:0', 'lstm_65/lstm_cell_65/kernel:0', 'lstm_65/lstm_cell_65/recurrent_kernel:0', 'lstm_65/lstm_cell_65/bias:0', 'lstm_66/lstm_cell_66/kernel:0', 'lstm_66/lstm_cell_66/recurrent_kernel:0', 'lstm_66/lstm_cell_66/bias:0', 'time_distributed_15/kernel:0', 'time_distributed_15/bias:0'].

我正在 Google Colab 上运行此代码。我搜索了类似的问题,但似乎都没有解决我的问题。

【问题讨论】:

  • 我想你忘记在示例中导入 keras as K
  • 我编辑了代码,但还是不行

标签: python tensorflow keras deep-learning lstm


【解决方案1】:

您需要将 x_train 和 y_train 传递到 fit 语句中。

AE.fit(x_train, y_train)

否则没有预期的输出可以训练。

【讨论】:

  • 出于测试目的,您可以向其提供y_train = [x_train, np.random.random((x_train.shape[0], 1024))] 形式的虚拟数据。
  • MNIST 已经有自己的 y_train 值,请求者分配给变量。虽然如果你不能或不想使用这些,那是获得测试集的好方法。
  • 作为自动编码器,我的 y 就是我的 x。因此我写了```AE.fit(x_train, x_train)`` 并且错误消失了。
  • 看起来你的最后一层是一个线性层,大小为 x_train.shape[2],而 x_train 本身有更多维度。您需要使输出层具有与 x_train 相同的整体形状。
猜你喜欢
  • 2020-10-23
  • 2017-12-12
  • 1970-01-01
  • 2017-06-01
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
相关资源
最近更新 更多