• 【Keras】重用预训练层


    重用预训练层

    • 找到一个现有的与要解决的任务相似的神经网络,重用该网络的较低层,此技术称为迁移学习。一般而言,当输入具有类似的低级特征时,迁移学习最有效。

    Keras进行迁移学习

    • 假设Fashion MNIST数据集上仅包含8个类别(出来凉鞋和衬衫之外的所有类别),有人在该数据集上建立并训练了Keras模型,称为模型A。你现在要处理另一项任务:训练一个二元分类器(正=衬衫,负=凉鞋)。数据集非常小,只有200张带标签的图像。
    • 首先加载模型A,并基于该模型创建一个新模型。我们重用除输出层之外的所有层:
    model_A = keras.models.load_model("my_model_A.h5")
    model_B_on_A = keras.models.Sequential(model_A.layers[:-1])
    model_B_on_A.add(keras.layers.Dense(1, activation="sigmoid"))
    
    • 1
    • 2
    • 3
    • 注意:model_A 和 model_B_on_A 现在共享一些层。当训练 model_B_on_A 时,也会影响 model_A。避免这种情况,需要在重用 model_A 的层之前对其进行克隆。然后复制其权重。
    model_A_clone = keras.models.clone_model(model_A)
    model_A_clone.set_weights(model_A.get_weights())
    
    • 1
    • 2
    • 在前几个轮次时冻结重用的权重,给新层一些时间来学习合理的权重。
    for layer in model_B_on_A.layers[:-1]:
        layer.trainable = False
    
    model_B_on_A.compile(loss="binary_crossentropy", optimizer="sgd",
                        metrics=["accuracy"])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 冻结或解冻层之后,总是要编译模型。训练模型几个轮次,然后解冻重用的层(这需要再次编译模型),并继续进行训练来微调任务B的重用层。解冻重用层后,降低学习率,可以避免损坏重用的权重:
    history = model_B_on_A.fit(X_train_B, y_train_B, epochs=4,
                              validation_data=(X_valid_B, y_valid_B))
    
    for layer in model_B_on_A.layers[:-1]:
        layer.trainable = True
        
    optimizer = keras.optimizers.SGD(lr=1e-4) # the default lr is 1e-2
    model_B_on_A.compile(loss="binary_crossentropy", optimizer=optimizer,
                        metrics=["accuracy"])
    history = model_B_on_A,fit(X_train_B, y_train_B, epochs=16,
                              validation_data=(X_valid_B, y_valid_B))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 迁移学习在小型密集型网络中不能很好工作,最适合使用在深度卷积神经网络,该神经网络倾向于学习更为通用的特征检测器。

    辅助任务的预训练

    • 如果没有太多标记的训练数据,最后一个选择是在辅助任务上训练第一个神经网络,这个辅助任务中你可以轻松得为其获得或生成标记的训练数据,然后对实际任务重用该网络的较低层。第一个神经网络将学习特征检测器,第二个神经网络可能会重用这些特征检测器。
    • 例如,如果你要构建一个识别人脸的系统,每个人只有几张照片,不足以训练一个好的分类器。但是,可以在网络上收集很多随机人物的图片,然后训练第一个神经网络来检测两个不同的图片是否是同一个人。这样的网络将会学习到很好的人脸特征检测器。
    • 自我监督学习是指从数据本身自动生成标签,然后使用有监督学习技术在所得到的“标签”数据集上训练模型。属于无监督学习的一种形式。
  • 相关阅读:
    信息学奥赛一本通(c++):1310:【例2.2】车厢重组
    IPC中的AIDL机制(二)
    网络安全笔记-Web服务器
    Mindspore 控制流中存在原地更新操作类副作用算子时循环值不更新问题记录
    sort(快速排列)的使用方法
    C#实现本地服务器客户端私聊通信
    arthas调查内存溢出 kibana宕机导致内存溢出
    曲线艺术编程 coding curves 第十二章 玑镂(扭索)纹
    工业蒸汽量预测(速通一)
    并发聊天服务器编写
  • 原文地址:https://blog.csdn.net/GW_Krystal/article/details/127404583