说明:本文是学习浙江大学吴明晖老师等开设的慕课<深度学习应用开发-TensorFlow实践>的学习笔记,写博客方便复习
TensorFlow是一个通过计算图的形式表述计算的编程系统,张量(tensor)+流(flow)
计算图是一个有向图,由一组节点(每个节点代表一个操作)和一组有向边(每条边代表节点之间的关系)构成
#一个简单计算图
import tensorflow as tf #引入tensorflow库
node1=tf.constant(3.0,tf.float32,name='node1') #定义一个名称为node1,类型为float32,大小为3.0的常量
node2=tf.constant(4.0,tf.float32,name='node2')
node3=tf.add(node1,node2) #两个常量相加
print(node3)
输出:Tensor(“Add_1:0”, shape=(), dtype=float32)
输出的结果不是一个具体的数字,而是一个张量结构,张量没有储存数字.
要想显示上一段代码的具体的结果,需要建立对话、执行对话才可以显示运行结果
#建立对话并显示运行结果
sess=tf.Session()
print("运行sess.run(node3)的结果是:",sess.run(node3))
#关闭session
sess.close()
输出:运行sess.run(node3)的结果是: 7.0
以最最最常用的Hello,World!为例:
(TensorFlow是这样子写的)
import tensorflow as tf
hello=tf.constant("Hello,World")
sess=tf.Session()
print(sess.run(hello))
接下来看看这个例子:
import tensorflow as tf
tens1=tf.constant([[[1,2,2],[2,2,3]],
[[3,5,6],[5,4,3]],
[[7,0,1],[9,1,9]],
[[11,12,7],[1,3,14]]],name="tens1")
print(tens1)
输出:Tensor(“tens1:0”, shape=(4, 2, 3), dtype=int32)
关键看看这个shape里的数的含义,首先shape里有3个元素,代表tens1是一个三维数组,从最外层括号开始看,次外层有4个元素,次次外层有2个元素,最小的括号里有3个元素,于是乎[4,2,3]代表着一个三维数组中有4个二维数组,一个二维数组中有2个一维数组,一个一维数组中有3个元素。
还有一个问题,我怎么取数组中的数呢?
#创建会话
sess=tf.Session()
print(sess.run(tens1)[1,0,2])
sess.close()
#下标从0开始
6
输出其实就是[3,5,6]中的6
补充:不带小数点的数会被默认为int32;带小数点的会被默认为float32
TensorFlow会对参与运算的所有张量进行类型的检查,发现类型不匹配时会报错
import tensorflow as tf
tf.reset_default_graph()
a=tf.Variable(1,name="a")
b=tf.add(a,1,name="b")
c=tf.multiply(b,4,name="c")
d=tf.subtract(c,b,name="d")
logdir='D:/log'
#生成一个写日志的writer,并将当前的TensorFlow计算图写入日志
writer=tf.summary.FileWriter(logdir,tf.get_default_graph())
writer.close()
进入tensorboard就可以看到如上计算图
TensorBoard不需要额外安装没在安装TensorFlow的时候就已经自动安装了
在Anaconda里打开TensorBoard的步骤是:1.打开Anaconda Prompt进入日志存放目录
2.输入命令:tensorboard --logdir=/path/log
3.复制输出的网址到浏览器即可
import tensorflow as tf
tens2=tf.constant([1,2,3])
#创建一个会话
sess=tf.Session()
#下面两个命令有相同的功能
print(sess.run(tens2))
#print(result.eval(session=sess))
#关闭会话使得本次运行中使用的资源可以被释放
sess.close()
import tensorflow as tf
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()函数来关闭会话
#当上下文退出时会话关闭和资源释放也自动完成了
import tensorflow as tf
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())
tf.InteractiveSession使用这个函数会自动将生成的会话注册为默认会话
import tensorflow as tf
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()
运行过程中值不会改变的单元,在TensorFlow中无须进行初始化操作
创建语句:constant_name=tf.constant(value)
在运行过程中值会改变的单元,在TensorFlow中须进行初始化操作
创建语句:name_variable=tf.Variable(value,name)
个别变量初始化:
init_op=name_variable.initializer()
所有变量初始化:
init_op=tf.global_variables_initializer()
TensorFlow中的变量定义后,一般无须人工赋值,系统会根据算法模型,训练优化过程中自动调整变量对应的数值
特殊情况下需要人工更新的,可用变量赋值语句epoch=tf.Variable(0,name=‘epoch’,trainable=False)
变量更新语句:update_op=tf.assign(variable_to_be_updated,new_value)
import tensorflow as tf
value=tf.Variable(0,name='value')
one=tf.constant(1,name='one')
new_value=tf.add(value,one)
update_value=tf.assign(value,new_value)
sum_value=tf.Variable(0,name='sum_value')
tem_value=tf.add(sum_value,value)
update_sum_value=tf.assign(sum_value,tem_value)
init=tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for _ in range(10):
sess.run(update_value)
sess.run(update_sum_value)
print(sess.run(sum_value))
tf.placeholder占位符,是一种Tensorflow中特有的一种数据结构,类似动态变量,函数的参数、或者C语言,python语言中的格式化输出时的“%”占位符
TensorFlow占位符Placeholder,先定义一种数据,其参数为数据的Type和Shape
占位符Placeholder的函数接口如下:
tf.placeholder(dtype,shape=None,name=None)
x=tf.placeholder(tf.float32,[2,3],name=‘tx’)
#此代码生成一个2x3的二维数组,矩阵中的每个元素的类型都是tf.float32,内部对应的符号名称是tx
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')
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(result)
多次操作可以通过一次feed完成执行,placeholder不能与变量等同,不需要初始化
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)
result=sess.run([c,d],feed_dict={a:[5.0,8.5,7.0],b:[2.0,6.0,4.5]})
#返回两个值分别赋给两个变量
rc,rd=sess.run([c,d],feed_dict={a:[6.5,8.5,7.0],b:[2.0,5.5,4.5]})
print(result)
print(result[1])
print("value of c=",rc,"value of d=",rd)