Keras 查找微调模型的顶层

Keras 查找微调模型的顶层,keras,deep-learning,neural-network,conv-neural-network,Keras,Deep Learning,Neural Network,Conv Neural Network,我想使用一个基于MobileNetV2(在Keras上预先训练)的微调模型。但我需要添加顶层,以便将我的图像分为两类。我想知道如何选择我需要的层的“架构”? 在一些例子中,人们使用SVM分类器或具有特定数量神经元的密集层序列作为顶层 以下代码(默认情况下)有效: self.base_model = base_model x = self.base_model.output x = GlobalAveragePooling2D()(x)

我想使用一个基于MobileNetV2(在Keras上预先训练)的微调模型。但我需要添加顶层,以便将我的图像分为两类。我想知道如何选择我需要的层的“架构”? 在一些例子中,人们使用SVM分类器或具有特定数量神经元的密集层序列作为顶层

以下代码(默认情况下)有效:

        self.base_model = base_model
        x = self.base_model.output
        x = GlobalAveragePooling2D()(x)
        x = Dense(1024, activation='relu')(x)
        predictions = Dense(2, activation='softmax')(x)

有没有找到最佳解决方案的方法

我建议
退出
批量标准化
。“稠密”很容易被过度拟合,因为它在一个层中有太多的参数。这两个层都可以很好地正则化模型
GlobalAveragePoolig2D
是一个很好的选择,因为它本身也起着正则化器的作用


我还建议,对于二进制分类问题,您可以将输出层更改为
density(1,activation='sigmoid')
以仅预测p(class1),在这里您可以通过1-p(class1)计算p(class2)。在这种情况下,您应该使用的损失是
二进制交叉熵
而不是
分类交叉熵

我建议您选择
退出
批量标准化
。“稠密”很容易被过度拟合,因为它在一个层中有太多的参数。这两个层都可以很好地正则化模型
GlobalAveragePoolig2D
是一个很好的选择,因为它本身也起着正则化器的作用


我还建议,对于二进制分类问题,您可以将输出层更改为
density(1,activation='sigmoid')
以仅预测p(class1),在这里您可以通过1-p(class1)计算p(class2)。在这种情况下,您应该使用的损失是
二进制交叉熵
而不是
分类交叉熵

我认为您的解决方案很好,真正的力量在于预训练模型。像你一样,2或3个密集的层应该很好。它们是我选择神经元数量的标准吗?(减少数字,增加…)这是参数调整,您必须测试并查看。Chompakorn的回答实际上比我的评论要好。我认为你的解决方案很棒,真正的力量在于预先训练的模型。像你一样,2或3个密集的层应该很好。它们是我选择神经元数量的标准吗?(减少数字,增加…)这是参数调整,您必须测试并查看。Chompakorn的回答实际上比我的评论要好。谢谢你的回答,你对设置辍学参数有什么建议?我是否使用GridSearch并选择最佳?如你所说更改输出层将真正提高我的神经网络的准确性?你能告诉我为什么吗?这不能保证进步。首先,你需要知道调整超参数对于深度学习来说是非常困难的,很多研究人员都在研究这个问题。因此,在大多数情况下,这是一个反复试验的问题。但是,你可以寻找与你相关的其他作品,并相应地调整他们的模型,因为他们的模型经过了实验,并给出了很好的结果。使用GridSearch是找到最佳超参数的方法之一,即使谷歌也可以这样做:)(例如,检查EfficientNet)。但是,您应该记住,您监控的是最佳验证性能,而不是培训性能。感谢您的回答,您对设置退出参数有何建议?我是否使用GridSearch并选择最佳?如您所说更改输出层将真正提高我的神经网络的准确性?你能告诉我为什么吗?这不能保证进步。首先,你需要知道调整超参数对于深度学习来说是非常困难的,很多研究人员都在研究这个问题。因此,在大多数情况下,这是一个反复试验的问题。但是,你可以寻找与你相关的其他作品,并相应地调整他们的模型,因为他们的模型经过了实验,并给出了很好的结果。使用GridSearch是找到最佳超参数的方法之一,即使谷歌也可以这样做:)(例如,检查EfficientNet)。但是,您应该记住,您正在监视最佳验证性能,而不是培训性能。