使用任何CNN模型包括VGG16进行二进制分类时,验证精度均达到50%

如何解决使用任何CNN模型包括VGG16进行二进制分类时,验证精度均达到50%

我是CNN的新手,我遇到了二进制分类问题,验证准确度为50%。

为便于记录,我正在尝试将脑部扫描的MRI归类为阿尔茨海默氏病和健康对照。
默认情况下,图片为黑色和白色.png格式的图片为250x250px,我总共大约有1000张图片。
我尝试创建自己的模型并实现VGG16,所有这些都使验证精度达到了50%左右。

我开始认为这可能是数据处理不正确的问题,但是由于不确定,因此我不确定。也许与黑白图像被解释为RGB有关吗?但老实说,我不确定。

将感谢任何有兴趣的人,谢谢!


import tensorflow as tf
from keras.layers.convolutional import Convolution2D
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Activation,Dense,Flatten,BatchNormalization,Conv2D,MaxPool2D,Dropout
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import os
import warnings
import matplotlib.pyplot as plt
from tensorflow.python.keras.applications.vgg16 import VGG16
from tensorflow.python.keras.layers import ZeroPadding2D,MaxPooling2D

warnings.simplefilter(action='ignore',category=FutureWarning)

os.chdir('C:/Users/dancu/PycharmProjects/firstCNN/data/ad-vs-cn')

physical_devices = tf.config.experimental.list_physical_devices('GPU')
print("Num GPUs Available: ",len(physical_devices))
tf.config.experimental.set_memory_growth(physical_devices[0],True)

# Define paths for image data
train_path = "C:/Users/dancu/PycharmProjects/firstCNN\data/ad-vs-cn/train"
test_path = "C:/Users/dancu/PycharmProjects/firstCNN\data/ad-vs-cn/test"
valid_path = "C:/Users/dancu/PycharmProjects/firstCNN\data/ad-vs-cn/valid"

# Use ImageDataGenerator to create 3 lots of batches
train_batches = ImageDataGenerator(
    rescale=1/255).flow_from_directory(directory=train_path,target_size=(64,64),classes=['cn','ad'],batch_size=20,color_mode="rgb")
valid_batches = ImageDataGenerator(
    rescale=1/255).flow_from_directory(directory=valid_path,color_mode="rgb")
test_batches = ImageDataGenerator(
    rescale=1/255).flow_from_directory(directory=test_path,target_size=(256,240),batch_size=10,color_mode="rgb")

imgs,labels = next(train_batches)

# Test to see normalisation has occurred properly
print(imgs[1][16])
print(labels)

# Define method to plot MRIs
def plotImages(images_arr):
    fig,axes = plt.subplots(1,10,figsize=(20,20))
    axes = axes.flatten()
    for img,ax in zip( images_arr,axes):
        ax.imshow(img)
        ax.axis('off')
    plt.tight_layout()
    plt.show()

# Plot a sample of MRIs
plotImages(imgs)

# Define the model
# VGG16
model = Sequential()
model.add(Conv2D(input_shape=(64,64,3),filters=64,kernel_size=(3,padding="same",activation="relu"))
model.add(Conv2D(filters=64,activation="relu"))
model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))
model.add(Conv2D(filters=128,activation="relu"))
model.add(Conv2D(filters=128,2)))
model.add(Conv2D(filters=256,activation="relu"))
model.add(Conv2D(filters=256,2)))
model.add(Conv2D(filters=512,activation="relu"))
model.add(Conv2D(filters=512,2)))
model.add(Flatten())
model.add(Dense(units=4096,activation="relu"))
model.add(Dense(units=4096,activation="relu"))
model.add(Dense(units=2,activation="softmax"))

# This model hits around 70% train acc,50% val acc
# model = Sequential([
#     Conv2D(filters=32,activation='relu',padding = 'same',input_shape=(64,3)),#     MaxPool2D(pool_size=(2,strides=2),#     Dropout(0.2),#   #  BatchNormalization(),#     Conv2D(filters=64,padding='same'),#     Dropout(0.3),#    # BatchNormalization(),#     Conv2D(filters=128,#     Dropout(0.4),#     Flatten(),#     Dense(units=2,activation='softmax')
# ])

## This model hits around 68% training accuracy at it's peak
# base_model = Sequential([
#     Conv2D(filters=32,input_shape=(256,256,#     Dropout(0.1),activation='softmax')
# ])

# Summarise each layer of the model
print(model.summary())

# Compile and train the model
model.compile(optimizer=Adam(),loss='categorical_crossentropy',metrics=['accuracy'])
model.fit(x=train_batches,steps_per_epoch=len(train_batches),validation_data=valid_batches,validation_steps=len(valid_batches),epochs=35,verbose=1
)

编辑:到目前为止,感谢大家的答复,他们的见解都很深刻。 我认为我们得出的结论是,这种情况的样本量很小,而且这些图像很难使用2D CNN进行分类。明天,我将尝试使用原始的.nii文件将基本的3D CNN放在一起,看看是否可以提高准确性。

解决方法

重复所有图像3次以符合RGB 3通道。如有损失,请使用binary_crossentropy。在测试图像生成器中,您有(256,240),使其与您的训练大小相同。

也请尝试使用网络的原始大小(224x224)。

,

您只有2个类别:是和否。因此,我建议仅通过“ Sigmoid”激活来生成一个通道的输出,即网络的最后一层应该是:

Dense(units=1,activation='sigmoid')

然后使用“ binary_crossentropy”训练您的网络。首先使用简单的小型CNN。

,

在训练和验证生成器中,图像大小仅为64 X 64,而原始大小为250 X250。减少图像丢失的细节,网络可以从中学习。我建议您将这些值设置为224 X 224。 您有1000张图像,可能不足以获得较高的准确性。您可能想通过使用图像数据生成器中可用的扩充来扩充数据。文档为here.。在测试生成器中,应使图像大小与用于训练的大小相同。当您使用VGG16时,请确保将weights = imagenet设置为224 X224。您正在执行二进制分类,因此我建议顶层为Dense(units = 1,activation ='sigmoid')。然后,您可以测试输出是否高于或低于.5。编译模型时,请使用loss =“ binary_crossentropy”。还要设置top = False和pooling = max,然后添加密集层。我不使用Vgg16,因为它具有超过4000万个可训练的参数。如果您训练完整模型,则训练时间可能会很长。我更喜欢使用Mobilenet,它只有400万个参数,而且本质上也一样准确。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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-