TensorFlow基本运算


注:TensorFlow1.x仍是目前较流行的框架,还具有较高的研究价值。因此,本文语法是基于TensorFlow1.x的

一、会话

会话的模式 I

#定义计算图
tens1 = tf.constant([1,2,3])
#创建一个会话
sess = tf.Session()
#使用这个创建好的会话来得到关心的运算的结果。比如可以调用sess. run(result)来得到张量result的取值
print(sess.run(tens1))
#关闭会话使得本次运行中使用到的资源可以被释放
sess.close()

[1 2 3]

但在程序运行过程中,往往会出现异常。这时候有可能会导致session.close函数不能正常运行,从而造成资源泄露。
于是,我们可以考虑捕捉异常。

tens1 = tf.constant([1,2,3])
sess = tf.Session()
try:
	print(sess.run(tens1))
except:
	print("Exception!")
finally:
	sess.close()

会话的模式 II

#定义计算图
node1 = tf.constant(3.0,tf.float32, name= "node1")
node2 = tf.constant(4.0,tf.float32, name= "node2")
result = tf.add(node1, node2)
#创建一一个会话,并通过Python中的上下文管理器来管理这个会话
with tf.Session() as sess:
	#使用这创建好的会话来计算关心的结果
	print(sess. run(result)) 
#不需要再调用Session.close()函数来关闭会话
#当上下文退出时会话关闭和资源释放也自动完成了

7.0


TensorFlow不会自动生成默认的会话,需要手动指定
当默认的会话被指定之后可以通过tf.Tensor.eval函数来计算一个张量的取值

#定义计算图
node1 = tf.constant(3.0,tf.float32, name= "node1")
node2 = tf.constant(4.0,tf.float32, name= "node2")
result = tf.add(node1,node2)

sess = tf.Session()
#注册成为默认的会话
with sess.as_default():
	print(result.eval())

7.0


下面的代码也可以完成相同的功能

#定义计算图
node1 = tf.constant(3.0,tf.float32, name= "node1")
node2 = tf.constant(4.0,tf.float32, name= "node2")
result = tf.add(node1,node2)

sess = tf . Session()
#下面两个命令有相同的功能
print(sess.run(result))
print (result.eval(session=sess))

7.0
7.0

如果把此处的参数session=sess删除,则会报错。上一段代码之所以不报错,就是因为已经注册了默认会话。

交互式环境下设置默认会话

在交互式环境下,通过设置默认会话来获取张量的取值更加方便
使用tf.InteractiveSession函数会自动将生成的会话注册为默认会话

node1 = tf.constant(3.0,tf.float32, name= "node1")
node2 = tf.constant(4.0,tf.float32, name= " node2")
result = tf.add(node1,node2)

sess = tf.InteractiveSession()

print(result.eval())
sess.close()

7.0

二、常量和变量

常量

创建:constant_ name = tf. constant (value)

a = tf.constant(1.0, name='a')
b = tf.constant(2.5, name='b')
C = tf.add(a, b, name='c')

sess = tf.Session()
C_value = sess. run(c)
print(c_value)
sess. close()

3.5

变量

创建:name_variable = tf. Variable (value,name)
个别变量初始化:init_op = name_variable. initializer ()
所有变量初始化:init_op = tf.global_variables_initializer ()

node1 = tf.Variable(3.0,tf.float32, name= "node1" )
node2 = tf.Variable(4.0,tf.float32, name=" node2")
result = tf.add(node1, node2, name= 'add')

sess = tf .Session()

#变量初始化
init = tf.globa1_variables_initializer()
sess.run(init)
#以上代码在Session对话变量后,增加了一个init初始化变量,并调用会话的run命令对参数进行初始化。
print(sess.run(result))

7.0

三、变量赋值

一般情况下,TensorFlow中的变量定义后,无需人工赋值。而特殊情况需要人工更新的,可用变量赋值语句:update_op = tf.assign(variable_to_be_updated, new_value)

#通过变量赋值输出1、2、3...10
import tensorflow as tf
tf.reset_default_graph() #清除default graph和不断增加的节点(清空计算图)
value = tf.Variable(0,name="value")
one = tf.constant(1)
new_value = tf.add(value,one)
update_value = tf.assign(value, new_value)

init = tf.global_variables_initializer()
with tf.Session() as sess :
	sess.run(init)
	for _ in range(10):
		sess.run(update_ value)
		print(sess.run(value))
		
#logdir改为自己机器上的合适路径
logdir='#path'

#生成一个写日志的writer,并将当前的TensorFlow计算图写入日志
writer = tf.summary.FileWriter(logdir,tf.get_default_graph())
writer.close()

以上部分代码是为了内部可视化添加的

四、占位符、数据填充和数据获取

placeholder占位符

TensorFlow中的有些变量,在定义时不知道其数值,只有在程序运行时,才由外部输入(如训练数据),此时就需要使用占位符。
定义:tf.placeholder(dtype.shape=None,name=None)

x = tf.placeholder(tf.float32,[23],name='tx')
#此代码生成一个2x3的二维数组,矩阵中每个元素的类型都是tf.fLoat32,内部对应的符号名称是tx

Feed提交数据和Fetch提取数据

如果构建了一个包含placeholder操作的计算图,当在session中调用run方法时,placehoIder占用的变量必须通过feed_dict参数传递进去,否则报错。

import tensorflow as tf
a = tf.p1aceholder(tf.float32,name='a')
b = tf.placeholder(tf.float32,name='b')
C = tf.multiply(a, b, name='c')

init = tf.global_variables_initializer()
with tf.Session() as sess:
	sess.run(init)
	#通过feed_dict的参数传值,按字典格式
	result = sess.run(c, feed_dict={a:8.0, b:3.5})
	print(resu1t)

28.0

此处删除sess.run(init)不会报错,placeholder不等同于变量,不需要初始化。


多个操作可以通过一次Feed完成执行

import tensorflow as tf
a = tf.placeholder(tf.float32, name='a')
b = tf.placeholder(tf.float32, name='b')
C = tf.multiply(a, b, name='c')
d = tf.subtract(a, b, name='d')

init = tf.global_variables_initializer()
with tf.Session() as sess:
	sess. run(init)
	#将c和d组成一个列表
	result = sess.run([c,d], feed_dict={a:[8.0,2.0,3.5], b:[1.5,2.0,4.]})
	print(result)
	#取结果中的第一个
	print(resu1t[0])

[array([ 12. , 4., 14.], dtype=float32), array([ 6.5,0. ,-0.5], dtype=float32)]
[12.   4.   14.]


一次返回多个值分别赋给多个变量

import tensorflow as tf
a = tf.placeholder(tf.float32, name='a')
b = tf.placeholder(tf.float32, name='b')
C = tf.multip1y(a, b,name='c' ) 
d = tf.subtract(a, b,name='d' )

init = tf.globa1_variables_initializer()
with tf.Session() as sess:
	sess.run(init)
	#返回的两个值分别赋给两个变量
	rc,rd = sess.run([c,d], feed_dict={a:[8.0,2.0,3.5], b:[1.5,2.0,4.]})
	print("value of c=",rc,"value of d=",rd)

value of c=[12.  4.  14.] value of d=[6.5  0.  -0.5]

发布了3 篇原创文章 · 获赞 5 · 访问量 304

猜你喜欢

转载自blog.csdn.net/TransEcho/article/details/105055271