使用深度学习构建脑肿瘤分类器-600学习网
600学习网终身会员188,所有资源无秘无压缩-购买会员
介绍
深度学习经常出现在我们的日常生活中。在现代社会,我们的生活方式发生了各种变化,如自动驾驶汽车.谷歌助手.Netflix推荐.垃圾邮件检测等。我们使用深度学习模型通过MRI扫描检测脑肿瘤,并使用肺部X射线检测新冠肺炎。脑肿瘤是一种严重的疾病,每年记录的病例超过100万。
如果一个人有脑肿瘤,使用磁共振成像(MRI)扫描。脑肿瘤可以属于任何类别。对这数百万人进行MRI检查以确定一个人是否患有这种疾病可能是一项困难的任务。如果是,他的类别是什么。这就是深度学习模式发挥重要作用的地方。它可以使用神经网络提供患者大脑的MRI图像,以确定患者是否患有脑肿瘤。
我们将使用CNN(卷积神经网络)构建一个脑肿瘤分类器,该分类器因其高精度而广泛应用于图像分类。我们将使用的编程语言是python。
数据集概述
我们使用的是一个脑肿瘤图像分类器数据集,它包含7022幅人脑MRI图像,分为训练集和测试集,分为四类:
胶质瘤
脑膜瘤
没有肿瘤
垂体的
这些图像的像素大小为512 x 512,每个图像都有一个固定的标签。
让我们导入帮助我们对这些图像进行分类的基本库。
导入库
我们将首先探索数据集并使用图像数据生成器ImageDataGenerator对其进行预处理。我们将导入Tensorflow。在TensorFlow中,我们将使用Keras库。
将熊猫导入为pd
将numpy导入为np
导入张量流
从张量流导入keras
将matplotlib.pyplot导入为plt
从keras.preprocessing.image导入ImageDataGenerator作为Imgen
图像增强
当我们使用任何图像数据集来训练我们的模型时,有时它可能无法为我们提供准确的结果,因为其中的图像可能需要一些预处理,例如缩放.增加亮度.改变灰度值等。
正如二进制数据需要一些数据清理和预处理一样,图像数据集也需要数据预处理。为此,本文使用Keras库中的图像数据生成器。
它通过实时数据增强生成批量张量图像数据,例如调整所有图像的大小,调整其高度和宽度,从而统一输入图像数据。
参数重新缩放:。默认值为”无”。否则,我们可以将数据乘以提供的值。
剪切_范围:剪切强度(逆时针剪切角,单位为度)
Zoom_range:随机缩放范围
Height_shift_range:总高度得分,如果<1
Width_shift_range:总宽度的分数,如果<1
Fill_mode:默认为”最近”。根据给定模式填充输入边界外的点。
Validation_split:保留用于验证的图像的一部分(介于0和1之间)。
#扩充培训数据集
traingen=Imgen(
重新缩放=1./255
剪切_范围=0.2
变焦范围=0.3
宽度_位移_范围=0.2
高度_位移_范围=0.2
填充_模式=”最接近”
验证_分割=0.15)
#扩充测试数据集
testgen=Imgen(#将图像重新缩放为1./255
重新缩放=1./255
)
现在,我们将获得目录的路径并生成批量增强数据。
trains=traingen.flow_来自_目录(“Training/”
目标_大小=(130130)
种子=123
批次_大小=16
子集=”训练”
)
valds=traingen.flow_from_directory(“Training”,target_size=(130130),seed=123,batch_size=16,subset=”validation”
)
testds=testgen.flow_from_directory(“Validation”,target_size=(130130),seed=123,batch_size=16,shuffle=False)
这里使用的一些参数是,
Target_size:整数元组(高度.宽度)。默认值为(512512)。将调整所有图像的大小。
最近:用于加扰和转换的可选随机种子。
Batch_size:数据批次的大小(默认值:32)。**子集**:数据子集(“训练”或”验证”)。
Shuffle:是否对数据进行加扰(默认值:True)如果设置为False,数据将按字母数字顺序排序。
在这一步中,我们将预处理的图像数据集分为训练集.验证集和测试集。我们的图像数据集划分为训练集和验证集的比例为80%-20%,验证数据集包含训练数据集的20%。在测试集方面,数据集本身分为训练集和测试集文件夹,因此无需明确划分测试集。
验证数据集在构建深度学习模型以验证我们在培训期间的模型性能方面非常重要。这个过程对于以后根据模型的性能调整模型非常重要。
确定数据集的类别:
c=列车等级指数
类=列表(c.keys())
类
我们将数据扩展为训练集.验证集和测试集,并确定了四类图像数据集。
现在让我们将图像可视化,这样我们就可以看到图像增强是如何执行的,我们还将使用我们的类来识别我们正在寻找的脑肿瘤类型。
x. y=next(trains)#函数返回迭代器中的下一项。
定义打印图像(x,y):
plt.figure(图=[15,11])#图的大小
对于范围(16)中的i:#16图像
plt.子地块(4,4,i+1)#4乘以4的地块
plt.imshow(x〔i〕)#imshow()是matplotlib的函数,显示图像
plt.title(classes〔np.argmax(y〔i〕)〕)#图像的类别将是它的标题
plt.轴(“关闭”)
plt.show()
现在我们将通过调用我们定义的函数来绘制图像。
#调用plotImages函数
打印图像(x,y)
它将给我们这样的输出,
现在,该项目最重要的一步是开始使用卷积神经网络创建深度学习模型。
构建深度学习模型
神经网络由于其准确姓和无需显式编程即可检测数据的能力,在几乎所有深度学习项目中得到广泛应用。根据项目需要使用不同类型的神经网络;例如,我们将使用人工神经网络(ANN)来处理整数数据。
CNN被广泛用于对图像数据进行分类。CNN的主要优点是,它可以自动检测任何图像中的重要特征,而无需人工监控。这可能就是为什么CNN将成为计算机视觉和图像分类问题的完美解决方案。因此,特征提取对于CNN来说非常重要。
执行的特征提取包括三个基本操作:
针对特定特征过滤图像(卷积)
在过滤图像中检测此功能(ReLU)
压缩图像以增强功能(最大化池)
让我们讨论一下CNN的每一个操作。
1.卷积
卷积层执行滤波步骤。ConvNet在训练过程中学习的权重主要包括在其卷积层中。这些层称为核。内核通过扫描图像并生成像素加权和来工作。
图像来源:
不同类型的核为每个图像产生不同的特征。
图像来源:
2.激活功能
这是神经网络最重要的部分。激活函数根据接收到的输入决定是否触发特定神经元,并将其传递给下一层。整流线姓单元或ReLU是最常用的激活功能,因为它易于实现,并克服了由其他激活功能(如Sigmaid)造成的许多其他障碍。
我们还在模型中使用Softmax激活函数,因为它用于对多类数据集进行分类。
3.最大化池化
最大池是一个卷积过程,其中内核提取其覆盖区域的最大值。像最大池一样,我们可以使用平均池。功能图中的ReLU(检测)功能最终会有许多”斯区”。我们希望压缩函数映射以仅保留函数本身最有用的部分。
要构建模型,我们首先导入
Conv2D(滤波器=16,内核大小=(3,3),填充=”相同”,激活=”relu”,输入形状=(130,130,3))
最大池2D((2,2))
#第二层
Conv2D(滤波器=32,内核大小=(3,3),填充=”相同”,激活=”相对”)
最大池2D((2,2))
滴液(0.20)
扁平()
致密(64,活化=’relu’)
致密(32,活化=’relu’)
致密(10,活化=’relu’)
致密(4,活化=”softmax”)
])
这里使用的一些基本术语是,
下拉层:该层用于任何隐藏层,但不用于输出层。该层主要用于防止模型过度拟合。
平面层:该层主要用于将多维输入转换为一维输出。
致密层:由每个神经网络连接的简单神经元层。
由于我们的输出将包括胶质瘤.脑膜瘤.无瘤和垂体,因此我们为输出层提供四个神经元。
下面是创建模型的模式。
cnn.summary()
型号:”顺序”
______________________________________
层(类型)输出形状参数#
======================================
conv2d(conv2d)(无,130,130,16)448
max _ pooling2d(MaxPooling2D(无,65,65,16)0
)
conv2d_1(conv2d)(无,65,65,32)4640
max_pooling2d_1(MaxPooling(无,32,32)0 2D)
dropout(退出)(无.32.32.30)0
展平(展平)(无,32768)0
稠密(稠密)(无,64)2097216
稠密_1(稠密)(无,32)2080
稠密_2(稠密)(无,10)330
稠密_3(稠密)(无,4)44
======================================
总参数:2104758
可训练参数:2104758
不可训练参数:0
______________________________________
编译使用以下参数创建的模型,
cnn.compile(损失=”类别_交叉熵”,优化器=”Adam”,度量=[“准确姓”])
我们在这里选择的损失函数是交叉熵分类。当开发深度学习模型来测量预测输出和实际输出之间的差异时,损失函数是必不可少的,这样神经网络可以调整其权重以提高其准确姓。当图像被分类为许多类别时,使用分类交叉熵。
神经网络中的优化器主要用于调整神经网络的权值,提高模型的学习速度以减少损失。Adam是这里最常用的优化器。
让我们将数据拟合到我们创建的CNN模型中。
历史=cnn.fit(培训,验证数据=valds,时间=10,批次大小=16,详细=1)
第1/10纪元
304/304〔============等于===>===+===〕-126s 413ms/步长-损失:0.5149-精度:0.7813-val-损失:0.6445-val+精度:0.7801
第2/10纪元
304/304〔============等于===>====122s 400ms/步长-损失:0.3672-精度:0.8526-val-损失:0.6240-val=精度:0.7591
第3/10纪元
304/304〔============等于===>====122秒401ms/步进-损耗:0.2541-精度:0.9004-val-损耗:0.6677-val=精度:0.7953
第4/10纪元
304/304〔============等于===>===<===〕-122s 399ms/步进-损失:0.1783-精度:0.9343-val-损失:0.6279-val=精度:0.8187
第5/10纪元
304/304〔============等于===>===<===〕-122s 400ms/步长-损失:0.1309-精度:0.9502-val-损失:0.6373-val=精度:0.8292
第6/10纪元
304/304〔============等于====1====39ms/步进-损失:0.1069-精度:0.9613-val-损失:0.7103-val_精度:0.8444
第7/10纪元
304/304〔============等于====1====21s 399ms/步进-损失:0.0768-精度:0.9712-val-损失:0.6353-val=精度:0.8409
第8/10纪元
304/304〔============等于===>===<===〕-122s 400ms/步长-损失:0.0540-精度:0.9827-val-损失:0.6694-val=精度:0.8456
第9/10纪元
304/304〔============等于====1====39ms/步进-损失:0.0530-精度:0.9813-val-损失:0.7373-val_精度:0.8374
大纪元10/10
304/304〔============等于===>===<===〕-122s 399ms/步进-损失:0.0304-精度:0.9872-val-损失:0.7529-val=精度:0.8655
正如我们所看到的,我们的CNN模型在训练数据中的准确姓已经达到98%!在验证数据中,我们获得了86%以上的准确率。现在让我们在测试数据集上评估模型。
cnn.evaluate(测试)
82/82〔============等于===>===<===〕-9s 113ms/阶跃-损耗:0.2257-精度:0.9458
正如我们所看到的,我们的CNN模型在测试数据中表现得非常好。在拟合模型时,我们在上面的代码中将训练数据声明为”训练”,并将epochs保持为10,这意味着我们的模型使用训练数据对神经网络进行十次训练,并将Verbose设置为1,以实时查看一个epoch后的模型拟合。
现在让我们将一些结果可视化。
使用深度学习进行可视化
我们将在我们所达到的准确度和时代数之间绘制一个图表,以了解我们的培训和验证准确度是如何提高的。
epochs=范围(len(history.history[“准确姓”]))
plt.plot(epochs,history.history〔’准确姓’〕,’绿涩’,label=’训练数据的准确姓’)
plt.plot(epochs,history.history[‘val_accuracy’],’red’,label=’验证数据的准确姓’)
plt.xlabel(“总纪元”)
plt.ylabel(“达到精度”)
plt.title(“培训和验证准确姓”)
plt.图例(位置=0)
图()
通过这个图表,我们可以假设我们的模型与训练和验证数据非常一致。现在我们将使用我们创建的模型对一些样本图像进行分类。
使用深度学习进行预测
为了用我们的模型预测一些样本图像,我们首先需要导入图像,对图像进行归一化,并将其转换为用于平滑预测的数组。
从matplotlib.pyplot导入imshow
从PIL导入图像,ImageOps
数据=np.ndarray(形状=(1,130,130,3),dtype=np.float32)
image=image.open(“image(2).jpg”)
尺寸=(130,130)
image=ImageOps.fit(图像.大小.图像.ANTIALIAS)
image_数组=np.asarray(image)
显示(图像)
标准化的_图像_数组=(图像_数组.astype(np.float32)/127.0)-1
data[0]=归一化_图像_数组
在这里,我们使用matplotlib的imshow(它可以帮助我们显示图像)和Python Imaging Library(PIL)(它处理所有类型的图像操作)。在PIL中,我们使用ImageOps,这是一个用于各种成像和图像预处理操作的模块。
现在我们将使用我们的CNN模型来预测上述图像的类别,即肿瘤类型。
预测=cnn.predict(数据)
打印(预测)
预测_指数=np.argmax(预测)
打印(预测_索引)
1/1〔========================〕-0s 142ms/步
[[0. 0. 1. 0.]]
二
这是正确的答案,可以确认我们的上述标准化图像属于第二类,即没有肿瘤。让我们输出这个答案。
print(“某人没有肿瘤的概率为百分之二”。format(prediction〔0〕〔2〕*100))该人没有肿瘤的可能姓为百分之一
通过这种方式,我们可以肯定地说,我们的CNN模型可以最准确地预测任何类型的脑肿瘤数据。对于给定的模型架构,您可以使用上述任何脑肿瘤数据集。
结论
正如我们所看到的,技术如何极大地影响了我们的生活方式和文化。使用科技来改善我们的生活是它能做的最好的事情。在医疗保健中使用深度学习是最好的选择。与上述脑肿瘤分类的深度学习模型一样,我们可以通过应用一些修改在每个领域使用这些模型。
在本文中,我们学习了如何将Tensorflow和Keras用于这个深度学习模型,以及不同的技术来帮助提高我们的准确姓,并进行了数据可视化。
600学习网 » 使用深度学习构建脑肿瘤分类器-600学习网