目录
1.Sessionj(target='',graph=None,config=None)
一.安装
pip install tensorflow
二.TensorFlow结构分析
图:这是TensorFlow将计算表示为指令之间的依赖关系的一种表示方法
会话:这是TensorFlow跨一个或者多个本地或者远程设备运行数据流图的机制(tensorflow2中不用)
TensorFlow程序通常被组织成一个构建图阶段和一个执行图阶段。在构建图阶段,数据于操作的执行步骤被描述成一个图。在执行阶段,使用会话执行构建好的图中的操作。
python
import tensorflow as tf # 导入tensorflow
tf.Graph() # 构建图阶段
a=tf.constant(50) # 将这三步操作放在图上
b=tf.constant(30)
c=tf.add(a,b)
with tf.Session() as sess: # 使用会话执行图阶段
add_c=sess.run(c)
print(add_c)
运行代码的时候会有警告,可以使用命令关闭
python
# 关闭警告
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf # 导入tensorflow
a=tf.constant(50) # 将这三步操作放在图上
b=tf.constant(30)
c=tf.add(a,b)
with tf.compat.v1.Session() as sess: # 使用会话执行图阶段
add_c=sess.run(c)
print(add_c)
数据流图介绍
上图中是一个SGD的训练图,从下往上看,先输入数据,然后对这个数据标记和整理形状,在对数据进行一系列的数学操作,然后计算损失和更新参数。
三.图与TensorBoard
1.图结构
图包含了一组tf.operation代表的计算单元对象和tf.Tensor代表的计算单元之间流动的数据
2.图的相关操作
创建图:tf.Graph()
查看图:tf.get_default_graph()访问,
python
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf
a=tf.constant(50)
b=tf.constant(30)
# 创建操作
c=tf.add(a,b)
# 查看默认的图
print(tf.get_default_graph())
# 查看数据的图属性
print(a.graph)
print(b.graph)
# 查看操作的图属性
print(c.graph)
with tf.Session() as sess:
add_c=sess.run(c)
print(add_c)
打印出来后可以看到 同一个图中的属性,操作,图,对象都是一样的
3.自定义图
python
new_graph=tf.Graph()
print(new_graph)
4.开启会话Session中指定使用那个图
python
with tf.Session(graph=new_graph) as sess:
print(sess.run(c))
四.TensorBoard:可视化
TensorFlow可用于训练大规模深度神经网络所需的计算,为了更方便TensorFlow程序的理解,调试与优化,TensorFlow提供了TensorBoard可视化工具
1.数据序列化-events文件
TensorBoard通过读取TensorFlow的事件文件来运行,需要将数据生成一个序列化的Summary protobuf对象。
python
# 使用filewriter,写入事件文件到指定目录(最好用绝对路径),以提供给tensorboard使用
tf.summary.FileWriter('./tmp/summary/test/', graph=sess.graph)
这将在指定目录中生成一个event文件
2.启动TensorBoard
在终端中输入命令,指定上面生成的文件路径
python
tensorboard --logdir="./tmp/tensorflow/summary/test/"
在浏览器中打开TensorBoard的图页面127.0.0.1:6006
3.tensorflow2中使用tensorboard
以上是基于tensorflow1版本的使用方法,而在2中则没有Session也就是会话这一步骤了
在tensirflow2中tensorboard,参考官方文档:
1.使用Model.fit()训练
直接使用tf.keras中的callbacks就可以在训练时写入训练信息,训练结束后在命令行调用TensorBoard就可以了。
构建一个模型来测试以下
python
import tensorflow as tf
import tensorboard
import datetime
mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
def create_model():
return tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
model = create_model()
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# 定义日志目录,必须是启动web应用时指定目录的子目录,建议使用日期时间作为子目录名
log_dir="/home/chb/jupyter/logs/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1) # 定义TensorBoard对象
model.fit(x=x_train,
y=y_train,
epochs=5,
validation_data=(x_test, y_test),
callbacks=[tensorboard_callback]) # 将定义好的TensorBoard对象作为回调传给fit方法,这样就将TensorBoard嵌入了模型训练过程
也就是要先构建好这个模型的保存路径,然后使用 tf.keras.callbacks.TensorBoard将这个路径定义为对象,然后在训练的时候将定义好的对象作为回调传给fit方法,这样就将TensorBoard写入训练模型过程了
训练结束后在命令行中输入命令:
python
tensorboard --logdir fit_logs
然后点显示的http地址就可以看到
通过TensorBoard提供的图标,我们可以清楚的知道训练模型时loss和accuracy在每一个epoch中怎么变化的,在网页菜单中我们可以看到还有其他功能
scalars:可以看到accuracy,cross entropy,dropout ,bias,weights等的趋势
在images和audio下可以看到输入的数据
在graphs中可以看到模型的结构
在histogram可以看到activations,gradients或者weights等变化量的每一步分布,越靠前面就是越新的步数的结果
distribution和histogram是两种不同的形式,可以看到整体的形状
在embedding中可以看到PCA主成分分析方法将高维数据投影到3D空间的数据关系
2.TensorBoard的参数解释:
log_dir:保存TensorBoard要解析的日志文件的目录的路径
histogram_freq:频率(在epoch中),计算模型层的激活和权重直方图。如果设置为0,则不会计算直方图。必须为直方图可视化指定验证数据(或拆分)
write_graph:是否在TensorBoard中可视化渐变直方图,histogram_freq必须大于0
batch_size:用以直方图计算的传入神经元网格输入批的大小
write_images:是否在TensorBoard中编写模型权重以显示为图像
embeddings_freq:将保存所选嵌入层的频率(在epoch中)。如果设置为0,则不会计算嵌入。要在TensorBoard的嵌入选项卡中显示的数据必须作为embeddings_data传递。
embeddings_layer_names:要关注的层名称列表。如果为None或空列表,则将监测所有嵌入层。
embeddings_metadata:将层名称映射到文件名的字典,其中保存了此嵌入层的元数据。如果相同的元数据文件用于所有嵌入层,则可以传递字符串。
embeddings_data:要嵌入在embeddings_layer_names指定的层的数据。Numpy数组(如果模型有单个输入)或Numpy数组列表(如果模型有多个输入)。
update_freq:'batch'或'epoch'或整数。使用'batch'时,在每个batch后将损失和指标写入TensorBoard。这同样适用'epoch'。如果使用整数,比方说1000,回调将会在每1000个样本后将指标和损失写入TensorBoard。请注意,过于频繁地写入TensorBoard会降低您的训练速度。 还有可能引发的异常:
ValueError:如果设置了histogram_freq且未提供验证数据。
五:OP
1.常见的OP有
也就是操作对象比如上面的tf.add,一个操作对象(Operation)是TensorFlow图中的一个节点,可以接收0个或者多个输入Tensor,并且可以输出0个或多个Tensor,Operation对象是通过op构造函数,比如tf.matmul()创建的。
例如:c=tf.matmul(a,b)创建了一个Operation对象,类型为MatMul类型,它将张量a,b作为输入,c作为输出,并且输出数据,打印的时候也是打印数据,其中tf.matmul()是函数,在执行matmul函数的过程中会通过MatMul类创建一个与之对应的对象
python
con_a=tf.constant(50)
con_b=tf.constant(50)
con_c=tf.add(a,b)
print("打印con_a:\n", con_a)
print("打印con_b:\n", con_b)
print("打印sum_c:\n", sum_c)
# 打印后显示:
"""
打印con_a:
Tensor("Const:0", shape=(), dtype=float32)
打印con_b:
Tensor("Const_1:0", shape=(), dtype=float32)
打印sum_c:
Tensor("Add:0", shape=(), dtype=float32)
"""
打印出来的是张量值,可以理解成OP当中包含了这个值。并且每一个OP指令都对应一个唯一的名称,比如上面的Const:0 这个在TensorBoard上面也可以显示
注意:tf.Tensor对象以输出张量的tf.Operation明确命名。张量名称形式为"<OP_NAME>:<i>"。其中<OP_NAME>是生成该张量的名称<i>是一个整数,它表示该张量在指令的输出中的索引(一般都是0)
2.指令名称
tf.Graph对象为其包含的tf.Operation对象定义的一个命名空间。TensorFlow会制动为图中的每一个指令选择一个唯一的名称,用户也可以指定描述性名称。例如tf.constant(50, name='num')创建了一个名为"num"的新tf.Operation并返回一个名为"num:0"的tf.Tensor。如果图里面以包含名为num1的指令,则会在名称上加上1,2等字符来保证名称的唯一性
六.会话
一个运行TensorFlow operation的类,会话包含以下两种开启方式
it.Session:用于完整的程序当中
tf.InteractiveSession:用于交互上下文中的TensorFlow,例如shell
1.Sessionj(target='',graph=None,config=None)
会话可能拥有的资源,如 tf.Variable,tf.QueueBase和tf.ReaderBase。当这些资源不再需要时,释放这些资源非常重要。因此,需要调用tf.Session.close会话中的方法,或将会话用作上下文管理器。
target:如果将此参数留空(默认设置),会话将仅使用本地计算机中的设备。可以指定 grpc:// 网址,以便指定 TensorFlow 服务器的地址,这使得会话可以访问该服务器控制的计算机上的所有设备。
graph:默认情况下,新的 tf.Session 将绑定到当前的默认图。
config:此参数允许您指定一个 tf.ConfigProto 以便控制会话的行为。例如,ConfigProto协议用于打印设备使用信息
2.会话中的run()
run(fetches,feed_dict=None, options=None, run_metadata=None)
通过使用sess.run()来运行operation
fetches:单一的operation,或者列表、元组(其它不属于tensorflow的类型不行)
feed_dict:参数允许调用者覆盖图中张量的值,运行时赋值
与tf.placeholder搭配使用,则会检查值的形状是否与占位符兼容。
3.feed操作
placeholder提供占位符,run时候通过feed_dict指定参数
python
def session_run_demo():
"""
会话的run方法
:return:
"""
# 定义占位符
a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
sum_ab = tf.add(a, b)
print("sum_ab:\n", sum_ab)
# 开启会话
with tf.Session() as sess:
print("占位符的结果:\n", sess.run(sum_ab, feed_dict={a: 3.0, b: 4.0}))
return None
七.张量
TensorFlow的张量是一个n维数组,类型为tf.Tensor。Tensor具有两个属性:type数据类型和shape形状(阶)
1.张量的类型
2.张量的阶
形状只有0阶,1阶,2阶
python
tensor1=tf.constant(4)
tensor2=tf.constant([1,2,3,4])
linear_squares=tf.constant([[4],[9],[16],[25]],dtype=int32)
print(tensor1.shape)
3.创建张量的指令
1.tf.zeros(shape,dtype=tf.float32,name=None)创建一个都是0的张量,
2.tf.zeros_like(tensor,dtype=None,name=None)创建一个形状像tensor的全为0的张量
3.tf.ones(shape,dtype=None,name=None)创建一个全为1的张量
4.tf.ones_like(tensor,dtype=None,name=None)创建一个形状和tensor相同的全为1的张量
5.tf.fill(dims, value ,name=None)创建一个形状为dims并且以value数据填充的张量
6.tf.constant(value,detype,shape,name)创建一个常数张量
7.tf.truncated_normal(shape,mean=0.0,stddev=1.0,dtype=tf.float32,seed=None,name=None)创建一个从截断的正太分布中输出随机值的形状为shape的张量,且数据不会超过标准差
8.tf.random_norma(shape,mean=0.0,stddev=1.0,dtype=tf.float32,seed=None,name=None)创建一个正太分布的随机值的张量
4.张量的变换
1.类型改变
2.形状改变
张量具有两种形状改变,动态形状和静态形状
tf.reshape
tf.set_shape
静态形状转变:1阶转到1阶,2阶转到2阶,不能跨阶转变形状。对于已经固定的张量的静态性状,不能在设置静态形状。
动态形状:动态创建新张量时,张量的元素个数必须匹配
八.变量OP
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
变量需要显示初始化才能运行值
python
def variable_demo():
# 定义变量
a=tf.Variable(initial_value=30)
b=tf.Variable(initial_value=40)
sum=tf.add(a,b)
# 初始化变量
init=tf.global_variables_initializer()
# 开启会话(tensorflow1版本)
with tf.Session() as sess:
# 运行变量初始化
sess.run(init)
print(sess.run(sum))
return None
总结:
(1)构建一个计算图。图中的节点可以是TensorFlow支持的任何数学操作。
(2)初始化变量。将前期定义的变量赋初值。
(3)创建一个会话。这才是图计算开始的地方,也是体现它"惰性"的地方,也就是说,仅仅构建一个图,这些图不会自动执行计算操作,而是还要显式提交到一个会话去执行,也就是说,它的执行,是滞后的。
(4)在会话中运行图的计算。把编译通过的合法计算流图传递给会话,这时张量(tensor)才真正"流动(flow)"起来。
(5)关闭会话。当整个图无需再计算时,则关闭会话,以回收系统资源。