提高 CNN 模型性能的技巧

时间:2021-03-08 12:57:22

标签: tensorflow keras deep-learning conv-neural-network

我在我的训练数据上拟合了一个大型 CNN 网络,验证了 20%。看起来该模型在训练集上的表现要好于验证集。您有什么建议以便我提高模型性能。

CNN 架构:

model = Sequential()
activ = 'relu'
model.add(Conv2D(32, (1, 3), strides=(1, 1), padding='same', activation=activ, input_shape=(1, 100, 4)))
model.add(Conv2D(32, (1, 3), strides=(1, 1), padding='same', activation=activ))
#model.add(BatchNormalization(axis = 3))
model.add(MaxPooling2D(pool_size=(1, 2) ))

model.add(Conv2D(64, (1, 3), strides=(1, 1), padding='same', activation=activ))
model.add(Conv2D(64, (1, 3), strides=(1, 1), padding='same', activation=activ))
model.add(MaxPooling2D(pool_size=(1, 2)))

model.add(Conv2D(128, (1, 3), strides=(1, 1), padding='same', activation=activ))
model.add(Conv2D(128, (1, 3), strides=(1, 1), padding='same', activation=activ ))
model.add(MaxPooling2D(pool_size=(1, 2)))
model.add(Dropout(.5))

model.add(Flatten())
A = model.output_shape
model.add(Dense(int(A[1] * 1/4.), activation=activ))
model.add(Dropout(.5))

model.add(Dense(5, activation='softmax'))

optimizer = Adam(lr=0.003, beta_1=0.9, beta_2=0.999, epsilon=1e-04, decay=0.0)
model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy'])

model.fit(x_train, y_train, epochs=100, batch_size=64, shuffle=False,
                          validation_split=0.2)

然而,验证准确率不会随着 epoch 的数量而改变。

Epoch 1/100
1065/1065 [==============================] - 14s 13ms/step - loss: 1.4174 - accuracy: 0.5945 - val_loss: 1.4966 - val_accuracy: 0.4417
Epoch 2/100
1065/1065 [==============================] - 14s 13ms/step - loss: 1.1494 - accuracy: 0.6207 - val_loss: 1.4634 - val_accuracy: 0.4417
Epoch 3/100
1065/1065 [==============================] - 19s 18ms/step - loss: 1.1111 - accuracy: 0.6196 - val_loss: 1.4674 - val_accuracy: 0.4417
Epoch 4/100
1065/1065 [==============================] - 15s 14ms/step - loss: 1.1040 - accuracy: 0.6196 - val_loss: 1.4660 - val_accuracy: 0.4417
Epoch 5/100
1065/1065 [==============================] - 18s 17ms/step - loss: 1.1027 - accuracy: 0.6196 - val_loss: 1.4624 - val_accuracy: 0.4417

注意:我 Adam 的默认学习率 0.0010.003 但输出相同(日志)。

1 个答案:

答案 0 :(得分:1)

您的模型正在运行,但改进非常缓慢。我最初会将 dropout 值降低到 0.1,然后运行模型并查看它是否过拟合。如果确实如此,则慢慢增加 dropout 率。除非你的数据已经被洗牌,否则我会在 model.fit 中设置 shuffle=True。您也可以尝试用 GlobalMaxPooling 层替换 Flatten 层。我还建议使用 EarlyStopping 回调,它会监视验证并在连续 epoch 的“耐心”数量后损失未能减少时停止训练。设置 restore_best_weights=True 将加载具有最低验证损失的时代的权重,因此您不必保存然后重新加载权重。将 epochs 设置为一个较大的数字以确保此回调激活。还可以使用 ReduceLROnPlateau 根据验证损失自动调整学习率。 我使用的代码如下所示

es=tf.keras.callbacks.EarlyStopping( monitor="val_loss", patience=3,
                                     verbose=1,  restore_best_weights=True)
rlronp=tf.keras.callbacks.ReduceLROnPlateau( monitor="val_loss", factor=0.5, patience=1,
                                             verbose=1)
callbacks=[es, rlronp]

在 model.fit 中设置 callbacks=callbacks。将您运行的 epoch 数增加到 100,以便触发提前停止回调。