为什么准确率和 val_accuracy 停留在 0 LSTM Keras 分类

时间:2021-02-21 18:55:41

标签: python-3.x tensorflow keras classification

我正在尝试训练用于分类的神经网络。目标标签为 -1 或 1。

神经网络如下:

def build_nn(window,n_features,lr = 0.001):
    _input = Input(shape = (window,n_features),name = 'input')
    x1 = LSTM(100, input_shape = (window,n_features), return_sequences = True,activation = 'relu')(_input)
    x2 = Dropout(0.5)(x1)
    x3 = LSTM(50 , return_sequences = False, activation = 'relu')(x2)
    x4 = Dropout(0.5)(x3)
    x5 = Dense(25,kernel_initializer = 'uniform', activation = 'relu')(x4)
    x6 = Dense(10,kernel_initializer = 'uniform', activation = 'relu')(x5)
    nn = Model(inputs = [_input],outputs = [x6])
    nn.compile(loss='binary_crossentropy',optimizer=Adam(lr = lr),metrics=['accuracy'])
    return nn

输入是窗口化的(通常是实际值加上 1-2 个过去的值),在尝试拟合模型时,我发现 accuracyval_accuracy 几乎在 100 个时期内都为 0 .有时我会看到 accuracy 中的一些变化(有时甚至在 val_accuracy 中),但它会回到 0。

我也在使用 EarlyStoppingModelCheckpoint(我知道将 patience 设置为 500 不会有什么区别,因为 epochs 的数量也是 500):< /p>

early_stopping = EarlyStopping(patience = 500,verbose = True,monitor='val_accuracy')
check_point = ModelCheckpoint('lstm_classifier.hdf5',verbose=1,save_best_only=True,monitor = 'val_accuracy')

这是模型摘要:

Model: "model_18"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input (InputLayer)           [(None, 2, 17)]           0         
_________________________________________________________________
lstm_38 (LSTM)               (None, 2, 100)            47200     
_________________________________________________________________
dropout_38 (Dropout)         (None, 2, 100)            0         
_________________________________________________________________
lstm_39 (LSTM)               (None, 50)                30200     
_________________________________________________________________
dropout_39 (Dropout)         (None, 50)                0         
_________________________________________________________________
dense_36 (Dense)             (None, 25)                1275      
_________________________________________________________________
dense_37 (Dense)             (None, 10)                260       
=================================================================
Total params: 78,935
Trainable params: 78,935
Non-trainable params: 0
_________________________________________________________________

这是尝试拟合模型时的输出示例。

Epoch 1/500
148/148 [==============================] - 10s 32ms/step - loss: 0.5422 - accuracy: 0.0000e+00 - val_loss: 0.2783 - val_accuracy: 0.0000e+00

Epoch 00001: val_accuracy improved from -inf to 0.00000, saving model to lstm_classifier.hdf5
Epoch 2/500
148/148 [==============================] - 4s 29ms/step - loss: 0.4661 - accuracy: 0.0000e+00 - val_loss: 0.2778 - val_accuracy: 0.0000e+00

Epoch 00002: val_accuracy did not improve from 0.00000
Epoch 3/500
148/148 [==============================] - 4s 24ms/step - loss: 0.4656 - accuracy: 0.0000e+00 - val_loss: 0.2772 - val_accuracy: 0.0000e+00

Epoch 00003: val_accuracy did not improve from 0.00000
Epoch 4/500
148/148 [==============================] - 4s 26ms/step - loss: 0.4631 - accuracy: 0.0000e+00 - val_loss: 0.2766 - val_accuracy: 0.0000e+00

Epoch 00004: val_accuracy did not improve from 0.00000
Epoch 5/500
148/148 [==============================] - 4s 29ms/step - loss: 0.4628 - accuracy: 0.0000e+00 - val_loss: 0.2763 - val_accuracy: 0.0000e+00

Epoch 00005: val_accuracy did not improve from 0.00000
Epoch 6/500
148/148 [==============================] - 5s 31ms/step - loss: 0.4608 - accuracy: 0.0000e+00 - val_loss: 0.2759 - val_accuracy: 0.0000e+00

Epoch 00006: val_accuracy did not improve from 0.00000
Epoch 7/500
148/148 [==============================] - 4s 25ms/step - loss: 0.4622 - accuracy: 0.0000e+00 - val_loss: 0.2754 - val_accuracy: 0.0000e+00

Epoch 00007: val_accuracy did not improve from 0.00000
Epoch 8/500
148/148 [==============================] - 4s 30ms/step - loss: 0.4583 - accuracy: 0.0000e+00 - val_loss: 0.2749 - val_accuracy: 0.0000e+00

Epoch 00008: val_accuracy did not improve from 0.00000
Epoch 9/500
148/148 [==============================] - 4s 30ms/step - loss: 0.4596 - accuracy: 0.0000e+00 - val_loss: 0.2748 - val_accuracy: 0.0000e+00

Epoch 00009: val_accuracy did not improve from 0.00000
Epoch 10/500
148/148 [==============================] - 4s 26ms/step - loss: 0.4570 - accuracy: 0.0000e+00 - val_loss: 0.2740 - val_accuracy: 0.0000e+00

Epoch 00010: val_accuracy did not improve from 0.00000
Epoch 11/500
148/148 [==============================] - 4s 27ms/step - loss: 0.4569 - accuracy: 0.0000e+00 - val_loss: 0.2921 - val_accuracy: 0.0000e+00

enter image description here

enter image description here

如您所见,尽管 lossval_loss 正在发生变化,但准确率和 val_accuracy 都停留在 0。通常,accuracyval_accuracy 都保持为 0。有时模型会找到更好的 val_accuracy,但随后又回到 0。

Epoch 00274: val_accuracy did not improve from 0.46822
    Epoch 275/500
    148/148 [==============================] - 4s 27ms/step - loss: 0.5844 - accuracy: 0.0000e+00 - val_loss: 0.3316 - val_accuracy: 0.0000e+00

并且还注意到 lossval_loss 往往会变大。

我的问题是:为什么我在 accuracyval_accuracy 中没有看到任何变化(或者非常小的和困难的变化),我可以做些什么来纠正/改进这一点?模型有问题吗?我还使用 MinMaxScaler(feature_range=(0,1))

扩展功能

0 个答案:

没有答案