上次说到了 TensorFlow 从文件读取数据,这次我们来谈一谈变量共享的问题。

为什么要共享变量?我举个简单的例子:例如,当我们研究生成对抗网络GAN的时候,判别器的任务是,如果接收到的是生成器生成的图像,判别器就尝试优化自己的网络结构来使自己输出0,如果接收到的是来自真实数据的图像,那么就尝试优化自己的网络结构来使自己输出1。也就是说,生成图像和真实图像经过判别器的时候,要共享同一套变量,所以TensorFlow引入了变量共享机制。

变量共享主要涉及到两个函数: tf.get_variable(<name>, <shape>, <initializer>) 和 tf.variable_scope(<scope_name>)。

先来看第一个函数: tf.get_variable。

tf.get_variable 和tf.Variable不同的一点是,前者拥有一个变量检查机制,会检测已经存在的变量是否设置为共享变量,如果已经存在的变量没有设置为共享变量,TensorFlow 运行到第二个拥有相同名字的变量的时候,就会报错。

例如如下代码:

def my_image_filter(input_images):conv1_weights = tf.Variable(tf.random_normal([5, 5, 32, 32]),name="conv1_weights")conv1_biases = tf.Variable(tf.zeros([32]), name="conv1_biases")conv1 = tf.nn.conv2d(input_images, conv1_weights,strides=[1, 1, 1, 1], padding='SAME')return  tf.nn.relu(conv1 + conv1_biases)

有两个变量(Variables)conv1_weighs, conv1_biases和一个操作(Op)conv1,如果你直接调用两次,不会出什么问题,但是会生成两套变量;

# First call creates one set of 2 variables.
result1 = my_image_filter(image1)
# Another set of 2 variables is created in the second call.
result2 = my_image_filter(image2)

如果把 tf.Variable 改成 tf.get_variable,直接调用两次,就会出问题了:

result1 = my_image_filter(image1)
result2 = my_image_filter(image2)
# Raises ValueError(... conv1/weights already exists ...)

为了解决这个问题,TensorFlow 又提出了 tf.variable_scope 函数:它的主要作用是,在一个作用域 scope 内共享一些变量,可以有如下几种用法:

1)

with tf.variable_scope("image_filters") as scope:result1 = my_image_filter(image1)scope.reuse_variables() # or #tf.get_variable_scope().reuse_variables()result2 = my_image_filter(image2)

需要注意的是:最好不要设置 reuse 标识为 False,只在需要的时候设置 reuse 标识为 True。

2)

with tf.variable_scope("image_filters1") as scope1:result1 = my_image_filter(image1)
with tf.variable_scope(scope1, reuse = True)result2 = my_image_filter(image2)

通常情况下,tf.variable_scope 和 tf.name_scope 配合,能画出非常漂亮的流程图,但是他们两个之间又有着细微的差别,那就是 name_scope 只能管住操作 Ops 的名字,而管不住变量 Variables 的名字,看下例:

with tf.variable_scope("foo"):with tf.name_scope("bar"):v = tf.get_variable("v", [1])x = 1.0 + v
assert v.name == "foo/v:0"
assert x.op.name == "foo/bar/add"

TensorFlow 变量共享: get_variable相关推荐

  1. tensorflow变量共享——VariableScope的reuse模式、tf.get_variable()、tf.Variable() 探索

    文章目录 一.VariableScope的reuse模式的设置 1.1节 1.2节 1.3节 1.4节 1.5节 二.reuse模式对tf.Variable() 的影响 三.reuse模式对tf.ge ...

  2. TensorFlow 变量共享,命名空间

    原文出处: http://blog.csdn.NET/Jerr__y/article/details/70809528 前言: 本例子主要介绍 name_scope 和 variable_scope ...

  3. Tensorflow 变量的共享

    https://github.com/chenghuige/tensorflow-exp/blob/master/examples/sparse-tensor-classification/ tens ...

  4. 深度学习tensorflow变量op

    #-*-coding:utf-8-*- import tensorflow as tf #创建变量op #初始化的值 intit_value_1=tf.random_normal(dtype=tf.f ...

  5. Tensorflow变量作用域及变量初始化

    本文主要讲述Tensorflow中的变量作用域及变量初始化.先来区分几个概念: tf.name_scope():为了更好地管理变量的命名空间而提出的.比如在 tensorboard 中,因为引入了 n ...

  6. 14、TensorFLow 变量命名空间

    一.name_scope with tf.name_scope(name): name_scope: 为了更好地管理变量的命名空间而提出的.比如在 tensorboard 中,因为引入了 name_s ...

  7. Java多线程编程:变量共享分析(Thread)

    Java多线程编程:变量共享分析(Thread) Java 创建线程的两种方法 此处只简单讲下自己对java多线程变量共享的理解: 按照进程和多线程的原理,同一进程内的多个线程之间的地址空间是共享的( ...

  8. java多线程安全解决方案_《Java多线程编程核心技术(第2版)》 —1.2.8 实例变量共享造成的非线程安全问题与解决方案...

    1.2.8 实例变量共享造成的非线程安全问题与解决方案 自定义线程类中的实例变量针对其他线程可以有共享与不共享之分,这在多个线程之间交互时是很重要的技术点. 1.不共享数据的情况 不共享数据的情况如图 ...

  9. Java多线程变量共享与隔离

    文章目录 线程相关 线程的相关API 线程的调度 线程的优先级 方法和变量的线程安全问题 静态方法 非静态方法 静态变量 实例变量 局部变量 变量共享 共享变量线程安全问题 可见性 可见性举例 共享变 ...

  10. tensorflow 变量及命名空间 tf.Variable() vs tf.get_variable() tf.name_scope() vs tf.variable_scope()

    tf.Variable() vs tf.get_variable() tf.name_scope() vs tf.variable_scope() 1. 基础功能 1.1 tf.Variable() ...

最新文章

  1. 2022-2028年中国钢铁智能制造产业竞争现状及发展趋势分析报告
  2. 网站优化之如何辨别关键词的相关性?
  3. 图书管理系统之外键的增删改查
  4. [Linux]阿里云免费试用体验(在阿里云的ubuntu上部署个人服务)
  5. 【C语言探索之旅】第三部分第三课:SDL开发游戏之显示图像
  6. Xamarin Android 所见即所得问题
  7. java的System.getProperty()方法能够获取的值
  8. shell脚本判断文件类型
  9. 压测 mysql关闭连接_MySQL 压测
  10. Windows10安装Jmeter(图文教程)
  11. L1-038 新世界
  12. 桌面计算机图标变黑块,win7桌面图标变成有黑色方块怎么办?4个步骤轻松搞定...
  13. 小米便签维护——首页背景按键切换(按键隐藏)及欢迎界面
  14. 数学建模Latex简易模板
  15. 在Chrome浏览器中点击链接,打开IE浏览器,跳转到指定页面并传递参数
  16. 非常实用的,国内十大另类行业网址导航站
  17. Linux安装openoffice和swftools
  18. 关于以太坊公开的4个测试网络的区别:
  19. MYSQL高可用环境搭建
  20. 卧槽!可拆卸电池手机,又要杀回来了

热门文章

  1. Spring依赖注入的理解
  2. gridview中手工排序
  3. 图形算法 - 模糊函数比较,Blur Function Compare。
  4. ENVI入门系列教程---二、图像分析---13. 遥感动态监测
  5. ARCGIS中生成KML文件
  6. (超详细)夜间灯光总值TNLI如何得到
  7. php数组排除某个键_PHP根据key删除数组中指定的元素
  8. c语言模拟题第五套,2013年计算机二级C语言考试全真模拟试题第五套
  9. Docker与容器化-03-使用Dockerfile创建镜像
  10. linux的tar命令压缩26g文件,如何使用Linux上的tar命令压缩和解压缩文件 | MOS86