我正在研究一个问题,根据奶牛的图像来预测奶牛的肥胖程度。 我用CNN来估计0-5之间的值(我的数据集只包含2.25到4之间的值) 我使用4个CNN层和3个隐藏层。在
我实际上有两个问题: 1/我得到了0.05的训练误差,但经过3-5个周期后,验证误差仍保持在0.33左右。 2/my NN预测的值介于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
通过在cnn_model.fit
中使用shuffle=True
,将Data
连接起来。代码如下: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)
使用正则化。正则化的代码如下所示(您也可以尝试l1正则化或l1\u 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))
您可以尝试使用
BatchNormalization
。使用
ImageDataGenerator
执行图像数据扩充。请参考this link以了解更多信息。如果像素不是
Normalized
,用255
分割像素值也有帮助。最后,如果仍然没有变化,可以尝试使用},等等。。
Pre-Trained Models
,比如ResNet
或{相关问题 更多 >
编程相关推荐