TensorFlow学习笔记(4) 变量管理及模型持久化

目录

变量管理

模型持久化

保存模型

读取模型

保存为可移植单个文件

持久化原理及数据格式

TensorFlow最佳实践样例程序

mnist_inference.py

mnist_train.py

mnist_eval.py


变量管理

随着神经网络的结构更加复杂,参数更多时,需要一个更好的方式来传递和管理变量。在TF中提供了通过变量的名字来创建或者获取一个变量的机制,通过这个机制不同函数可以直接通过变量的名字来直接使用变量。这机制主要是通过tf.get_variabletf.variable_scope实现的。

  • tf.get_variable

当tf.get_variable用来创建变量时,其功能与tf.Variable是等价的。比如:

v = tf.get_variable('v', shape=[1], initializer=tf.constant_initializer(1.0))
v = tf.Variable(tf.constant(1.0, shape=[1], name='v'))

tf.Variable和tf.get_variable最大的区别在于指定变量名称的参数。tf.Variable的变量名称是一个可选的参数,通过name='v'给出。但是tf.get_variable的变量名称是一个必填的参数,tf.get_variable会根据这个名字去创建参数,因此不能创建一个已经存在的名字,否则就会报错。

  • tf.variable_scope

如果需要通过tf.get_variable来获取一个已经创建的变量,则需要通过tf.variable_scope来生成一个上下文管理器来控制tf.get_variable函数获取已创建的变量:

#在名字为foo的命名空间中创建名字为v的变量
with tf.variable_scope('foo'):
    v = tf.get_variable('v',[1],initializer=tf.constant_initializer(1.0))

#由于已经存在v,所以以下代码将会报错
with tf.variable_scope('foo'):
    v = tf.get_variable('v',[1])
#Variable foo/v already exists, disallowed. Did you mean to set reuse=True in VarScope?

#在生成上下文管理器时,将reuse设置为True,即可获取变量
with tf.variable_scope('foo', reuse=True):
    v = tf.get_variable('v',[1])

tf.variable_scope函数会创建一个TF的命名空间,在命名空间内创建的变量名称都会带上这个空间名字作为前缀,所以这个函数也提供了一个管理变量命名空间的方式:

v1= tf.get_variable('v', [1])
print(v1.name)
#v:0
#0表示是这个变量运算的第一个结果

with tf.variable_scope('foo'):
    v2 = tf.get_variable('v', [1])
    print(v2.name)
#foo/v:0

with tf.variable_scope('foo'):
    with tf.variable_scope('bar'):
        v3 = tf.get_variable('v', [1])
        print(v3.name)
#foo/bar/v:0

 tf.variable_scope的参数reuse=True时,tf.get_variable将直接且只能获取已经存在的变量,若变量不存在,就会报错。

with tf.variable_scope('foo'):
    v = tf.get_variable('v', [1])
    print(v.name)
#foo/v:0

with tf.variable_scope('foo',reuse=True):
    v1 = tf.get_variable('v', [1])
    print(v = v1)#因为之前已经创建了foo/v 所以v=v1
    #True
    v1 = tf.get_variable('v1', [1]) # 这句会报错,因为并没有叫v1的变量

with tf.variable_scope('',reuse=True):
    v2 = tf.get_variable('foo/v', [1]) #另外也可以直接在一个空的空间直接获取其他空间的变量
    print(v2 = v) #因为之前已经创建了foo/v 所以v=v2
TensorFlow的7种不同的初始化函数
初始化函数 功能 主要参数
tf.constant_initializer 将变量初始化为给定常量 常量的取值
tf.random_normal_initializer 将变量初始化为满足正太分布的随机值 正太分布的均值和标准差
tf.truncated_normal_initializer 将变量初始化为满足正太分布的随机值,但若随机出来的值偏离平均值超过两个标准差,那么这个数将会被重新随机 正太分布的均值和标准差
tf.random_uniform_initializer 将变量初始化为满足平均分布的随机值 最大,最小值
tf.uniform_unit_scaling_initializer 将变量初始化为满足平均分布但不影响输出数量级的随机值 factor(产生随机值时乘以的系数)
tf.zeros_initializer 将变量设置为全为0 变量维度
tf.ones_initializer 将变量设置为全为1 变量维度

使用变量管理对(三)中的TF模型进行改进,这种方法可以提高复杂程序的可读性:

def inference(input_tensor,avg_class,regularizer):
    if avg_class==None:
        with tf.variable_scope('layer1'):
            weights = tf.get_variable('weights', [INPUT_NODE, LAYER1_NODE], initializer=tf.truncated_normal_initializer(stddev=0.1))
            biases = tf.get_variable("biases", [LAYER1_NODE], initializer=tf.constant_initializer(0.0))
    
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值