说明
此系列文档为学习中国大学mooc,浙江大学开设的《深度学习应用开发-TensorFlow实践》随堂笔记。
介绍
- TensorFlow是一个开放源代码软件库,用于高性能数值计算。
- 借助其灵活的架构,可以将工作灵活地部署在多种平台(CPU,GPU,TPU)和多种设备(桌面设备,服务器集群,移动设备,边缘设备等)
- 最初由Google Brain团队的工程师与研究院研发,可为机器学习与深度学习提供强力支持。
开始
- TensorFlow 中 hellow world
import tensorflow as tf
#创建一个常量
hollow=tf.constant("hollow world")
#创建一个TF对话
sess=tf.Session()
#运行并获得结果
print(sess.run(hollow))
输出为b'hollow world'
b表示字节文字bytes literals
对话中run的是对象就是hollow
- tensorflow计算模型-计算图
- tensorflow=tensor(张量,数据结构:多维数组)+flow(流,计算模型:张量之间通过计算而转化的过程)
- tesnorflow是一种通过计算图的形式表述计算的编程系统。每一个计算都是计算图上的一个节点,节点之间的边描述了计算之间的关系
- 计算图是有向图,有两种边 常规边(实线) 表示数据依赖关系:输出与输入, 特殊边(虚线) 不携带值,比如 happens-before的关系
- 计算图 实例:
node1=tf.constant(3.0,tf.float32,name= "node1")
node2=tf.constant(4.0,tf.float32,name= "node2")
node3=tf.add(node1,node2)
print(node3)
- 输出为
Tensor("Add_1:0", shape=(), dtype=float32)
tensor
这里是一个数据结构,输出的不是一个具体的数字而是一个张量的结构。 - 注意标量与向量
- 建立流图或者计算图就是建立模型,执行对话才能提供数据获取结果。
sess=tf.Session()
print(sess.run(node1))
#关闭对话释放资源
sess,close()
张量
- 零阶张量为标量
scalar
,一个数 - 一阶张量为数组
vector
,是一个一维数组 - 多阶张量是n维数组。
-
张量
保存的是计算过程
不是数值 -
Tensor(name,shape,type)
name="nodename:src_output"
shape=()表示为标量
type=float32
每个张量唯一类型 - 描述张量的维度:阶段(rank),形状(shape),维数(dimension number)
- 通过下表获取值
t[i,j]
,i,j
从0
开始 - 数据类型
operation操作
- 节点就是操作
- 一次加法一次减法均为操作
- 重置计算图
tf.reset_default_graph()
Tensorflow基本运算
会话(session)
- 拥有并管理tensorflow程序运行时的所有
资源
- 创建
sess=tf.Session()
- 运行某个对象
sess.run(object)
- 计算完成后要
关闭会话
帮助资源回收
,sess.close()
- 一定要释放资源
sess=tf.Session()
try:
print(sess.run(object))
except:
print("Exception")
finially:
sess.close()
- 也可以通过上下文管理器退出语句段后自动释放资源
with tf.Session as sess:
sess.run(object)
- tensorflow 不会自动生成默认的会话,需要手动指定。但是默认后可以通过tf.Tensor.eval计算一个张量的取值。
result=tf.constant(3,0,name="result")
sess=tf.Session()
with sess.as_default:
print(result.eval())
或者
print(resulteval(session=sess))
或者注册会话并成为默认会话
sess=tf.InteractiveSession()
常量与变量
常量 constant
- 创建语句
constant_name=tf.constant(value,type,name)
变量 variable
1.创建 name_variable=tf.Variable(value,name)
2. 变量需要初始化
- 个别变量初始化
init_op=name_variable.initializer()
- 所有变量初始化
init_op=tf.global_variables_initializer()
初始化的操作也是一个结点需要初始化sess.run(init_op)
node1=tf.Variable(3,name="node1")
node2=tf.Variable(4,name="node2")
sess=tf.Session()
init=tf.global_variables_initializer()
sess.run(init)
print(sess.run(node2))
- 与传统编程语言不同,Tensorflow的变量定义后一般
无需
人工赋值。系统会根据算法模型,训练优化过程中`自动调整变量对应的数值 - 机器学习训练模型的时候,比如权重Weight变量w,经过多次迭代,会
自动
调。 - -不希望训练的时候被更改的话
epoch=tf.Variable(0,name='epoch',trianable=False)
- 需要人工更改
update_op=tf.assign(variable_to_be updated,new_value)
也需要run
- 举例1+2+3+4+…+10
import tensorflow as tf
var=tf.Variable(0,name="var")
output=tf.Variable(0,name="output")
new_var=tf.add(var,1)
updated=tf.assign(var,new_var)
final=tf.assign(output,output+updated)
init_op=tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_op)
for _ in range(10):
sess.run(final)
print(sess.run(output))
占位符 placeholder
- 有些变量初始化的时候并不能知道它的值只有当程序运行时由外部输入,比如训练数据,需要用到
占位符
-
tf.placeholder() 占位符
,特有的数据结构,类似于c语言或者Python中的%
x=tf.placeholder(tf,float32,[2,3],name='tx')
- Feed提交数据
feed_dict
通过字典方式传递参数给占位符例如result= sess.run(c,feed_dict={a:8.0,b:3.0})//a与b均是占位符
- 可以一次运行很多个节点
rc,rd=sess.run([c,d])
TensorBoard 可视化初步
- TensorBoard和TensorFlow 运行在不同的进程
tf.reset_default_graph()
logdir='D:/log'
'''
xxx
'''
writer=tf.summary.FileWriter(logdir,tf.get_default_graph())
writer.close()
- Anaconda Prompt
进入日志存放的目录
- 再运行TensorBoard,并将日志的地址指向日志输出的地址
tensorboard --logdir=/path/log
tensorboard --logdir=D:\log
默认的端口为6006
可以通过--port
更改启动服务的端口
复制网址到浏览器,点击graphs
选项即可
网上都说google chrome
浏览器兼容,而我遇见的情况是显示为空白
,解决方法
:换一个浏览器(手动滑稽)
end