tensorflow冻结层的方法

其实常说的fine tune就是冻结网络前面的层,然后训练最后一层。那么在tensorflow里如何实现finetune功能呢?或者说是如何实现冻结部分层,只训练某几个层呢?可以通过只选择优化特定层的参数来实现该功能。

示例代码如下:

#定义优化算子
optimizer = tf.train.AdamOptimizer(1e-3)
#选择待优化的参数
output_vars = tf.get_collection(tf.GraphKyes.TRAINABLE_VARIABLES, scope=‘outpt‘)
train_step = optimizer.minimize(loss_score,var_list = output_vars)

#但是在这里,我却碰到了一个问题,关于adam的问题,如下:

Failed precondition: Attempting to use uninitialized value beta1_power

#查了一下,这个参数应该是Adam优化算子里的参数。问题出在定义优化算子的时间,晚于参数初始化的时间,导致beta1_power没有初始化,修改一下代码(调整代码顺序即可)

#即如下的顺序:
sess.run(init)
train_step = optimizer.minimize(loss_score,var_list=output_vars)

#改变成如下顺序即可
train_step = optimizer.minimize(loss_score,var_list=output_vars)
sess.run(init)

参考链接:
https://stackoverflow.com/questions/38749120/fine-tuning-a-deep-neural-network-in-tensorflow
https://stackoverflow.com/questions/45093499/how-to-fine-tune-weights-in-specific-layers-in-tensorflow

另外一个问题是,在用finetune的时候,发现速度并没有比retrain的速度快太多。分析原因在于finetune的时候,冻结了其它层,那么反向传播不会进入到这些层中,但是前向计算是会有的。如果想进一步加速finetune的速度,可以考虑先把所有数据执行一次前向操作,保存最后一层的中间的结果,然后以此中间结果为输入,训练整个网络。可以节省前向计算的一些时间。但如果finetune的epoch较少,那么感觉读写消耗的时间可能就已经很多了,不划算,加速效果也不明显。

原文地址:https://www.cnblogs.com/codehome/p/10621010.html

时间: 2024-08-29 15:52:18

tensorflow冻结层的方法的相关文章

R12供应商地点层付款方法SQL

--R12供应商地点层付款方法SQL:SELECT ipmv.payment_method_name     , ipmv.payment_method_code     , 'N' primary_flag     , 'Y' global  FROM iby_applicable_pmt_mthds aipmv, iby_payment_methods_vl ipmv WHERE aipmv.payment_method_code = ipmv.payment_method_code   A

调用tensorflow中的concat方法时Expected int32, got list containing Tensors of type '_Message' instead.

grid = tf.concat(0, [x_t_flat, y_t_flat, ones])#报错语句 grid = tf.concat( [x_t_flat, y_t_flat, ones],0) #楼主改后的代码 将数字放在后面,如果有三个参数 decoder_inputs = tf.concat([go_inputs, decoder_inputs_tmp], 1,name="dec_in") 调用tensorflow中的concat方法时Expected int32, got

jsp传到java的control层的方法

jsp传到java的control层的方法1.form表单 用<input type="submit">提交,提交到后台的参数在form表单内<form method="post" action="saveInfo"> <input type="text" name="username">usrenamexxx</input> <input type=&

TensorFlow 卷积层

TensorFlow 卷积层 让我们看下如何在 TensorFlow 里面实现 CNN. TensorFlow 提供了 tf.nn.conv2d() 和 tf.nn.bias_add() 函数来创建你自己的卷积层. 1 # Output depth 2 k_output = 64 3 4 # Image Properties 5 image_width = 10 6 image_height = 10 7 color_channels = 3 8 9 # Convolution filter 1

一种好的持久层开发方法——建立BaseDao和BaseDaoImpl

使用hibernate开发持久层时,我们会发现:虽然entity类的含义和需求不同,其对应的Dao层类对应的方法也是不同的.但是有许多方法操作确实相同的.比如实体的增加,删除,修改更新,以及许多常用的查询方法.这些都是可复用的.因此可以把这些操作写在一个BaseDao中,其他的dao都继承于这个Dao.每个子dao只写与自己的业务相关的方法,这样可以提高代码的复用,增加了开发效率,也方便今后可能的扩展.下面是我在我的项目中使用的BaseDao和BaseDaoImpl的使用方法.仅供参考: Bas

TensorFlow之Varibale 使用方法

------------------------------------------- 转载请注明: 来自博客园 xiuyuxuanchen 地址:http://www.cnblogs.com/greentomlee/ ------------------------------------------- Varibale 使用方法 实例: 实例讲解: 首先: #!/usr/bin/env python 这句话是指定python的运行环境,这种指定方式有两种,一种是指定python的路径---#

EF 通用数据层父类方法小结

MSSql 数据库 数据层 父类 增删改查: using System;using System.Collections.Generic;using System.Data;using System.Data.Entity;using System.Data.Entity.Infrastructure;using System.Linq;using System.Linq.Expressions;using System.Reflection;using System.Text; namespa

建立JNI层的本地对象,并与JAVA层交互方法

最近在做OpenCV4Android开发的时候,需要从摄像头捕获多个图片,传值给本地对象,每次捕获到图片都更新数据,最后将计算得到的数据传给JAVA层,并在界面中显示.经过摸索和调试后,找到了通过本地对象的地址,来实现JAVA和本地类交互的方法. 下面,通过一个小例子进行示例说明,本例子完成通过点击按钮控件,实现本地对象的成员数据自加,并显示的功能: 首先这是我们C++类的代码,能实现自加很简单的类,能完成测试就好: class TestNDK{ private: int num; public

关于我的php 框架,数据库层使用方法

框架中,数据库包含两层,一个zz_db.php , 一个zz_model.php 使用: 项目入口定义数据库参数: //mysqldefine ('ZZ_MYSQL_HOST' , '127.0.0.1');define ('ZZ_MYSQL_USER' , 'root');define ('ZZ_MYSQL_PW' , '');define ('ZZ_MYSQL_DB' , 'microblog_home'); //暂时只有一个数据库操作define ('ZZ_MYSQL_TABLE_PRE'