AI医生-诊断肺炎

使用CNN通过识别患者胸部的X光片,来判断患者是否患有肺炎

人工智能在现实世界中有许多应用,其中非常重要的一项是在医疗行业中的应用。在本文中,我将提供卷积神经网络如何从胸部的X光片来诊断肺炎的代码及过程。

导入库

让我们加载一些重要的库:

from keras.preprocessing.image import ImageDataGenerator, load_img from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D from keras.layers import Activation, Dropout, Flatten, Dense from keras import backend as K  import os import numpy as np import pandas as np  import matplotlib.pyplot as plt %matplotlib inline

了解数据

让我们了解数据。查看两个样本图像,一个处于正常状态的胸部X光片图像,另一个处于肺炎状态的胸部X光片图像。

import matplotlib.pyplot as pltimg_name = 'NORMAL2-IM-0588-0001.jpeg'img_normal = load_img('../input/chest_xray/chest_xray/train/NORMAL/' + img_name)plt.imshow(img_normal)plt.show()
img_name = 'person63_bacteria_306.jpeg' img_pneumonia = load_img('../input/chest_xray/chest_xray/train/PNEUMONIA/ ' + img_name)  print('PNEUMONIA') plt.imshow(img_pneumonia) plt.show()

准备数据来输入模型

设置一些重要的变量,例如图像尺寸,epoch等:

img_width, img_height = 150, 150nb_train_samples = 5217nb_validation_samples = 17epochs = 20batch_size = 16

图像宽度和图像高度均为150像素。训练集包含5217个样本,验证集包含17个样本(稍后我们将通过数据增强添加更多验证样本)。验证数据用于评估训练期间损失函数的性能(而测试数据用于评估训练后的模型性能)。训练将分为20个epoch,每组16幅图像。

指定图像的目录:

train_data_dir = '../input/chest_xray/chest_xray/train'validation_data_dir = '../input/chest_xray/chest_xray/val'test_data_dir = '../input/chest_xray/chest_xray/test'

最后,需要重塑图像:

if K.image_data_format() == 'channels_first':    input_shape = (3, img_width, img_height)else:    input_shape = (img_width, img_height, 3)

因为图像是彩色的,所以每个像素有三个独立的颜色值,因此深度为3。如果图像像MNIST数据集一样是黑白的,那么深度为1。

创建模型

模型按照一个标准的CNN公式创建:多次重复卷积层、激活层和池化层,最后是Flatten层和标准全连接层,在最后添加一个dropout层以进一步正则化,然后是另一个全连接层(由两个激活函数包围)。

model = Sequential()model.add(Conv2D(32, (3, 3), input_shape=input_shape))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Conv2D(32, (3, 3)))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Conv2D(64, (3, 3)))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Flatten())model.add(Dense(64))model.add(Activation('relu'))model.add(Dropout(0.5))model.add(Dense(1))model.add(Activation('sigmoid'))

我们可以通过调用model.layers获取有关层的信息。

我们还可以了解model.inputmodel.output的输入和输出分别是什么。

model.input的输出:

model.output的输出:

接下来,我们必须使用损失函数、优化器和度量来编译模型。在这种情况下,选择的损失函数是二元交叉熵(几乎是普遍选择)。选择的优化器是rmsprop,它依赖于图像中非常小的变化,在这种变化下分类工作做的很好。

编译代码如下:

model.compile(loss='binary_crossentropy',              optimizer='rmsprop',              metrics=['accuracy'])

数据扩充

验证集只有17张图片,那么我们如何获取更多数据呢?答案是:数据扩充。

我们可以使用数据扩充来为我们提供更多用于训练、验证和测试的数据。

train_datagen = ImageDataGenerator(    rescale=1. / 255,    shear_range=0.2,    zoom_range=0.2,    horizontal_flip=True)
test_datagen = ImageDataGenerator(rescale=1. / 255)

下面的代码使用flow_from_directory直接将数据生成器应用于训练组目录中的图像。

train_generator = train_datagen.flow_from_directory(    train_data_dir,    target_size=(img_width, img_height),    batch_size=batch_size,    class_mode='binary')

以下代码为validation生成代码:

validation_generator = test_datagen.flow_from_directory(    validation_data_dir,    target_size=(img_width, img_height),    batch_size=batch_size,    class_mode='binary')

而这个用于test

test_generator = test_datagen.flow_from_directory(    test_data_dir,    target_size=(img_width, img_height),    batch_size=batch_size,    class_mode='binary')

拟合模型

最后,我们可以拟合模型!根据生成的数据来拟合模型:

model.fit_generator(    train_generator,    steps_per_epoch=nb_train_samples // batch_size,    epochs=epochs,    validation_data=validation_generator,    validation_steps=nb_validation_samples // batch_size)

保存模型的权重:

model.save_weights('first_try.h5')

评估模型性能

要评估模型在肺炎分类中的性能,请调用

scores = model.evaluate_generator(test_generator) print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))

输出为acc: 85.42%

可视化预测

现在,我们可以可视化一些图像和预测。预测“正常”的人:

一个预测为“肺炎”的人:

你可以想象这在医疗行业会有多大的帮助——人工智能可以在人类可能无法诊断肺炎的任务中提供很多帮助。

原文链接:https://towardsdatascience.com/doctor-ai-diagnoses-pneumonia-9b073013e226

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 mthler」,每日朋友圈更新一篇高质量博文(无广告)。

扫描二维码添加小编↓

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值