Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow 克拉斯';Resnet微调-不适合或过度适合:我如何平衡训练?_Tensorflow_Keras_Deep Learning_Resnet - Fatal编程技术网

Tensorflow 克拉斯';Resnet微调-不适合或过度适合:我如何平衡训练?

Tensorflow 克拉斯';Resnet微调-不适合或过度适合:我如何平衡训练?,tensorflow,keras,deep-learning,resnet,Tensorflow,Keras,Deep Learning,Resnet,我正在微调Keras在imagenet数据上预先训练过的Resnet,以便使用另一个图像数据集进行特定分类。我的模型结构如下:Resnet接受输入,并在Resnet的顶部添加了我自己的分类器。在我尝试的所有实验中,模型要么拟合不足,要么拟合过度 我主要尝试了两种方法: 将一定数量的n层阻挡在输入端,以免在训练期间更新。特别是,Resnet有175层,我尝试了n=0、10、30、50、80、175。在所有这些情况下,模型拟合不足,在训练集上获得的精度最多等于0.75,在验证中获得的精度最多为0.

我正在微调Keras在imagenet数据上预先训练过的Resnet,以便使用另一个图像数据集进行特定分类。我的模型结构如下:Resnet接受输入,并在Resnet的顶部添加了我自己的分类器。在我尝试的所有实验中,模型要么拟合不足,要么拟合过度

我主要尝试了两种方法:

  • 将一定数量的
    n
    层阻挡在输入端,以免在训练期间更新。特别是,Resnet有175层,我尝试了
    n
    =0、10、30、50、80、175。在所有这些情况下,模型拟合不足,在训练集上获得的精度最多等于0.75,在验证中获得的精度最多为0.51

  • n
    =0、10、30、50阻止所有批处理规范化层,以及开始时的一些
    n
    层(如前所述)。在这些情况下,模型拟合过度,在训练集上获得超过0.95的准确度,但在验证集上获得大约0.5的准确度

请注意,从Resnet更改为InceptionV3,并阻塞50层,我在验证集和测试集上获得了超过0.95的准确性

以下是我代码的主要部分:

inc_model=ResNet50(weights='imagenet',
include_top=False,
输入形状=(IMG\u高度,IMG\u宽度,3))
打印(“层数:”,透镜(包括模型层))#175
#添加自定义图层
x=inc_型号输出
x=全局平均池2D()(x)
x=密集(1024,activation=“relu”)(x)
x=辍学率(0.5)(x)
x=密集(512,activation=“relu”)(x)
预测=密集(2,activation=“softmax”)(x)
模型=模型(输入=包含模型。输入,输出=预测)
#微调1
对于inc_模型中的图层。图层[:30]:
layer.trainable=错误
#微调2
对于inc_model.layers中的图层:
如果layer.name中的“bn”:
layer.trainable=错误
#编译模型
模型编译(优化器=SGD(lr=0.0001,动量=0.9)
,loss='classifical\u crossentropy'
,度量=[“准确性”])
checkpointer=ModelCheckpoint(filepath='weights.best.inc.male.resnet.hdf5',
verbose=1,save\u best\u only=True)
hist=型号安装发电机(系列发电机
,验证\数据=(x \有效,y \有效)
,每个历元的步数=训练样本/批量大小
,epochs=NUM_epochs
,回调=[checkpointer]
,verbose=1
)
有谁能建议如何找到一个稳定的解决方案,既能学到一些东西,又不会过度适应

编辑: 培训阶段的输出如下:

Epoch 1/20
625/625 [==============================] - 2473s 4s/step - loss: 0.6048 - acc: 0.6691 - val_loss: 8.0590 - val_acc: 0.5000

Epoch 00001: val_loss improved from inf to 8.05905, saving model to weights.best.inc.male.resnet.hdf5
Epoch 2/20
625/625 [==============================] - 2432s 4s/step - loss: 0.4445 - acc: 0.7923 - val_loss: 8.0590 - val_acc: 0.5000

Epoch 00002: val_loss did not improve from 8.05905
Epoch 3/20
625/625 [==============================] - 2443s 4s/step - loss: 0.3730 - acc: 0.8407 - val_loss: 8.0590 - val_acc: 0.5000

Epoch 00003: val_loss did not improve from 8.05905

等等。。每次验证没有任何改进

您都有很多选择,但确实尝试过,或者您可以尝试做一些,或者使用更简单的模型进行测试

您有很多选择,但确实尝试过,或者您可以尝试做一些,或者使用更简单的模型进行测试

我试着早点停下来,但没有改善。问题是,只有第一阶段的训练是有效的,因为在那之后,验证分数永远不会提高。我已经在做数据扩充了。你能给我推荐哪种更简单的型号吗?@NicolòPomini首先,你能在这里发布你的输出吗?那么,您是否尝试过改变您的学习率或优化器?虽然不能保证它会工作,但可以尝试VGG16或VGG19。我在问题中添加了培训阶段的输出。到目前为止,我尝试使用SGD、Adagrad和AdadeltaOk,现在我看到您的培训损失在不断减少,而验证损失没有改变(这意味着网络可能过度拟合)。您可以尝试将“辍学率”增加到0.7或阻止/删除某些层(请小心)。另外,似乎使用另一个预先训练的网络解决了这个问题,对吗?荒谬的是,我获得了更好的结果,将辍学率设置为0.3,冻结前80层,再加上所有批量标准化层:通过这种设置,最终精度达到0.56,这仍然非常糟糕。是的,使用InceptionV3,模型工作得非常好。我尝试过提前停止,但没有改善。问题是,只有第一阶段的训练是有效的,因为在那之后,验证分数永远不会提高。我已经在做数据扩充了。你能给我推荐哪种更简单的型号吗?@NicolòPomini首先,你能在这里发布你的输出吗?那么,您是否尝试过改变您的学习率或优化器?虽然不能保证它会工作,但可以尝试VGG16或VGG19。我在问题中添加了培训阶段的输出。到目前为止,我尝试使用SGD、Adagrad和AdadeltaOk,现在我看到您的培训损失在不断减少,而验证损失没有改变(这意味着网络可能过度拟合)。您可以尝试将“辍学率”增加到0.7或阻止/删除某些层(请小心)。另外,似乎使用另一个预先训练的网络解决了这个问题,对吗?荒谬的是,我获得了更好的结果,将辍学率设置为0.3,冻结前80层,再加上所有批量标准化层:通过这种设置,最终精度达到0.56,这仍然非常糟糕。是的,使用InceptionV3模型可以完美地工作