我正在开发一个卷积神经网络(CNN)模型,用于预测患者属于第1、2或3类。我使用TensorFlow上的Keras进行开发。
我有一个包含145名神经心理学受试者的数据集,这些受试者被分为三类(1=正常,2=……,3=认知障碍)。每个患者的数据集中包含90组同时拍摄的MRI扫描图像,每个MRI文件夹内包含这些图像。总数据集包含145个病例,每个病例的子文件夹中包含90张MRI图像。
我已经学会了如何处理基本的“猫狗-CNN分类器”,因为我只需将所有的猫和狗图像放入一个文件夹中来训练网络,这与我的情况不同。但是,我该如何处理我的神经心理学受试者数据集,并在训练后一次性使用每个受试者的所有图像进行预测呢?
我查看了类似的提问,但答案不够清晰,且在应用后不起作用。使用多个文件夹和子文件夹训练CNN模型
谢谢,请建议一些我可以使用的算法。
回答:
如果你确定要一次性从一个受试者的所有图像中学习,你的输入形状需要包括图像数量作为一个维度,像这样:
(num_of_images, x_pix, y_pix, channels)
例如,如果你将扫描图像缩小到256*256的RGB图像,那么你的形状将是:(90,256,256,3)
这是一个相当大的输入需要处理,我建议你将其分成更小的组,只使用扫描图像的一个子集,比如(10,256,256,3)
很可能你无法将所有图像预处理到内存中来解决这个问题,你应该使用生成器作为输入,尝试这个模板:
from tensorflow.keras.utils import Sequenceimport numpy as npclass Custom_Generator(Sequence): #初始化生成器 def __init__(self, file_sets, label, batch_size) : self.file_sets = file_sets self.label = label self.batch_size = batch_size #返回这个生成器将返回的数据批次数量 def __len__(self) : return (np.ceil(len(self.file_sets) / float(self.batch_size))).astype(np.int) #返回一个批次 def __getitem__(self, idx) : #在这里执行你需要的所有操作来加载和预处理你的数据 return x, y
为你的训练和验证集制作一个生成器,并在调用model.fit()时使用它
或者查看https://www.tensorflow.org/api_docs/python/tf/data/Dataset
如这里所使用https://www.tensorflow.org/tutorials/images/segmentation
对于模型本身,从你见过的教程中的简单CNN开始,整理好你的预处理流程,然后看看你的模型得分。如果你仍然需要改进,可以尝试这些之一:https://keras.io/api/applications/