作者|Andre Ye
編譯|Flin
來源|towardsdatascience
使用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
了解資料
讓我們了解資料,查看兩個樣本影像,一個處于正常狀態,另一個處于肺炎狀態,
import matplotlib.pyplot as plt
img_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, 150
nb_train_samples = 5217
nb_validation_samples = 17
epochs = 20
batch_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.input和model.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=https://www.cnblogs.com/panchuangai/p/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
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方檔案:
http://sklearn123.com/
歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/3937.html
標籤:其他
上一篇:VAE變分自編碼器Keras實作
