tensorflow tf.Variable()和tf.get_variable()详解_get_variable 2.0-程序员宅基地

技术标签: Tensorflow  tensorflow  深度学习  tf.Variable  tf.get_variable  

一、tf.Variable()

(1)参数说明

tf.Variable是一个Variable类。通过变量维持图graph的状态,以便在sess.run()中执行;可以用Variable类创建一个实例在图中增加变量;

Args参数说明:

initial_value:Tensor或可转换为Tensor的Python对象,它是Variable的初始值。除非validate_shape设置为False,否则初始值必须具有指定的形状。也可以是一个可调用的,没有参数,在调用时返回初始值。在这种情况下,必须指定dtype。 (请注意,init_ops.py中的初始化函数必须首先绑定到形状才能在此处使用。)

trainable:如果为True,则会默认将变量添加到图形集合GraphKeys.TRAINABLE_VARIABLES中。此集合用于优化器Optimizer类优化的的默认变量列表【可为optimizer指定其他的变量集合】,可就是要训练的变量列表。

collections:一个图graph集合列表的关键字。新变量将添加到这个集合中。默认为[GraphKeys.GLOBAL_VARIABLES]。也可自己指定其他的集合列表;

validate_shape:如果为False,则允许使用未知形状的值初始化变量。如果为True,则默认为initial_value的形状必须已知。

caching_device:可选设备字符串,描述应该缓存变量以供读取的位置。默认为Variable的设备。如果不是None,则在另一台设备上缓存。典型用法是在使用变量驻留的Ops的设备上进行缓存,以通过Switch和其他条件语句进行重复数据删除。

name:变量的可选名称。默认为“Variable”并自动获取。

variable_def:VariableDef协议缓冲区。如果不是None,则使用其内容重新创建Variable对象,引用图中必须已存在的变量节点。图表未更改。 variable_def和其他参数是互斥的。

dtype:如果设置,则initial_value将转换为给定类型。如果为None,则保留数据类型(如果initial_value是Tensor),或者convert_to_tensor将决定。

expected_shape:TensorShape。如果设置,则initial_value应具有此形状。

import_scope:可选字符串。要添加到变量的名称范围。仅在从协议缓冲区初始化时使用。

(2)使用tf.Variable定义变量常用的两种方式

常用的参数包括初始化值和名称name(是该变量的唯一索引):

1、用固定的值初始化变量

w = tf.Variable(<initial-value>,name=<optional-name>)

2、用tf的初始化器初始化变量

w = tf.Variable(tf.truncated_normal([3,4],mean=0,stddev=.5),name='weight')

用tf的初始化器initializer op初始化变量必须指定变量shape,用name指定名称

注意:这里只是定义了变量的初始化方式,并没有进行变量初始化。要在sess中执行初始化操作。

(3)执行变量初始化的三种方式

在使用变量之前必须要进行初始化,初始化的方式有三种:

1、在回话中运行initializer 操作

tf.global_variable_initializer().run()

2、从文件中恢复,如restore from checkpoint

saver = tf.train.Saver()
with tf.Session() as sess:
    ckpt = tf.train.get_checkpoint_state(checkpoint_path)
    if ckpt and ckpt.model_checkpoint_path:
        saver.restore(sess,ckpt.model_checkpoint_path)
    else:
        print('No checkpoint file found')

变量初始化方式1、2也就是在模型训练和测试中常用的两种方式,在模型训练时,需要随机给模型赋初值,使用tf.global_variable_initializer().run()去初始化变量,在模型测试(或者进行fine-tune)时,使用初始化方式2从保存的ckpt中初始化变量。

3、也可自己通过tf.assign()给变量附初值,

实际上用initializer初始化方法给变量赋初值就是调用tf.assign()将变量的值赋给变量,可以自己调用tf.assign()给变量赋初值;

a = tf.Variable(1.0)
a = tf.assign(a,5.0)
b = tf.Variable(2.0)
b = tf.assign(b,6.0)
c = a+b
with tf.Session() as sess:
#相当于调用tf.assign()给变量赋初值
    sess.run([a,b])
    print(c.eval())

二  tf.get_variable()

获取一个已经存在的变量或者创建一个新的变量

get_variable(
    name,
    shape=None,
    dtype=None,
    initializer=None,
    regularizer=None,
    trainable=True,
    collections=None,
    caching_device=None,
    partitioner=None,
    validate_shape=True,
    use_resource=None,
    custom_getter=None,
    constraint=None
)

Args参数说明:

name:新变量或现有变量的名称。

shape:新变量或现有变量的形状。

dtype:新变量或现有变量的类型(默认为DT_FLOAT)。

ininializer:如果创建了则用它来初始化变量。

regularizer:A(Tensor - > Tensor或None)函数;将它应用于新创建的变量的结果将添加到集合tf.GraphKeys.REGULARIZATION_LOSSES中,并可用于正则化。

trainable:如果为True,还将变量添加到图形集合GraphKeys.TRAINABLE_VARIABLES(参见tf.Variable)。

collections:要将变量添加到的图表集合列表。默认为[GraphKeys.GLOBAL_VARIABLES](参见tf.Variable)。

caching_device:可选的设备字符串或函数,描述变量应被缓存以供读取的位置。默认为Variable的设备。如果不是None,则在另一台设备上缓存。典型用法是在使用变量驻留的Ops的设备上进行缓存,以通过Switch和其他条件语句进行重复数据删除。

partitioner:可选callable,接受完全定义的TensorShape和要创建的Variable的dtype,并返回每个轴的分区列表(当前只能对一个轴进行分区)。

validate_shape:如果为False,则允许使用未知形状的值初始化变量。如果为True,则默认为initial_value的形状必须已知。

use_resource:如果为False,则创建常规变量。如果为true,则使用定义良好的语义创建实验性ResourceVariable。默认为False(稍后将更改为True)。在Eager模式下,此参数始终强制为True。

custom_getter:Callable,它将第一个参数作为true getter,并允许覆盖内部get_variable方法。 custom_getter的签名应与此方法的签名相匹配,但最适合未来的版本将允许更改:def custom_getter(getter,* args,** kwargs)。也允许直接访问所有get_variable参数:def custom_getter(getter,name,* args,** kwargs)。一个简单的身份自定义getter只需创建具有修改名称的变量是:python def custom_getter(getter,name,* args,** kwargs):return getter(name +'_suffix',* args,** kwargs)

注意:如果initializer初始化方法是None(默认值),则会使用variable_scope()中定义的initializer,如果也为None,则默认使用glorot_uniform_initializer,也可以使用其他的tensor来初始化,value,和shape与此tensor相同

正则化方法默认是None,如果不指定,只会使用variable_scope()中的正则化方式,如果也为None,则不使用正则化;

附: tf.truncated_narmal()和tf.truncated_naomal__initializer()的区别

  • tf.truncated_narmal(shape=[],mean=0,stddev=0.5)使用时必须制定shape,返回值是在截断的正态分布随机生成的指定shape的tensor
  • tf.truncated_normal_initializer(mean=0.stddev=0.5)调用返回一个initializer 类的一个实例(就是一个初始化器),不可指定shape,
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/MrR1ght/article/details/81228087

智能推荐

linux c之syscall使用例子_linux futex syscall-程序员宅基地

文章浏览阅读8.6k次。#include extern char **__environ; /* pointer to array of char * strings that define the current environment variables */extern int errno;extern char _end, _edata, _etext, __executable_start;in_linux futex syscall

电信光猫DDNS的设置经历-程序员宅基地

文章浏览阅读1.9w次。最近换了个中兴F650A的网关,上网、电话等都设置好了,花生壳的DDNS弄了很久都没弄好,记录一下过程,也给遇到类似情况的朋友提个醒。设置按默认的参数就可以了,如下图:刚开始弄了很久,卡在输入的主机名保存后,切换其它界面,再回去主机名又被清空了,也没有任何提示信息,反复试了多次都这样,网上搜索了很久也没找到什么有用的信息。后来无意中用 sendcmd 1 DB p DDNSClient 查看配置参数时发现有个 “Status”的字段有个认证错误之类的信息,再联想起花生壳主页上似乎看到过有需要实名认证,没_光猫ddns

fragment类onresume里面刷新操作处理-程序员宅基地

文章浏览阅读392次。今天项目中涉及fragment中嵌套多个fragment,但是要根据tag去展示对应的fragment,而不是默认展示的第一个fragment,如果使用activity很容易想到onpause(),onResume()中进行处理,但是你会发现fragment的onpause和onresume只调用一次,因此,需要通过重写onHiddenChanged来进行处理,该方法当fragment隐..._onresume 刷新数据源,怎么优化

前端HTML5+CSS3静态页面开发-博文尚美_博文尚美网站-程序员宅基地

文章浏览阅读7.8k次,点赞50次,收藏133次。前端html5+css3静态页面开发-博文尚美项目介绍博文尚美是一个设计网站, 此项目由html + css 布局完成页面,对前端基础知识的入门及掌握有非常好的提升效果,对html和css的使用及布局的体验能够建立起强大的信心。项目相关知识点HTML + CSS盒子模型 + 浮动 + 定位部分H5标签和C3属性项目演示图实现步骤1.在新建 index.html 中,创建基本框架,在标签里面使用标签引入 index.css。2.清除 css 默认样式,添加预设样式。代码如下:_博文尚美网站

oracle-listagg()函数实现列转行_oracle 列转行分隔符为换行符-程序员宅基地

文章浏览阅读1.5k次。oracle-listagg()函数实现列转行_oracle 列转行分隔符为换行符

Tkinter--Button和Scale样例_x *= self.scale_-程序员宅基地

文章浏览阅读3.1k次。#-*- coding: utf-8 -*-"""按扭操作"""import Tkinterclass Application(Tkinter.Frame): count = 0 def __init__(self, master=None): Tkinter.Frame.__init__(self, master)_x *= self.scale_

随便推点

前端学习笔记 // 设置背景颜色铺满页面以及去掉页面滚动条_前端铺满-程序员宅基地

文章浏览阅读893次。1.设置背景颜色铺满页面该点可参考以下文章:css如何让height:100%起作用?简单来说,就是如果你想让一个元素铺满页面,既设置 height:100%,那么你需要给这个元素的所有父元素的高度都设定一个有效值。因为浏览器在根据百分比来计算一个元素的高度时,需要先获取其父元素的高度,进而计算该元素的高度。<head> <style> html,body{ ..._前端铺满

mongoose对MongoDB数据库的增删查改-程序员宅基地

文章浏览阅读475次。专业课上,老师经常告诉我们,数据库的操作无非就是增删查改,即CURD,事实也正是如此,我们接下来看看mongoose操作no SQL数据库MongoDB的CURD。常见操作条件和API常见的查询条件$or 或关系 $nor 或关系取反$gt 大于$gte 大于等于$lt 小于$lte 小于等于$ne 不等于$in 在多个值范围内$nin 不在多个值范围内$all 匹配数组..._mongose 修改mongodb

python 1110: 最近共同祖先(函数专题)_cornell python 1110-程序员宅基地

文章浏览阅读134次。def common(x,y):if x==y:return xelif x>y:return common(x//2,y)else:return common(x,y//2)a,b=map(int,input().split())print(common(a,b))_cornell python 1110

ip地址转换省市_ip地址转省市区-程序员宅基地

文章浏览阅读1.1w次。前言最近开发一个支付系统,为了避免上游风控(路由规则限制),需要根据请求ip解析到对应物理地域信息,从而匹配到对应的地域商户,解决跨域消费问题。即将线上消费包装成线下消费。实例:支付宝线下商户不能线上交易。可用的api接口淘宝http://ip.taobao.com/service/getIpInfo.php?ip=61.183.230.xx{"code":0,"data":{"ip":"61.1..._ip地址转省市区

torch.load()加载模型时报错_torch.load('tensor.pt')加载出错-程序员宅基地

文章浏览阅读1.1w次,点赞6次,收藏3次。torch.load()加载模型时出现如下错误Traceback (most recent call last): File "demo_syncnet.py", line 26, in <module> s.loadParameters(opt.initial_model); File "/media/cj/75bb371d-0b6d-4995-bb72-060a4..._torch.load('tensor.pt')加载出错

ASP.Net TextBox 只读(ReadOnly)时后台不能赋值取值_asp.net后台文本框只读-程序员宅基地

文章浏览阅读801次。当把ASP.Net的自带控件TextBox设置为只读时,后台无法正常取值(取到的结果为“”)。解决办法如下:1. 不设置ReadOnly属性,添加事件onfocus=this.blur() 2、设置了ReadOnly属性后,通过Request来取值,如下:string Text = Request.Form["TextBox1"].Trim(); 3、在Pa_asp.net后台文本框只读

推荐文章

热门文章

相关标签