目录
重构基础模型
冻结权重
下一步
- 下载源 - 300.4 KB
在本系列文章中,我们将应用深度学习网络ResNet50来诊断胸部X射线图像中的Covid-19。我们将使用Python的TensorFlow库在Jupyter Notebook上训练神经网络。
此项目所需的工具和库是:
IDE:
- Jupyter Notebook
库:
- TensorFlow 2.0
- Keras
- NumPy
- Matplotlib
- CV2
我们假设您熟悉使用Python和Jupyter notebook进行深度学习。如果您不熟悉Python,请从本教程开始。如果您还不熟悉Jupyter,请从这里开始。
在上一篇文章中,我们加载了基础模型并展示了它的层。现在,我们将使这个基础模型适合新的分类任务:COVID-19和正常胸部X射线。我们将使用ResNet50模型和一个包含 2,484张图像的数据集——与ImageNet相比,这是一个小数据集。为了使我们的模型适合上述新任务,我们需要:
- 去掉网络的全连接层,增加一个全局平均层来压缩所有的特征图
- 用新层替换基础模型的全连接层
- 添加一个新的密集输出层,其中有两个节点代表两个目标类别:COVID-19和Normal
- 在特征提取部分冻结预训练层的权重,并随机化新的全连接层的权重
- 训练ResNet50只更新全连接层的权重
如上所述,重塑我们的ResNet50以应用迁移学习的第一步是移除完全连接的层并添加一个全局平均池化层,该层用于压缩来自基础模型的所有特征图。此外,使用了两个密集层——一个有512个节点,另一个有2个代表两个目标类。
x = base_model.output
x = tf.keras.layers.GlobalAveragePooling2D()(x)
x = tf.keras.layers.Dense(1024, activation='relu')(x)
x = tf.keras.layers.Dense(1024, activation='relu')(x)
x = tf.keras.layers.Dense(1024, activation='relu')(x)
x = tf.keras.layers.Dense(512, activation='relu')(x)
preds = tf.keras.layers.Dense(2, activation ='softmax')(x)
现在,我们可以使用新结构创建一个模型,其中包含基础模型(特征提取部分)、新输入数据和输出结构(preds)。
model = tf.keras.models.Model(inputs=base_model.input, outputs=preds)
print(model.summary())
图 5 显示了重塑后的模型与基础模型相似。不同之处在于添加的全局平均池化层和一些完全连接的密集层,它们改变了网络输出以适应我们新的目标分类任务。
图 5:重塑的 ResNet50模型的快照
冻结权重现在是时候在全局平均池化层之前冻结所有层的权重了。
我们将使用在上一篇文章中使用的相同代码来帮助我们枚举层,然后我们将通过将它们设置为“False”来冻结它们。
for i, layer in enumerate(model.layers):
print(i, layer.name)
for layer in model.layers[:175]:
layer.trainable = False
在冻结层的权重后,我们将通过将新添加的层设置为“True”来将它们设置为可训练的。
for layer in model.layers[175:]:
layer.trainable = True
在接下来的文章中,我们将调整我们ResNet50模型。敬请关注!
codeproject.com/Articles/5294463/Restructuring-ResNet50-to-Diagnose-COVID-19