【问题标题】:Tricks to improve CNN model performance提高 CNN 模型性能的技巧
【发布时间】:2021-06-06 08:40:05
【问题描述】:

我正在我的训练数据上拟合一个大型 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 但输出相同(日志)。

【问题讨论】:

  • 在这种情况下,我们要做的第一件事就是移除 dropout 层;默认情况下几乎不应该使用 dropout,只有当(并且如果)我们有过度拟合的迹象时。

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


【解决方案1】:

您的模型正在运行,但改进非常缓慢。我最初会将 dropout 值降低到 0.1,然后运行模型并查看它是否过拟合。如果确实如此,则慢慢增加 dropout 率。除非您的数据已经被洗牌,否则我会在 model.fit 中设置 shuffle=True。您也可以尝试将 Flatten 层替换为 GlobalMaxPooling 层。我还建议使用 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 中设置回调=回调。将运行的 epoch 数增加到 100,以便触发提前停止回调。

【讨论】:

  • 太棒了!这真的很有帮助。
  • 只是好奇地问。 GlobalMaxPooling 在这里做Flatten 层的工作吗?由于输入的形状是(sample, 1, 100, 4)
  • 是的,它将输入减少到一维张量
猜你喜欢
  • 2014-06-17
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多