在Keras中,选择要训练的图层并在经过训练的Inception模型中添加跳过连接

时间:2019-10-07 14:16:21

标签: python tensorflow keras conv-neural-network transfer-learning

我想用诸如此类的CT灰度图像训练模型:

enter image description here

对于某些疾病,我的训练方式是有限的,例如2,000例阳性和98,000例阴性。

我正在考虑使用转移学习来避免过度拟合并提高模型的有效性,但我也意识到我应该微调模型,因为我要提供给模型的图像类型与带有我将使用的Inception模型已经过训练。

那我的问题是我不确定应该固定多少层以及可以训练多少层。

然后我正在考虑使用跳过连接来施加随机深度,以使网络了解真正需要多少层。

所以我正在考虑实现以下架构。

enter image description here

即我将在Keras(Tensorflow 2.0)随附的预训练的初始模型的各层之间添加跳过连接。

我欢迎您提供有关如何实施这些想法的建议。特别是如何将网络分为三个部分,在添加跳过连接之后,保持第一部分不变(不可训练)并训练第二部分。该实现应在Keras中进行。

1 个答案:

答案 0 :(得分:1)

  1. 转移学习确实是正确的方法。这使您可以利用训练有素的权重来完成DL图像处理的“一般”任务,例如形状识别,边缘检测等,并且从某种意义上讲,可以节省数据(输入和标签)用于为您的特定任务重新配置现有的神经网络。

  2. 根据经验,权重与输入的距离越近,其功能越通用,而您想要重新训练它们的内容就越少。相反,权重越接近输出,任务的功能越具体,它们需要的再培训就越多。

  3. 我建议在重新训练现有权重之前先训练端点分类器。 1-2个具有您最喜欢的激活功能的完全连接层(阅读:Dense)+ 1个具有softmax激活的完全连接层(因为我们希望输出是每种疾病的预测概率)做到这一点。训练此方法(端点分类器)时,请确保冻结所有其他层(或使用瓶颈功能-请参阅下面的链接中的操作)。

  4. 然后,您才应该重新训练现有的权重-这称为微调。我建议解冻第一个起始module *,然后对其进行重新训练(以及从最后一步开始受过训练的端点分类器!)。然后可以解冻下一个启动模块,并对其进行训练(再次,同时还允许重新启动第一个启动模块和新的端点分类器。重新训练路段时,请始终允许下游的权重也进行重新训练)

  5. 请注意,微调应使用较慢的训练速度。

  6. 据我所知,跳过连接不要“让网络了解真正需要多少层”。他们大多允许规避递减的梯度问题。 “跳过”层不会变为“可选”,它们将参与生成输出。而且,由于使用的权重并未考虑将通过跳过连接添加的输入,因此我认为这将使权重的训练变得无关紧要,因此需要对整个网络进行重新训练,从而阻止了转移学习。

    这将是一个有趣的实验,但后果自负。

  7. 如果您确实要跳过连接,建议您使用一个已经具有它们的模型(因此可以调整其权重),例如ResNet。

请查看此链接,以获取有关利用转移学习,瓶颈功能和微调的更多想法。增强功能,任您选择。

https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html

*根据我的意思,我指的是输出说明中的第一个,即图像中最高的一个。