一、Tensorflow程序当中的重要组成部分
1.一个构建图阶段:图的定义
张量(Tensor):Tensorflow中的基本数据对象
节点(OP):运算操作
2.一个执行图的阶段:会话去运行程序
二、图:
图包含了一组tf.Operation代表计算单元的对象和tf.Tensor代表计算单元之间流动的数据。
Graph默认注册,并可通过调用访问 tf.get_default_graph 获取默认的图的内存地址
可以通过tf.Graph()创建图,如果要在这张图中创建OP,使用tf.Graph.as_default 中使用
g=tf.Graph()
with g.as_default():
c=tf.constant(11.0)
print(c)
三、TensorBoard:可视化
为了更方便 TensorFlow 程序的理解、调试与优化,有了TensorBoard 的可视化工具。
通过TensorBoard 查看tensorflow程序 图的结构的步骤:
(1) 数据序列化-events文件
因为TensorBoard 通过读取 TensorFlow 的事件文件来运行,需要将数据生成一个序列化的 Summary protobuf 对象,所以我们需要先把整个程序序列化到一个文件当中(这个序列化文件的命名为events.out.tfevents.{timestamp}.{hostname})
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
con1=tf.constant(11.0)
con2=tf.constant(12.0)
sum_=tf.add(con1,con2)
with tf.Session() as sess:
#在会话中序列化文件
file_write=tf.summary.FileWriter("./tmp/summary/",graph=sess.graph)
print(sess.run(sum_))
print(con1.graph)
(2)启动启动TensorBoard
我们cd 到安装tensorboard 的虚拟环境下运行如下命令
tensorboard --logdir="/tmp/tensorflow/summary/test/"
注:cmd 中如果是机器名:6006在浏览器中输入可能报无法访问此页面,此时输入http://localhost:6006/ 就可以进入TensorBoard 界面
在浏览器中打开 TensorBoard 的图页面 http://localhost:6006/ ,会看到与以下图形类似的图,在GRAPHS模块我们可以看到以下图结构
三、会话:运行程序,需要close关闭会话,释放资源
1.会话包含以下两种开启方式
tf.Session:用于完整的程序当中
tf.InteractiveSession:用于交互式上下文中的TensorFlow ,例如shell(cmd 命令行中使用)
2.会话Session()中的参数
1)target。 如果将此参数留空(默认设置),会话将仅使用本地计算机中的设备。可以指定 grpc:// 网址,以便指定 TensorFlow 服务器的地址,这使得会话可以访问该服务器控制的计算机上的所有设备。支持分布式
2)graph: 默认情况下,新的 tf.Session 将绑定到当前的默认图.并且只能当前的默认图中operation。
3)config: 此参数允许您指定一个 tf.ConfigProto 以便控制会话的行为。例如,ConfigProto协议用于打印设备使用信息
sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True,
log_device_placement=True))# 运行会话并打印设备信息
3.运行程序:
tf.operation.eval()也可以运行operation
run(fetches,feed_dict=None, options=None, run_metadata=None)
通过使用sess.run()来运行operation
fetches:运行对象不能是一些非op,tensor对象,比如int 、double(a=1,b=2,c=a+b run都不能运行a、b、c) 即其它不属于tensorflow的类型不行
feed_dict:运行时候提供数据,一般不确定数据形状时可以结合placeholder去使用,常用于在训练的时候实时提供要训练的批次数据
1)运行多个使用列表
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
con1=tf.constant(11.0)
con2=tf.constant(12.0)
sum_=tf.add(con1,con2)
with tf.Session() as sess:
print(sess.run([con1,con2,sum_]))
2)当没有明确定义数据的内容时,使用tf.placeholder占位,当想指定数据内容的时候使用 feed_dict(是一个字典类型)
plt=tf.placeholder(tf.float32,shape=[None,2]) #其中定义数据的形状,行不固定,列固定2列,在placeholder中不固定用None,
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
plt=tf.placeholder(tf.float32,shape=[None,2])
with tf.Session() as sess:
print(sess.run(plt,feed_dict={plt:[[1,2],[3,4],[23,33]]}))
请注意运行时候报的错误error:
RuntimeError:如果这Session是无效状态(例如已关闭)。
TypeError:如果fetches或者feed_dict键的类型不合适。
ValueError:如果fetches或feed_dict键无效或引用 Tensor不存在的键。
四、张量
TensorFlow 的张量就是一个 n 维数组, 类型为tf.Tensor。Tensor具有以下两个重要的属性
type:数据类型
shape:形状(阶)
1.张量的阶
2.创建张量
3.张量的变换
(1)张量dtype的改变
(2)改变张量的形状shape
1)tf.set_shape 静态修改形状:修改张量本身的形状,固定的形状不能修改,也不能跨阶修改
2)tf.reshape 动态修改形状:会创建新的张量,原来张量不会改变
五、变量OP
TensorFlow变量是表示程序处理的共享持久状态的最佳方法。变量通过 tf.Variable OP类以及tf.get_variable()类进行操作。变量的特点:存储持久化、可修改值、可指定被训练
(1)创建变量:变量需要显示初始化,才能运行值
tf.Variable(initial_value=None,trainable=True,collections=None,name=None)
initial_value:初始化的值
trainable:是否被训练
collections:新变量将添加到列出的图的集合中collections,默认为[GraphKeys.GLOBAL_VARIABLES],如果trainable是True变量也被添加到图形集合 GraphKeys.TRAINABLE_VARIABLES
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
var = tf.Variable(tf.random_normal([5, 6], mean=0.0, stddev=1.0), name='var_name')
init_varop=tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_varop)#需要先初始化变量才可以运行变量
print(sess.run(var))
(2)变量的方法:assign和assign_add都会修改原来张量的值
1)new_var = assign(value):给变量赋值一个新的值,但是value必须与原来的变量的shape必须一致不然会报错
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
var = tf.Variable(tf.random_normal([2, 3], mean=0.0, stddev=1.0), name='var_name')
new_var=var.assign([[1,2,3],[4,5,6]])
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run([var,new_var]))
输出结果
2) new_var = assign_add(delta):在原有的数据基础上加上delta,即矩阵的加法运算
(3)命名空间和变量的共享
共享变量的主要用途在一些网络当中的参数共享, 由于在TensorFlow当中,只要我们定义的OP,name参数指定一样,其实并不是同一个变量。如果想要达到重复利用变量的效果,我们就要使用tf.variable_scope()结合tf.get_variable()一起使用,
例如:我们创建如下同一个name的变量但是,tensorflow会自动加上_1,这样我们就不能共享变量
如果想让变量能够共享,我们需要如下步骤:
1)使用tf.variable_scope()修改OP命名空间,输出结果就会在变量name前面加上variable_scope命名的name
共享变量需要在tf.variable_scope(“name”)中的reuse=tf.AUTO_REUSE参数
with tf.variable_scope("name", reuse=tf.AUTO_REUSE):
2)tf.get_variable共享变量
with tf.variable_scope("name", reuse=tf.AUTO_REUSE):
var2 = tf.get_variable(initializer=tf.random_normal([2, 2], mean=0.0, stddev=1.0),
name="var2",
dtype=tf.float32)
var2_double = tf.get_variable(initializer=tf.random_normal([2, 2], mean=0.0, stddev=1.0),
name="var2",
dtype=tf.float32)
输出结果如下:不再加_1