简单的 TensorFlow LSTM 网络:ValueError:没有为任何变量提供梯度

Posted

技术标签:

【中文标题】简单的 TensorFlow LSTM 网络:ValueError:没有为任何变量提供梯度【英文标题】:Simple TensorFlow LSTM Network: ValueError: No gradients provided for any variable 【发布时间】:2021-02-27 19:00:43 【问题描述】:

我正在尝试创建一个简单、简单的 LSTM 示例来预测浮点数序列中的下一个点。为了简单起见,我选择了线性样本数据。我正在使用 TensorFlow 2.3.1 和 NumPy 1.18.5。

这是输入数据的设置,长度为 5 的基本滚动范围:

# Sample data -- linear function
linear_data=0.05+0.05*np.array(range(20))

# Size of window in rolling horizon
window = 5

# Tensorflow expects 3D: i,j,k = samples, window/sequence data, 
# features (one since we're univariate)
rolling_x = np.zeros([len(linear_data)-window, window, 1])
rolling_y = np.zeros([len(linear_data)-window, 1])

# Populate the rolling horizon data
for idx in [t for t in range(len(linear_data)-window)]:
    rolling_x[idx, :, 0] = linear_data[idx:idx+window]
    rolling_y[idx, :] = linear_data[idx+window]
    
print(rolling_x[:,:,0])

>>> [[0.05 0.1  0.15 0.2  0.25]
>>> [0.1  0.15 0.2  0.25 0.3 ]
>>> [0.15 0.2  0.25 0.3  0.35]
...
>>> [0.75 0.8  0.85 0.9  0.95]]

其中rolling_y 包含序列中的下一项。我的理解是,数据应该由第一个轴上的批次/样本数据、第二个轴上的序列/窗口和最后一个轴上的特征数(在这种情况下为 1,因为我是单变量的)来构建。

从这里我构建了一个非常简单的模型:

# Build the model
tf_model = Sequential()
tf_model.add(LSTM(
    units=32,
    input_shape=[window, 1]
))
tf_model.add(Dense(units=1))
tf_model.compile()

它编译得很好,但是当我尝试训练 (tf_model.fit(rolling_x, rolling_y)) 时出现以下错误:

    c:\users\____\documents\data_analytics\lstm-demo\env\lib\site-packages\tensorflow\python\keras\engine\training.py:806 train_function  *
        return step_function(self, iterator)
    c:\users\____\documents\data_analytics\lstm-demo\env\lib\site-packages\tensorflow\python\keras\engine\training.py:796 step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    c:\users\____\documents\data_analytics\lstm-demo\env\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:1211 run
        return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
    c:\users\____\documents\data_analytics\lstm-demo\env\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:2585 call_for_each_replica
        return self._call_for_each_replica(fn, args, kwargs)
    c:\users\____\documents\data_analytics\lstm-demo\env\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:2945 _call_for_each_replica
        return fn(*args, **kwargs)
    c:\users\____\documents\data_analytics\lstm-demo\env\lib\site-packages\tensorflow\python\keras\engine\training.py:789 run_step  **
        outputs = model.train_step(data)
    c:\users\____\documents\data_analytics\lstm-demo\env\lib\site-packages\tensorflow\python\keras\engine\training.py:756 train_step
        _minimize(self.distribute_strategy, tape, self.optimizer, loss,
    c:\users\____\documents\data_analytics\lstm-demo\env\lib\site-packages\tensorflow\python\keras\engine\training.py:2736 _minimize
        gradients = optimizer._aggregate_gradients(zip(gradients,  # pylint: disable=protected-access
    c:\users\____\documents\data_analytics\lstm-demo\env\lib\site-packages\tensorflow\python\keras\optimizer_v2\optimizer_v2.py:562 _aggregate_gradients
        filtered_grads_and_vars = _filter_grads(grads_and_vars)
    c:\users\____\documents\data_analytics\lstm-demo\env\lib\site-packages\tensorflow\python\keras\optimizer_v2\optimizer_v2.py:1270 _filter_grads
        raise ValueError("No gradients provided for any variable: %s." %

    ValueError: No gradients provided for any variable: ['lstm_3/lstm_cell_3/kernel:0', 'lstm_3/lstm_cell_3/recurrent_kernel:0', 'lstm_3/lstm_cell_3/bias:0', 'dense_3/kernel:0', 'dense_3/bias:0'].

【问题讨论】:

您没有指定训练损失。老实说,我很惊讶没有为此采取任何保障措施。我建议再看看compile 和它需要的参数。 我这么简单的疏忽,确实解决了问题。我会考虑添加一个功能请求,因为我认为它会默认为 RMSE、MSE 或 MAE。它可能对错误消息更有帮助。 【参考方案1】:

正如@xdurch0 所说,我们必须在编译模型时指定训练配置优化器、损失和指标

请参考下图compile参数进行训练。

compile(
    optimizer='rmsprop', loss=None, metrics=None, loss_weights=None,
    weighted_metrics=None, run_eagerly=None, **kwargs
)

为了社区的利益,我在这里发布完整的工作代码

import tensorflow as tf
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM

# Sample data -- linear function
linear_data=0.05+0.05*np.array(range(20))

# Size of window in rolling horizon
window = 5

# Tensorflow expects 3D: i,j,k = samples, window/sequence data, 
# features (one since we're univariate)
rolling_x = np.zeros([len(linear_data)-window, window, 1])
rolling_y = np.zeros([len(linear_data)-window, 1])

# Populate the rolling horizon data
for idx in [t for t in range(len(linear_data)-window)]:
    rolling_x[idx, :, 0] = linear_data[idx:idx+window]
    rolling_y[idx, :] = linear_data[idx+window]
    
print(rolling_x[:,:,0])

# Build the model
tf_model = Sequential()
tf_model.add(LSTM(
    units=32,
    input_shape=[window, 1]
))
tf_model.add(Dense(units=1))
tf_model.compile(optimizer='adam', loss='mae', metrics=['mae'])
tf_model.fit(rolling_x, rolling_y)

输出:

[[0.05 0.1  0.15 0.2  0.25]
 [0.1  0.15 0.2  0.25 0.3 ]
 [0.15 0.2  0.25 0.3  0.35]
 [0.2  0.25 0.3  0.35 0.4 ]
 [0.25 0.3  0.35 0.4  0.45]
 [0.3  0.35 0.4  0.45 0.5 ]
 [0.35 0.4  0.45 0.5  0.55]
 [0.4  0.45 0.5  0.55 0.6 ]
 [0.45 0.5  0.55 0.6  0.65]
 [0.5  0.55 0.6  0.65 0.7 ]
 [0.55 0.6  0.65 0.7  0.75]
 [0.6  0.65 0.7  0.75 0.8 ]
 [0.65 0.7  0.75 0.8  0.85]
 [0.7  0.75 0.8  0.85 0.9 ]
 [0.75 0.8  0.85 0.9  0.95]]

1/1 [==============================] - 0s 2ms/step - loss: 0.6889 - mae: 0.6889
<tensorflow.python.keras.callbacks.History at 0x7fa76e2b05f8>

【讨论】:

以上是关于简单的 TensorFlow LSTM 网络:ValueError:没有为任何变量提供梯度的主要内容,如果未能解决你的问题,请参考以下文章

学习Tensorflow的LSTM的RNN例子

在 Tensorflow 2.0 中的简单 LSTM 层之上添加注意力

TensorFlow:递归神经网络(RNN与LSTM)

深度学习(08)_RNN-LSTM循环神经网络-03-Tensorflow进阶实现

Tensorflow神经网络之LSTM

LSTM简单入门