使用CNN和Python实施的肺炎检测!这个项目你给几分?( 四 )


这里使用softmax是因为我们希望输出是每个类别的概率值 。
input1 = Input(shape=(X_train.shape[1], X_train.shape[2], 1)) cnn = Conv2D(16, (3, 3), activation='relu', strides=(1, 1),padding='same')(input1) cnn = Conv2D(32, (3, 3), activation='relu', strides=(1, 1),padding='same')(cnn) cnn = MaxPool2D((2, 2))(cnn) cnn = Conv2D(16, (2, 2), activation='relu', strides=(1, 1),padding='same')(cnn) cnn = Conv2D(32, (2, 2), activation='relu', strides=(1, 1),padding='same')(cnn) cnn = MaxPool2D((2, 2))(cnn) cnn = Flatten()(cnn)cnn = Dense(100, activation='relu')(cnn) cnn = Dense(50, activation='relu')(cnn) output1 = Dense(3, activation='softmax')(cnn) model = Model(inputs=input1, outputs=output1) 在使用上面的代码构造了神经网络之后 , 我们可以通过对model对象应用summary()来显示模型的摘要 。 下面是我们的CNN模型的详细情况 。 我们可以看到我们总共有800万个参数——这确实很多 。 好吧 , 这就是为什么我在Kaggle Notebook上运行这个代码 。
使用CNN和Python实施的肺炎检测!这个项目你给几分?文章插图
总之 , 在构建模型之后 , 我们需要使用分类交叉熵损失函数和Adam优化器来编译神经网络 。 使用这个损失函数 , 因为它只是多类分类任务中常用的函数 。 同时 , 我选择Adam作为优化器 , 因为它是在大多数神经网络任务中最小化损失的最佳选择 。
model.compile(loss='categorical_crossentropy',optimizer='adam', metrics=['acc']) 现在是时候训练模型了!在这里 , 我们将使用fit_generator()而不是fit() , 因为我们将从train_gen对象获取训练数据 。 如果你关注数据扩充部分 , 你会注意到train_gen是使用X_train和y_train_one_hot创建的 。 因此 , 我们不需要在fit_generator()方法中显式定义X-y对 。
history = model.fit_generator(train_gen, epochs=30,validation_data=http://kandian.youth.cn/index/(X_test, y_test_one_hot)) train_gen的特殊之处在于 , 训练过程中将使用具有一定随机性的样本来完成 。 因此 , 我们在X_train中拥有的所有训练数据都不会直接输入到神经网络中 。 取而代之的是 , 这些样本将被用作生成器的基础 , 通过一些随机变换生成一个新图像 。
此外 , 该生成器在每个时期产生不同的图像 , 这对于我们的神经网络分类器更好地泛化测试集中的样本非常有利 。 下面是训练的过程 。
Epoch 1/30 163/163 [==============================] - 19s 114ms/step - loss: 5.7014 - acc: 0.6133 - val_loss: 0.7971 - val_acc: 0.7228 . . . Epoch 10/30 163/163 [==============================] - 18s 111ms/step - loss: 0.5575 - acc: 0.7650 - val_loss: 0.8788 - val_acc: 0.7308 . . . Epoch 20/30 163/163 [==============================] - 17s 102ms/step - loss: 0.5267 - acc: 0.7784 - val_loss: 0.6668 - val_acc: 0.7917 . . . Epoch 30/30 163/163 [==============================] - 17s 104ms/step - loss: 0.4915 - acc: 0.7922 - val_loss: 0.7079 - val_acc: 0.8045 整个训练本身在我的Kaggle Notebook上花费了大约10分钟 。 所以要耐心点!经过训练后 , 我们可以绘制出准确度得分的提高和损失值的降低 , 如下所示:
plt.figure(figsize=(8,6)) plt.title('Accuracy scores') plt.plot(history.history['acc']) plt.plot(history.history['val_acc']) plt.legend(['acc', 'val_acc']) plt.show()plt.figure(figsize=(8,6)) plt.title('Loss value') plt.plot(history.history['loss']) plt.plot(history.history['val_loss']) plt.legend(['loss', 'val_loss']) plt.show()


推荐阅读