Tensorflow 提高CNN模型性能的技巧

Tensorflow 提高CNN模型性能的技巧,tensorflow,keras,deep-learning,conv-neural-network,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=(

我在训练数据上安装了一个大型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 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

注意:I
Adam
'的默认学习率
0.001
以及
0.003
但输出相同(log)。

您的模型正在工作,但改进非常缓慢。我会先将退出值降低到.1,然后运行模型,看看它是否过拟合。如果过拟合,然后慢慢增加退出率。除非您的数据已经被洗牌,否则我将在model.fit中设置shuffle=True。您还可以尝试使用GlobalMapooling层替换展平层。我还建议使用EarlyStopping回调,该回调监视验证,并在连续几次“耐心”之后,如果损失未能减少,则停止训练。设置restore_best_weights=True将加载验证损失最低的历元的权重,因此您不必保存然后重新加载权重。将epoch设置为一个较大的数字,以确保此回调激活。还可以使用ReducelRon平台根据验证损失自动调整学习速率。 我使用的代码如下所示

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,以便触发早期停止回调。

在这种情况下,我们要做的第一件事就是删除退出层;默认情况下,几乎不应该使用辍学,只有当(并且如果)我们有过度适应的迹象时才使用。太好了!这真的很有帮助。只是好奇地问一下。
globalxpooling
是否正在执行
plant
层的工作?由于shapeyes中的输入是
(示例,1100,4)
,因此它将输入减少为一维张量