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

数据挖掘 深度学习 张量流 lstm 汇集
2022-02-25 13:55:29

在我的模型上运行训练时出现此错误。我在不同的网站上发现了这个问题,但找不到我的问题的解决方案。

这是我的模型:

import keras
import tensorflow as tf
import tensorflow.keras.layers as L
import tensorflow.keras.models as M
import tensorflow.keras.callbacks as C
import tensorflow.keras.utils as U

def make_model_lstm_pooling(inshape=50000):
    z = L.Input(shape=(inshape, 10))
    x = L.AveragePooling1D(pool_size=1, strides=100)(z)
    
    x = L.Bidirectional(
        L.LSTM(10,
            dropout=0.1,
            return_sequences=False,
            kernel_initializer='ones',
            bias_initializer='zeros')
    )(x)
    
    
    x = L.Dense(10, activation='linear')(x)
    x = L.Dense(1, activation='linear')(x)
    
    model = tf.keras.Model(z, x)
    model.compile(optimizer='adam')
    return model

然后我进行培训:

callback_lr = C.ReduceLROnPlateau(
                monitor='val_loss',
                patience=3,
                verbose=0,
                mode='min')

checkpoint = C.ModelCheckpoint(
                filepath='best_pool.h5',
                save_best_only=True,     
                monitor='val_loss', 
                mode='min')

model = make_model_lstm_pooling()
model.summary()
history = model.fit(
            X_train, Y_train,
            validation_data=(X_dev, Y_dev),
            epochs=100,
            callbacks=[checkpoint, callback_lr]
                   )

整个错误是这个:

ValueError:没有为任何变量提供梯度:['bidirectional_16/forward_lstm_50/lstm_cell_83/kernel:0'、'bidirectional_16/forward_lstm_50/lstm_cell_83/recurrent_kernel:0'、'bidirectional_16/forward_lstm_50/lstm_cell_83/bias:0'、'bidirectional_16/backward_lstm_50 /lstm_cell_84/kernel:0'、'bidirectional_16/backward_lstm_50/lstm_cell_84/recurrent_kernel:0'、'bidirectional_16/backward_lstm_50/lstm_cell_84/bias:0'、'dense_90/kernel:0'、'dense_90/bias:0'、'dense_91 /内核:0','dense_91/bias:0']。

我在运行时遇到问题fit

我看到使用错误类型时会出现问题:我float在输入和int标签中有类型。我在输入中没有 nan。

我在错误中看到与内核初始化程序有关的问题,默认为glorot_uniform,如果我没记错的话,在我看来它不是零。

我试图改变kernel_initializer但没有改善。

别的东西:我对几个样本进行了测试,在我的测试中,我的样本比特征少。有谁知道问题是否与此有关?

任何帮助将不胜感激。

1个回答

我找到了解决我的问题的方法。

首先,我必须在编译模型时声明损失:

model.compile(
    optimizer='adam', 
    loss='mean_absolute_error', 
    metrics=['mean_absolute_error']
)

除此之外,我更改了检查点的监视器:

import tensorflow.keras.callbacks as C

checkpoint = C.ModelCheckpoint(
                filepath='best_pool.h5',
                save_best_only=True,     
                monitor='val_mean_absolute_error', 
                mode='min')

在这种情况下,更换显示器会产生更好的效果。