交流群:462197261站长百科站长论坛热门标签收藏本站北冥有鱼 互联网前沿资源第一站 助力全行业互联网+
点击这里给我发消息
  • 当前位置:
  • Keras: model实现固定部分layer,训练部分layer操作

    北冥有鱼 教程大全 2020-06-28 ,,

    需求:Resnet50做调优训练,将最后分类数目由1000改为500。

    问题:网上下载了resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5,更改了Resnet50后,由于所有层均参加训练,导致训练速度慢。实际上只需要训练最后3层,前面的层都不需要训练。

    解决办法:

    ①将模型拆分为两个模型,一个为前面的notop部分,一个为最后三层,然后利用model的trainable属性设置只有后一个model训练,最后将两个模型合并起来。

    ②不用拆分,遍历模型的所有层,将前面层的trainable设置为False即可。代码如下:

    for layer in model.layers[:-3]:
     print(layer.trainable)
     layer.trainable = False

    注意事项:

    ①尽量不要这样:

    layers.Conv2D(filters1, (1, 1), trainable=False)(input_tensor)

    因为容易出错。。。

    ②加载notop参数时注意by_name=True.

    补充知识:Keras关于训练冻结部分层

    设置冻结层有两种方式。

    (不推荐)是在搭建网络时,直接将某层的trainable设置为false,例如:

    layers.Conv2D(filters1, (1, 1), trainable=False)(input_tensor)

    在网络搭建完成时,遍历model.layer,然后将layer.trainable设置为False:

    # 冻结网络倒数的3层
    for layer in model.layers[:-3]:
     print(layer.trainable)
     layer.trainable = False

    也可以根据layer.name来确定哪些层需要冻结,例如冻结最后一层和RNN层:

    for layer in model.layers:
     layerName=str(layer.name)
     if layerName.startswith("RNN_") or layerName.startswith("Final_"):
     layer.trainable=False

    可以在实例化之后将网络层的 trainable 属性设置为 True 或 False。为了使之生效,在修改 trainable 属性之后,需要在模型上调用 compile()。

    这是一个例子

    x = Input(shape=(32,))
    layer = Dense(32)
    layer.trainable = False
    y = layer(x)
     
    frozen_model = Model(x, y)
    # 在下面的模型中,训练期间不会更新层的权重
    frozen_model.compile(optimizer='rmsprop', loss='mse')
     
    layer.trainable = True
    trainable_model = Model(x, y)
    # 使用这个模型,训练期间 `layer` 的权重将被更新
    # (这也会影响上面的模型,因为它使用了同一个网络层实例)
    trainable_model.compile(optimizer='rmsprop', loss='mse')
     
    frozen_model.fit(data, labels) # 这不会更新 `layer` 的权重
    trainable_model.fit(data, labels) # 这会更新 `layer` 的权重

    在网络搭建时,可以考虑最后一个分类层命名和分类数量关联,这样当费雷数量方式变化时,model.load_weight(“weight.h5”,by_name=True)不会加载最后一层

    以上这篇Keras: model实现固定部分layer,训练部分layer操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持北冥有鱼。


    广而告之:
    热门推荐:
    HTML5 Canvas绘制五星红旗

    Canvas 绘图 API 都没有定义在 <canvas> 元素本身上,而是定义在通过画布的 getContext() 方法获得的一个“绘图环境”对象上。 Canvas API 也使用了路径的表示法。但是,路径由一系列的方法调用来定义,而不是描述为字母和数字的字符串,比如调用 beginPath() ···

    mysql查询时offset过大影响性能的原因和优化详解

    前言 mysql查询使用select命令,配合limit,offset参数可以读取指定范围的记录。本文将介绍mysql查询时,offset过大影响性能的原因及优化方法。 准备测试数据表及数据 1.创建表 CREATE TABLE `member` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(10)···

    asp.net OleDbCommand 的用法

    OleDbConnection con=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; data source=data.mdb"); con.Open(); OleDbCommand dc=new OleDbCommand("select name from us where id=2", con); textBox···

    js实现HTML中Select二级联动的实例

    效果图 选择后 js代码 <script language="javascript" type="text/javascript"> //定义 费用科目 数据数组 fylxArray = new Array(); fylxArray[0] = new Array("",""); fylxArray[1] = new Array("汽车费用","汽油费|过路费|修理费"); fylxArray[2] = new ···

    PHP接收App端发送文件流的方法

    本文实例讲述了PHP接收App端发送文件流的方法。分享给大家供大家参考,具体如下: 解决思路: 1. 客户端多张图片进行循环上传,同时附带参数,并用一定规则组合生产数据流(图片数据放在最后) 2. 使用数据流进行传输,php服务端用file_get_content('php://input')进行接收 3. ···

    基于ionic实现下拉刷新功能

    本文实例为大家分享了ionic实现下拉刷新功能的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>ionic</title> <!--记得导入ionic包和ionic样式--> <script src="···

    一个.net 压缩位图至JPEG的实例代码

    首先准备一张位图图像source.bmp,将它保存在bmp.aspx同一目录中 复制代码 代码如下:        <%@ Page language="c#" %>     <%@ Import Namespace="System.Drawing" %>     <%@ Import Nam···

    纯js实现遮罩层效果原理分析

    可以说这个功能,在我理解了前面的“贪吃蛇”之后,实在是与刚开始想象的难度差了好多,当然是这种方式有取巧之嫌,终归是实现了功能,我们来进行分析整理 1、实现原理 本片文章的 是实现原理如下: * 实际上弹出层、遮罩层和原页面显示分别为三个不同的div * 弹出层的···

    JS中使用react-tooltip插件实现鼠标悬浮显示框

    前段时间遇到的一个需求,要求鼠标悬停显示使用描述, 用到了react-tooltip插件,今天写一个总结 先看效果(为了方便参考,用的是原始样式): 文档参考地址: https://www.npmjs.com/package/react-tooltip 1, 首先在配置文件加上引用 2, 然后在页面内引入: 3, react-tooltip的使用···