我正在研究根据母牛的图像预测肥牛的得分的问题。我应用了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') ])
学习曲线:
预测:
这似乎是过度拟合的情况。您可以
Shuffle
Data
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)
Early Stopping
callback = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=15)
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))
您可以尝试使用BatchNormalization。
BatchNormalization
使用进行图像数据增强ImageDataGenerator。有关更多信息,请参考此链接。
ImageDataGenerator
如果像素不是Normalized,则用划分像素值255也有帮助。
Normalized
255
最后,如果仍然没有更改,则可以尝试使用Pre-Trained ModelslikeResNet或VGG Net等。
Pre-Trained Models
ResNet
VGG Net