我正在尝试训练用于分类的神经网络。目标标签为 -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 个过去的值),在尝试拟合模型时,我发现 accuracy
和 val_accuracy
几乎在 100 个时期内都为 0 .有时我会看到 accuracy
中的一些变化(有时甚至在 val_accuracy
中),但它会回到 0。
我也在使用 EarlyStopping
和 ModelCheckpoint
(我知道将 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
如您所见,尽管 loss
和 val_loss
正在发生变化,但准确率和 val_accuracy 都停留在 0。通常,accuracy
和 val_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
并且还注意到 loss
和 val_loss
往往会变大。
我的问题是:为什么我在 accuracy
和 val_accuracy
中没有看到任何变化(或者非常小的和困难的变化),我可以做些什么来纠正/改进这一点?模型有问题吗?我还使用 MinMaxScaler(feature_range=(0,1))