良好的训练/验证准确性,但测试准确性较差

如何解决良好的训练/验证准确性,但测试准确性较差

我已经使用VGG16预训练模型训练了一个模型,以将4种类型的眼部疾病分类。我是机器学习的新手,所以不知道从结果中得出什么。 在对90,000张图像进行约6个小时的训练后:

  • 训练精度不断提高,同时损失也不断增加(从大约2降低到0.8最终达到88%的精度)

  • 验证损失持续在每个时期1-2之间波动(准确性确实提高到85%) (我不小心重新运行了单元,所以看不到输出)

查看混乱矩阵后,看来我的测试表现不佳

Image_height = 196
Image_width = 300
val_split = 0.2
batches_size = 10
lr = 0.0001
spe = 512
vs = 32
epoch = 10

#Creating batches
#Creating batches
train_batches = ImageDataGenerator(preprocessing_function=tf.keras.applications.vgg16.preprocess_input,validation_split=val_split) \
    .flow_from_directory(directory=train_folder,target_size=(Image_height,Image_width),classes=['CNV','DME','DRUSEN','NORMAL'],batch_size=batches_size,class_mode="categorical",subset="training")
validation_batches = ImageDataGenerator(preprocessing_function=tf.keras.applications.vgg16.preprocess_input,subset="validation")
test_batches = ImageDataGenerator(preprocessing_function=tf.keras.applications.vgg16.preprocess_input) \
                       .flow_from_directory(test_folder,class_mode="categorical")

#Function to create model. We will be using a pretrained model
def create():
  vgg16_model = keras.applications.vgg16.VGG16(input_tensor=Input(shape=(Image_height,Image_width,3)),input_shape=(Image_height,3),include_top = False)
  model = Sequential()
  model.add(vgg16_model)
  for layer in model.layers:
    layer.trainable = False
  model.add(Flatten())
  model.add(Dense(4,activation='softmax'))
  return model

model = create()
model.compile(Adam(lr=lr),loss="categorical_crossentropy",metrics=['accuracy'])

model.fit(train_batches,steps_per_epoch=spe,validation_data=validation_batches,validation_steps=vs,epochs=epoch)

enter image description here

关于我可以改进的任何建议,以免混淆矩阵的效果不佳?如果可能的话,还可以保存更多的模型来保存模型。

解决方法

除了最后一层外,您不训练其他任何层。 您需要将训练功能设置为最后几层或添加更多层。

添加

tf.keras.applications.VGG16(... weights='imagenet'... )

在您的代码中,权重没有预先设置在任何集合上。

此处说明了可用的选项:

https://www.tensorflow.org/api_docs/python/tf/keras/applications/VGG16

,

许多问题和建议。您正在使用VGG16模型。该模型具有超过4000万个可训练参数。在90,000张图像的数据集上,您的训练时间将非常长。因此,我建议您考虑使用MobileNet模型。它仅具有400万个可训练参数,并且实质上与VGG16一样精确。接下来是文档[此处。] [1],无论使用哪种模型,都应将初始权重设置为imagenet权重。您的模型将开始在图像上进行训练。我发现通过使模型中的所有层都可训练,可以获得更好的结果。现在您说您的模型达到了88%的准确性。我认为那不是很好。我相信您至少需要达到95%。您可以通过调整学习率来做到这一点。 keras回调ReduceLROnPlateau使此操作变得容易。文档在[here。] [2]进行设置,以监视验证丢失并降低学习率(如果在连续时期内学习率下降的话)。接下来,您要保存验证损失最少的模型,然后使用该模型进行预测。可以设置Keras回调ModelCheckpoint来监视验证损失,并以最低的损失保存模型。文档在[here。] [3]中。 下面的代码显示了如何为您的问题实现MobileNet模型并定义回调。您还必须更改生成器以使用Mobilenet预处理并将目标大小设置为(224,224)。另外,我相信您在预处理功能周围缺少(),希望对您有所帮助。

mobile = tf.keras.applications.mobilenet.MobileNet( include_top=False,input_shape=(224,224,3),pooling='max',weights='imagenet',alpha=1,depth_multiplier=1,dropout=.5)                                                          
x=mobile.layers[-1].output
x=keras.layers.BatchNormalization(axis=-1,momentum=0.99,epsilon=0.001 )(x)
predictions=Dense (4,activation='softmax')(x)
model = Model(inputs=mobile.input,outputs=predictions)    
for layer in model.layers:
    layer.trainable=True
model.compile(Adamax(lr=lr),loss='categorical_crossentropy',metrics=['accuracy'])
checkpoint=tf.keras.callbacks.ModelCheckpoint(filepath=save_loc,monitor='val_loss',verbose=0,save_best_only=True,save_weights_only=False,mode='auto',save_freq='epoch',options=None)
lr_adjust=tf.keras.callbacks.ReduceLROnPlateau( monitor="val_loss",factor=0.5,patience=1,mode="auto",min_delta=0.00001,cooldown=0,min_lr=0) 
callbacks=[checkpoint,lr_adjust]


  [1]: http://httphttps://keras.io/api/applications/mobilenet/s://
  [2]: https://keras.io/api/callbacks/reduce_lr_on_plateau/
  [3]: https://keras.io/api/callbacks/model_checkpoint/
,

在向模型添加层时,您必须删除模型的最后一个密集层,因为您的模型有四个类,但 vgg16 有 1000 个类,因此您必须删除最后一个密集层,然后添加您自己的密集层:

def create():
    vgg16_model = keras.applications.vgg16.VGG16(input_tensor=Input(shape=(Image_height,Image_width,3)),input_shape=(Image_height,include_top = False)

    model = Sequential()
    for layer in vgg16_model.layers[:-1]:
        model.add(layer)
    model.summary()

    for layer in model.layers:
        layer.trainable = False
    model.add(Flatten())
    model.add(Dense(4,activation='softmax'))

    return model

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-