如何改善我的CNN?高且恒定的验证错误

时间:2019-07-16 15:57:17

标签: python tensorflow regression conv-neural-network

我正在研究一个基于母牛图像来预测肥牛状况的分数的问题。 我应用了CNN来估计介于0-5之间的值(我拥有的数据集仅包含2.25和4之间的值) 我正在使用4个CNN层和3个隐藏层。

我实际上有2个问题: 1 /我得到了0.05的训练误差,但是在3-5个时期之后,验证误差仍然保持在0.33左右。 2 /我的神经网络预测的值在2.9到3.3之间,与数据集范围相比太窄了。正常吗?

如何改善我的模型?

model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(512, 424,1)),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Flatten(input_shape=(512, 424)),
    tf.keras.layers.Dense(256, activation=tf.nn.relu),
    tf.keras.layers.Dense(128, activation=tf.nn.relu),
    tf.keras.layers.Dense(64, activation=tf.nn.relu),
    tf.keras.layers.Dense(1, activation='linear')
])

学习曲线:

Learning Curve

预测:

Prediction

1 个答案:

答案 0 :(得分:6)

这似乎是过度拟合的情况。你可以

    通过使用Shuffle中的Data
  1. shuffle=True cnn_model.fit。代码如下所示:

    history = cnn_model.fit(x = X_train_reshaped, y = y_train, batch_size = 512, epochs = epochs, callbacks=[callback], verbose = 1, validation_data = (X_test_reshaped, y_test), validation_steps = 10, steps_per_epoch=steps_per_epoch, shuffle = True)

  2. 使用Early Stopping。代码如下所示

    callback = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=15)

  3. 使用正则化。正则化代码如下所示(您也可以尝试l1正则化或l1_l2正则化):

from tensorflow.keras.regularizers import l2

Regularizer = l2(0.001)

cnn_model.add(Conv2D(64,3, 3, input_shape = (28,28,1), activation='relu', data_format='channels_last', activity_regularizer=Regularizer, kernel_regularizer=Regularizer))

cnn_model.add(Dense(units = 10, activation = 'sigmoid', activity_regularizer=Regularizer, kernel_regularizer=Regularizer))

  1. 您可以尝试使用BatchNormalization

  2. 使用ImageDataGenerator执行图像数据增强。有关更多信息,请参考this link

  3. 如果像素不是Normalized,则将像素值除以255也很有帮助。

  4. 最后,如果仍然没有更改,则可以尝试使用Pre-Trained ModelsResNet之类的VGG Net,等等。