目录
在本系列文章中,我们将应用深度学习网络ResNet50来诊断胸部X射线图像中的Covid-19。我们将使用Python的TensorFlow库在Jupyter Notebook上训练神经网络。
此项目所需的工具和库是:
IDE:
库:
我们假设您熟悉使用Python和Jupyter notebook进行深度学习。如果您不熟悉Python,请从本教程开始。如果您还不熟悉Jupyter,请从这里开始。
在本系列的前几篇文章中,我们使用基于迁移学习的方法来微调现有的ResNet50模型来诊断 COVID-19。在本文中,我们将向您展示如何从头开始构建网络,然后训练它将胸部X射线图像分类为COVID-19和正常。
安装库并加载数据集
我们将仅使用TensorFlow、Keras和OS以及一些基本的附加库来构建用于诊断COVID-19的网络。
# Import required libraries
import tensorflow as tf
from keras import optimizers
import os, shutil
import matplotlib.pyplot as plt
首先,让我们加载将用于训练和测试网络的数据。在这种情况下,我们将使用一种不同的加载技术,与我们使用的基于转移学习的网络不同。不过,我们将使用相同的数据集。
base_dir = r'C:\Users\abdul\Desktop\ContentLab\P1\archive\COVID-19 Radiography Database’
train_dir = os.path.join(base_dir, 'train')
test_dir = os.path.join(base_dir, 'test')
train_COV19_dir = os.path.join(train_dir, 'COV19')
train_Normal_dir = os.path.join(train_dir, 'Normal')
test_VOV19_dir = os.path.join(test_dir, 'COV19')
test_Normal_dir = os.path.join(test_dir, 'Normal')
现在,让我们在训练和测试集中打印COVID-19和正常图像的数量。
print('total training COV19 images:', len(os.listdir(train_COV19_dir)))
print('total training Normal images:', len(os.listdir(train_Normal_dir)))
print('total test COV19 images:', len(os.listdir(test_VOV19_dir)))
print('total test Normal images:', len(os.listdir(test_Normal_dir)))
预处理数据
在向网络提供数据之前,必须对图像进行预处理。对于我们要构建的网络,我们将选择 128x128x3的输入格式。所有图像都将重新缩放到这个尺寸,它相对较小——计算成本较低。现在需要设置批量大小和类模式,以ImageDataGenerator供使用。
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(train_dir, target_size=(128, 128), batch_size=5, class_mode='categorical')
test_generator = test_datagen.flow_from_directory(test_dir, target_size=(128, 128), batch_size=5, class_mode='categorical')
要检查数据和标签批次形状,我们将使用:
for data_batch, labels_batch in train_generator:
print('data batch shape:', data_batch.shape)
print('labels batch shape:', labels_batch.shape)
break
请注意,顺序模型需要4个维度的输入(批量大小、X、Y、通道)。这就是为什么应该在构建网络之前设置批次的原因;否则会出现错误。
构建深度学习网络
Keras模型使用序列类来创建层。这是一个表示层堆栈的功能模型类。它可以很容易地从 Keras导入。
对于我们的模型,我们将使用两层卷积、两层MaxPooling、三层ReLU、一层Flatten和两层Dense层(全连接)。我们需要从Keras模型导入所有必需的层,例如Conv2D、MaxPooling和Dense。
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.layers import Conv2D
from tensorflow.keras.layers import MaxPooling2D
from tensorflow.keras import backend as k
input_shape=(128, 128, 3)
model = Sequential()
model.add(Conv2D(32, kernel_size=(5, 5), strides=(1, 1),
activation='relu',
input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Conv2D(64, (5, 5), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dense(2, activation='softmax'))
model.summary()
如上所示,使用该Conv2D函数调用卷积层,该函数具有三个主要参数:
- Filters:设置卷积层中生成的过滤器数量
- Kernel size:卷积中使用的滤波器或内核的大小(必须是奇数)
- Strides:一个2元组整数,用于定义卷积将如何沿输入图像的X轴和Y轴进行
池化层还定义stride(遍历所有图像)和pool _size,这是池化过滤器或内核的大小,用于对输入图像应用池化。
最后,我们可以可视化我们的网络:
model.summary()
训练网络
为了训练我们新构建的网络,我们需要指定损失函数和优化器。对于这个网络,我们将使用二元交叉熵,因为我们的目标是将胸部X射线分为两类:Covid-19和正常。我们将使用随机梯度下降作为优化器。
在优化函数中,我们需要设置学习率。这是一个重要的参数。如果设置得太低,学习过程可能会更长,因为权重会遇到小的更新。相反,如果设置得太高,网络可能会过拟合。最好通过设置一个较低的学习率值来开始训练我们的网络,然后在监控网络性能的同时逐渐增加它。
在此,让我们选择0.001的学习率。
from keras import optimizers
model.compile(loss='categorical_crossentropy',
optimizer=optimizers.adam(lr=1e-4),
metrics=['acc'])
然后,我们可以开始训练10个epochs(图11):
history = model.fit_generator(train_generator, steps_per_epoch=100, epochs=10)
图 11:训练过程快照
然后可以使用以下方法绘制训练期间的网络准确性和损失:
acc = history.history['acc']
loss = history.history['loss']
plt.figure()
plt.plot(acc, label='Training Accuracy')
plt.ylabel('Accuracy')
plt.title('Training Accuracy')
plt.figure()
plt.plot(loss, label='Training Loss')
plt.ylabel('Loss')
plt.title('Training Loss')
plt.xlabel('epoch')
plt.show()
图 12:准确率与 epoch 数的关系
评估网络
正如上一篇文章中所讨论的,可以在COVID-19和正常类别的新的、看不见的图像上测试模型的准确性。在本节中,网络在895幅COVID-19和正常胸部X射线图像上进行了测试。我们使用了与之前的预训练网络的测试“model.evaluate”相同的测试命令。如图10所示,该网络实现了98.8%的测试准确率(图13)。
Testresults = model.evaluate(test_generator)
print("test loss, test acc:", Testresults)
图 13:测试准确度的快照
下一步?
我们已经到了系列的结尾。我们已经实现了既定目标,即将胸部X射线图像分类为COVID-19或正常。我们采用的模型在诊断COVID-19方面取得了很好的成绩,因为它们对基于迁移学习的模型和新建模型的测试准确率分别达到了95%和98.8%。
尽管我们的COVID-19分类器运行良好,但仍有改进的空间。一个关键的补充是进行额外的训练,以帮助网络更好地将COVID-19与其他胸部疾病(如病毒性肺炎、细菌性肺炎、肿块等)区分开来。
https://www.codeproject.com/Articles/5294469/COVID-19-Diagnosis-Using-ResNet50-Transfer-Learnin