我在尝试提高CNN的准确率和降低损失时遇到了麻烦。
以下是一些初始参数:
batch_size = 32image_shape = 150 # 输入大小调整为150x150EPOCHS = 250STEPS_PER_EPOCH = 7IMAGES_IN_CLASS_FOLDERS > 100
我使用了相同的图片作为训练集和验证集,但我对训练图片进行了预处理,以确保验证图片与训练图片不同,如下所示:
# 图像格式化 - 将图像预处理成浮点张量后输入网络 # 训练数据生成器 - 重新缩放图像,水平翻转图像,旋转图像 train_image_generator = ImageDataGenerator(rescale=1./255, horizontal_flip=True, rotation_range=45) # 验证数据生成器 - 重新缩放图像 validation_image_generator = ImageDataGenerator(rescale=1./255) # 应用缩放和调整大小 train_data_gen = train_image_generator.flow_from_directory(batch_size=batch_size, directory=training_Images, shuffle=True, target_size=(image_shape,image_shape), #(100,100) class_mode='categorical') val_data_gen = validation_image_generator.flow_from_directory(batch_size=batch_size, directory=validate_Images, shuffle=True , target_size=(image_shape, image_shape), class_mode='categorical')
此外,我使用了一个Sequential模型,我尝试了各种参数,比如输入CONV2D(32) -> CONV2D(64) -> CONV2D(128)
,但目前测试的这个模型没有成功:
# 定义我们的模型 model = tf.keras.models.Sequential([ # 旧方法 # tf.keras.layers.Conv2D(8 , (2,2) , activation='LeakyReLU', input_shape=(image_shape, image_shape, 3)), tf.keras.layers.Conv2D(16, (2,2) , activation='LeakyReLU'), tf.keras.layers.Conv2D(32, (2,2) , activation='LeakyReLU'), tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Conv2D(40, (2,2) , activation='LeakyReLU'), tf.keras.layers.Conv2D(56, (2,2) , activation='LeakyReLU'), tf.keras.layers.Conv2D(64, (2,2) , activation='LeakyReLU'), tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Conv2D(96, (2,2) , activation='LeakyReLU'), tf.keras.layers.Conv2D(128, (2,2), activation='LeakyReLU'), tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Flatten(), tf.keras.layers.Dense(16, activation='softmax'), #tf.keras.layers.Dense(128, activation='relu'), #tf.keras.layers.Dense(512, activation='relu'), tf.keras.layers.Dense(120) # 旧方法结束 # ])
我尝试了各种CONV2D
层和不同的激活方法。以下是模型编译的代码:
model.compile(optimizer=SGD(lr=0.01), loss=tf.keras.losses.CategoricalCrossentropy(), metrics=['accuracy'])
我使用了SGD优化器
,也尝试过ADAM
,但结果相似。损失
随时间减少,但似乎达到某个值范围后就停滞不前,准确率
也没有增加。
模型训练代码如下:
history = model.fit( train_data_gen, steps_per_epoch= stepForEpoch, epochs=EPOCHS, validation_data=val_data_gen, validation_steps=stepForEpoch )
谁能提供一些建议或指导我如何进一步提高准确率和减少损失?谢谢!
最终更新截至2021年6月23日,我的模型有了显著的改进,不仅是通过增加更多的EPOCHS,还有更多的STEPS_PER_EPOCH:
通过将数据集中的图像数量按以下方式划分(IMAGES_IN_DATASET(20700) / BATCH_SIZE(32) = 677 STEPS_PER_EPOCH),并选择100个EPOCHS进行测试,我得到了准确率增加了10%,损失持续减少,MSE也有所改善的结果。
ACCURACY_INCREASE = %10MSE_IMPROVEMENT = -0.0004ACCURACY_LOSS_IMPROVEMENT = -1.1
感谢用户@Reda El Hail@Dr. Snoopy
回答:
总结评论中的讨论,错误来自最后一层,其中没有设置激活函数tf.keras.layers.Dense(120)
。
对于分类任务,应该是tf.keras.layers.Dense(120, activation = 'softmax')
。
正如@Snoopy所说:在隐藏层中使用softmax
是没有意义的。它应该只在输出层使用。