fromkeras.preprocessing.imageimportImageDataGenerator,load_imgfromkeras.modelsimportSequentialfromkeras.layersimportConv2D,MaxPooling2Dfromkeras.layersimportActivation,Dropout,Flatten,DensefromkerasimportbackendasKimportosimportnumpyasnpimportpandasasnpimportmatplotlib.pyplotasplt%matplotlibinline了解数据让我们了解数据。查看两个样本图像,一个处于正常状态的胸部X光片图像,另一个处于肺炎状态的胸部X光片图像。
importmatplotlib.pyplotaspltimg_name=NORMAL2-IM--.jpegimg_normal=load_img(../input/chest_xray/chest_xray/train/NORMAL/+img_name)plt.imshow(img_normal)plt.show()
img_name=person63_bacteria_.jpegimg_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=,nb_train_samples=nb_validation_samples=17epochs=20batch_size=16图像宽度和图像高度均为像素。训练集包含个样本,验证集包含17个样本(稍后我们将通过数据增强添加更多验证样本)。验证数据用于评估训练期间损失函数的性能(而测试数据用于评估训练后的模型性能)。训练将分为20个epoch,每组16幅图像。指定图像的目录:
train_data_dir=../input/chest_xray/chest_xray/trainvalidation_data_dir=../input/chest_xray/chest_xray/valtest_data_dir=../input/chest_xray/chest_xray/test最后,需要重塑图像:
ifK.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.