在本篇文章中,将探讨如何使用Python的TensorFlow库在Jupyter Notebook上训练一个神经网络,以识别COVID-19胸部X光图像。将使用迁移学习技术,利用ResNet50模型的预训练权重来完成这一任务。
为了完成这个项目,需要以下工具和库:
假设已经熟悉Python的深度学习和Jupyter Notebook。如果是Python新手,请从这个教程开始。如果还不熟悉Jupyter Notebook,请从这里开始。
在本项目中,采用迁移学习技术,利用ResNet50模型在新的分类任务——COVID-19检测中的知识。迁移学习包括两个阶段:冻结和微调。
在冻结阶段,使用公开可用的预训练模型的权重和学习参数。微调阶段开始时,移除ResNet50的全连接层(FC),并将其重新构建为三个全连接层,输出层有两个输出神经元,分别对应COVID-19和正常胸部X光图像。注意,在训练过程中,FC层的权重是随机初始化的。其余层的权重被冻结,以确保它们作为输入图像的高抽象级别的强特征提取器,因为它们已经在ImageNet数据集上的数百万图像上进行了训练。
网络使用随机梯度下降优化方法在1,590张图像上进行训练,每次迭代的批量大小为64张图像。读取训练数据以及数据选择的代码在本系列的第二篇文章中讨论过。
为了防止过拟合,监控了验证图像上的错误和性能率。发现,在第3个epoch时,ResNet50达到了最高的训练精度,以及最佳的泛化能力。表1显示了网络在3个epoch后的良好训练性能——98.7%的精度。
一旦模型以良好的精度训练完成,就可以开始在测试数据集上测试它,测试数据集包括895张未包含在训练集中的图像。测试集在本系列的第二篇文章中加载为test_generator。
要测试模型,使用model.evaluate函数。这个函数根据传递给它的输入数据计算损失和精度。传递了所有的输入测试数据作为test_generator,并评估了模型。
模型预测函数model.predict与model.evaluate类似,但它生成模型输入的预测输出。要使用model.predict获取测试数据的所有预测,请参考以下代码:
predictions = model.predict(test_generator, batch_size=None, verbose=0, steps=None, callbacks=None)
print(predictions)
在得到Softmax函数生成的概率预测后,将这些预测四舍五入到0或1。四舍五入后的输出存储在classes中,而实际输出存储在test_generator.Labels中。
为了更好地解释和评估使用的模型,可以使用许多参数和指标,例如Grad-Cam。可视化了一些正确分类的COVID-19和正常测试图像的Grad-Cam。Grad-Cam是一种方法,可以可视化网络在分类某个图像时关注的区域的激活。与预测类别相关的疑似区域通过热图突出显示,其中最高激活区域以深红色显示,最低激活区域以深蓝色显示。