【问题标题】:Transfer learning or fine-tuning迁移学习或微调
【发布时间】:2022-01-11 14:10:10
【问题描述】:

请添加一些上下文来解释代码部分(或检查您是否没有错误地将所有问题格式化为代码)

                                               include_top=False, 
                                               weights='imagenet')

x = base_model.output
x = tf.keras.layers.GlobalAveragePooling2D()(x)
x = se_model.input,outputs=prediction_layer)



return model

【问题讨论】:

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


    【解决方案1】:

    当您下载基本模型时,它会下载其架构及其权重。从单台 PC 训练这些高级模型是不可能的。这就是为什么我们从互联网上下载预训练模型,然后使用我们自己的数据集重新训练它们来微调它们。

    # Fine-tune from this layer onwards
    for layer in model.layers[:fine_tune_at]:
        layer.trainable=False
    for layer in model.layers[fine_tune_at:]:
        layer.trainable=True
    

    正如您在上面看到的,您正在冻结预训练模型的初始层的权重,因为您不想搞砸它,只需要根据您的 I/O 更改最后一个输出层。

    【讨论】:

    • 那么这种结构是在微调 DenseNet 模型吗?
    • 从这里代码中,您将获得一个准备好迁移学习的模型,完整代码,在调用此方法后,您将在您的数据集上调用此函数返回的模型上的拟合函数选择。希望你现在明白了。
    • @deny 我们基本上只微调最后一层。如果我们没有设置“.trainable = False”,我们将微调整个 DenseNet。关键是除了最后一层之外的其他层包含非常有用的信息,这些信息不容易改进,因此我们尽量不要把它弄乱,只更新最后一层。您可能还会遇到一些示例,其中您甚至不更改最后一层而是添加一个新层,因为最后一层也包含非常有用的信息。一个非常常见的例子是 BERT。
    • 谢谢!这意味着上面的代码只调整了网络的最后一层。你是指全连接层还是哪一层?