tensorflow基础知识(六) tensor变量 tf.Variable与tf.get_variable和tf.variable_scope

本文介绍了TensorFlow中tf.Variable与tf.get_variable的区别及使用方法,详细解释了tf.variable_scope的作用,并探讨了tf.get_variable的优点。
部署运行你感兴趣的模型镜像

tensorflow中的变量

1 tf.Variable与tf.get_variable创建变量

tf.Variabletf.get_variable都可以在tensorflow 定义变量,当他们用来创建变量时,他们的区别在于:

  • tf.Variable的变量名是一个 可选项。但是tf.get_variable必须指定变量名
  • tf.get_variable一旦指定了一个变量名,就不能再重复定义。除非结合tf.variable_scope中的reuse参数。tf.Variable用相同name参数指定两个变量是不会报错的。
v1 = tf.get_variable('v', shape=[1], initializer=tf.constant_initializer(1.0))
v2 = tf.get_variable('v', shape=[1], initializer=tf.constant_initializer(1.0))

ValueError: Variable v already exists, disallowed.

v1 = tf.Variable(tf.random_normal(shape=[2,2]), name='v')
v2 = tf.Variable(tf.random_normal(shape=[2,2]), name='v')

不会报错

函数定义格式如下:

  • tf.Variable(init_obj, name='v')用于生成一个初始值为init-obj的变量
    • init_obj为必须项,它是变量的初始化数据,一般对权重变量初始化采用正态随机初始化
    • name是一个 可选项
  • tf.get_variabl(name, shape=None, dtype=tf.float32, initializer=None,
    regularizer=None, trainable=True, collections=None))
    获取已存在的变量, 不存在则新建一个变量。

    • name是一个必要的参数选项
    • 变量的初始化可以利用initializer来实现。
      比如,Xavier初始化器
#变量创建的等价定义
v = tf.get_variable('v', shape=[1], initializer=tf.constant_initializer(1.0))
v = tf.Variable(tf.random_normal(shape=[2,2]), name='v')
2 tf.variable_scope()与tf.get_variable的配合使用

tf.variable_scope(name,resue=False)tf.get_variable经常配合使用,更加方便地管理参数命名

上面说到,tf.get_variable一旦指定了一个变量名,就不能再用该变量名重复定义。但是在神经网络中我们第一层和第二层的参数都可以称为wight时,就不可以直接使用tf.get_variable,而是和要结合tf.variable_scope()定义不同的命名空间将两种变量区别开来。

with tf.variable_scope('layer1',resue=False):
    v = tf.get_variable('v',[1],initializer=tf.constant_initializer(1.0))

with tf.variable_scope('layer2',resue=False):
    v1 = tf.get_variable('v',[1])

另外,还必须知道:

  • 当reuse为False或者None时(这也是默认值),同一个tf.variable_scope下面的变量名不能相同;

  • 当reuse为True时,tf.variable_scope只能获取已经创建过的变量

违反上面两个情况都会报错。

3 使用tf.get_variable的好处
  • 可以使用reuse参数,公共同一命名空间下的变量
  • 可以和tf.variable_scope结合,管理变量

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

### 解析 TensorFlow 版本不兼容导致的 `module 'tensorflow' has no attribute 'get_variable_scope` 错误 当遇到此类错误时,通常是因为代码尝试访问已被移除或更改名称的功能。具体到此情况,在 TensorFlow 2.x 中确实不再支持 `tf.get_variable_scope` 类似的变量作用域管理方式。 #### 使用 `tf.name_scope` 对于大多数场景而言,可以直接将原有的 `tf.variable_scope` 替换成 `tf.name_scope` 来实现相似功能[^1]: ```python with tf.name_scope('my_scope'): # 定义操作... ``` #### 利用 Keras 层级结构 如果项目允许重构,则建议转向更现代的做法——利用Keras API来定义模型及其参数。这种方式不仅简化了编码过程,而且更好地契合了TF2的设计理念: ```python import tensorflow as tf from tensorflow.keras.layers import Layer, Dense class MyLayer(Layer): def __init__(self, units=32, **kwargs): super(MyLayer, self).__init__(**kwargs) self.dense = Dense(units) def call(self, inputs): return self.dense(inputs) layer_instance = MyLayer() output_tensor = layer_instance(input_tensor) ``` #### 启用兼容模式 另一种解决方案是在现有环境中启用对旧版API的支持。这可以通过导入特定模块并禁用V2行为完成: ```python import tensorflow.compat.v1 as tf tf.disable_v2_behavior() # 接下来可以继续沿用 TF1 风格编写代码 with tf.variable_scope('scope_name'): ... ``` 需要注意的是这种方法虽然能快速解决问题,但从长远来看并不推荐,因为官方已经逐步淘汰这些接口[^4]。 #### 下降版本至稳定状态 最后的选择是完全切换回较早版本的TensorFlow (比如1.15),特别是当应用程序高度依赖于那些被废弃的功能时。不过这样做可能会引入其他兼容性性能方面的新挑战[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值