tensorflow - 训练损失为 Nan - 但训练数据均在范围内且不为空

标签 tensorflow machine-learning keras deep-learning lstm

当我执行 model.fit(x_train_lstm, y_train_lstm, epochs=3, shuffle=False, verbose=2)

作为nan,我总是会失败:

Epoch 1/3
73/73 - 5s - loss: nan - accuracy: 0.5417 - 5s/epoch - 73ms/step
Epoch 2/3
73/73 - 5s - loss: nan - accuracy: 0.5417 - 5s/epoch - 74ms/step
Epoch 3/3
73/73 - 5s - loss: nan - accuracy: 0.5417 - 5s/epoch - 73ms/step

我的 x_training 的形状为 (2475, 48),y_train 的形状为 (2475,)

  • 我在 (2315, 160, 48) 中导出输入训练集,因此有 2315 组训练数据,160 组作为我的环回时间窗口,48 个特征
  • 相应地,y_train为0或1,形状为(2315, 1)

全部在(-1,1)范围内: Overview of training data

我的模型是这样的:

Model: "sequential_2"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 lstm_6 (LSTM)               (None, 160, 128)          90624     
                                                                 
 dropout_4 (Dropout)         (None, 160, 128)          0         
                                                                 
 lstm_7 (LSTM)               (None, 160, 64)           49408     
                                                                 
 dropout_5 (Dropout)         (None, 160, 64)           0         
                                                                 
 lstm_8 (LSTM)               (None, 32)                12416     
                                                                 
 dense_2 (Dense)             (None, 1)                 33        
                                                                 
=================================================================
Total params: 152,481
Trainable params: 152,481
Non-trainable params: 0
  • 我尝试了不同的 LSTM 单元:48、60、128、160,但都不起作用
  • 我检查了我的训练数据,它们都在 (-1,1) 范围内
  • 我的数据集中没有“null”,x_train.isnull().values.any() 输出 False

现在我不知道哪里可以尝试更多~

我的模型代码是:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM
from tensorflow.keras.layers import Dropout

def create_model(win = 100, features = 9):
    model = Sequential()
    model.add(LSTM(units=128, activation='relu', input_shape=(win, features),
        return_sequences=True))
    model.add(Dropout(0.1))
    model.add(LSTM(units=64, activation='relu', return_sequences=True))
    model.add(Dropout(0.2))

    # no need return sequences from 'the last layer'
    model.add(LSTM(units=32))

    # adding the output layer
    model.add(Dense(units=1, activation='sigmoid'))

    # may also try mean_squared_error
    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
    return model

这里我绘制了一些 train_y 样本: y_train is 0 or 1 labels

最佳答案

有两件事:尝试规范化时间序列数据并使用 relu 作为 lstm 层的激活函数不是“传统”的。检查这个post以获得进一步的见解。一个例子:

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

layer = tf.keras.layers.Normalization(axis=-1)
x = tf.random.normal((500, 100, 9))
y = tf.random.uniform((500, ), dtype=tf.int32, maxval=2)
layer.adapt(x)

def create_model(win = 100, features = 9):
    model = Sequential()
    model.add(layer)
    model.add(LSTM(units=128, activation='tanh', input_shape=(win, features),
        return_sequences=True))
    model.add(Dropout(0.1))
    model.add(LSTM(units=64, activation='tanh', return_sequences=True))
    model.add(Dropout(0.2))

    model.add(LSTM(units=32))

    model.add(Dense(units=1, activation='sigmoid'))

    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
    return model

model = create_model()

model.fit(x, y, epochs=20)

关于tensorflow - 训练损失为 Nan - 但训练数据均在范围内且不为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71494820/

相关文章:

python - Tensorflow 条件抛出值错误

machine-learning - 自定义梯度提升分类器实现。训练无进展

python - 输出Keras中add_loss添加的多重loss

python - 如何为 seq2seq 模型准备数据?

python - tensorflow:注册 numpy bfloat16 扩展

python - Tensorflow神经网络恢复后预测不同的值

python - AttributeError : module 'tensorflow' has no attribute 'compat' when loading tf. compat.v1.train.SessionRunHook

python - NiftyNet:索引超出范围错误

python - scikit 学习 : update countvectorizer after selecting k best features

python - 尝试将预测带回到数据帧中的相应行