优化Keras CNN

我在尝试提高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        )

谁能提供一些建议或指导我如何进一步提高准确率和减少损失?谢谢!

结果图片enter image description here

最终更新截至2021年6月23日,我的模型有了显著的改进,不仅是通过增加更多的EPOCHS,还有更多的STEPS_PER_EPOCH:

enter image description here

enter image description here

通过将数据集中的图像数量按以下方式划分(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是没有意义的。它应该只在输出层使用。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注