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瞬间就变的很简单。