提高 CNN 模型性能的技巧

Tricks to improve CNN model performance

我在我的训练数据上拟合了一个大型 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.001 以及 0.003 但输出是相同的(对数)。

您的模型正在运行,但改进非常缓慢。我最初会将 dropout 值降低到 .1,然后 运行 模型并查看它是否过度拟合或 not.If 然后它会慢慢增加 dropout 率。除非您的数据已经洗牌,否则我会在 model.fit 中设置 shuffle=True。您也可以尝试用 GlobalMaxPooling 层替换 Flatten 层。我还建议使用 EarlyStopping 回调来监控验证并在连续 'patience' 次后损失未能减少时停止训练。设置 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。增加你 运行 说 100 的纪元数,以便提前停止回调触发。