tensorflow的tf.identity的函数理解

tensorflow中变量的定义

tf.identity是tensorflow定义变量的一种方法,要理解tf.identity首先要理解tensorflow中定义变量的方法:

  • 直接定义法tf.Variable:
x = tf.Variable(1.0,name='x')
  • tf.get_variable法
    tf.get_variable不仅仅可以定义一个新变量,而且还可以用于获取已经定义的变量,相当于c++里的变量声明;
x = tf.get_variable("x",1.0)
  • tensor操作符/运算函数
    通过加减乘除,矩阵分解等一系列的tensor运算产生一个新变量。
x = tf.Variable(-1.0)
y = tf.Variable(0.0)
z = x+y
print(z)
>>Tensor("add_1:0", shape=(), dtype=float32)
  • tf.identity,下面将详细讲述。
    y = tf.identity(x)表示定义一个新的tensor变量y,并将x的值来初始化y。
    来看如果将一个tenso人直接用“=”赋值给另一个变量,在tensorflow中这表示什么意思,即:
    x = t f . V a r i a b l e ( − 1.0 ) y = x x = tf.Variable(-1.0)\\ y=x x=tf.Variable(1.0)y=x
    上述按“=”构造出来一个y变量,这种方式是定义出一个新的tensor变量吗?答案是否定的,这种y=x,如果x是一个tensor,表示定义了一个
    x的引用,什么意思呢,就是定义了一个x的别名,此时的x和y在内存中是同一块地址,看下面的例子
import tensorflow as tf
x = tf.Variable(-1.0)
y = x
print("x的内存地址:",id(x))
print("y的内存地址:",id(y))
>>x的内存地址: 139647031578016
>>y的内存地址: 139647031578016

x是tensorflow的一个节点,y是x的一个别名,因此,计算图上的节点不变;
而如果用y=tf.identity(x)定义y,则x和y的变量内存地址是不一样的,因为用x初始化了y,所以,当y运行时,当时的x和y的值相同:

import tensorflow as tf
x = tf.Variable(-1.0)
y = tf.identity(x)
>>x的内存地址: 140172597910944
>>y的内存地址: 140171828350536

通过上面的分析发现,当然我们也可以用运算来实现定义一个新的变量,这里我们随便选取加法运算,将x加上一个值为0的tensor,就得到了y,从而实现了定义了一个新tensor变量y,并用x的值来初始化y的想法:

import tensorflow as tf
x = tf.Variable(-1.0)
y = x+tf.constant(0.0) # 等价于y = tf.identity(x)
print("x的内存地址:",id(x))
print("y的内存地址:",id(y))
>>x的内存地址: 140642774674848
>>y的内存地址: 140642005135312

tf.identity与“=”的区别案例演示

看完上述的分析后,来看一些常用的演示tf.identity与“=”号的案例演示,该案例需要没运行一次y,首先需要对x加1,然后将值赋值给另一个tensor y,并打印。再来看 tf.control_dependencies表示的意义:
with tf.control_dependencies([x_plus_1]):
定义新的tensor y
表示如果在with块内定义了新的tensor变量,也就是给计算图上增加了新的节点,如果运行这个新的节点时,会首先运行x_plus_1节点,然后再运行新的节点。所以,我们就可以推算出下面三种写法:

  • y=x
  • y=tf.identity(x)
  • y = x + tf.constant(.0)
    第一种写法,没有定义新的tensor,因此,计算图上没有出现新的节点,运行y时,x不会加1;后面两种写法定义了新的tensor变量y,计算图上出现了新的节点,当运行y时,x会加1。

import tensorflow as tf
x = tf.Variable(-1.0)
y = tf.Variable(0.0)
#返回一个op,表示给变量x加1的操作
x_plus_1 = tf.assign_add(x, 1)
with tf.control_dependencies([x_plus_1]):
    y = x # 没有定义新的tensor,因此,计算图上没有出现新的节点,运行y时,x不会加1
    # y = tf.identity(x) # 等价于x + tf.constant(.0) # 定义了新的tensor,因此,计算图上出现了新的节点,运行y时,x会加1
    # y = x + tf.constant(.0) # 定义了新的tensor,因此,计算图上出现了新的节点,当运行y时,x会加1
init = tf.initialize_all_variables()
# y的eval一次,相当于计算节点执行一次运算,计算节点依赖于x
with tf.Session() as session:
    init.run()
    for i in range(5):
        print(y.eval())

运行的结果是:

>>-1.0
-1.0
-1.0
-1.0
-1.0
>>Process finished with exit code 0
后面两种的实现,运行结果为:
import tensorflow as tf
x = tf.Variable(-1.0)
y = tf.Variable(0.0)
#返回一个op,表示给变量x加1的操作
x_plus_1 = tf.assign_add(x, 1)
with tf.control_dependencies([x_plus_1]):
    # y = x # 没有定义新的tensor,因此,计算图上没有出现新的节点,运行y时,x不会加1
    y = tf.identity(x) # 等价于x + tf.constant(.0) # 定义了新的tensor,因此,计算图上出现了新的节点,运行y时,x会加1
    # y = x + tf.constant(.0) # 定义了新的tensor,因此,计算图上出现了新的节点,当运行y时,x会加1
init = tf.initialize_all_variables()
# y的eval一次,相当于计算节点执行一次运算,计算节点依赖于x
with tf.Session() as session:
    init.run()
    for i in range(5):
        print(y.eval())

运行的结果是:

>>0.0
1.0
2.0
3.0
4.0
>>Process finished with exit code 0

总结:

tensorflow用c++实现,很多地方都有c++的影子,刚开始上手时直接跑项目,发现学习tensorflow很吃力,而如果把tensorflow看做是c++的一个变种,从变量的定义,运算,for循环,函数等编程的一般步骤来理解tensorflow时,tensorflow瞬间就变的很简单。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值