深度学习基础:TensorFlow基本操作指南

【深度学习】Tensorflow的基本操作_tensorflow

TensorFlow程序通常被组织成一个构建阶段和一个执行阶段. 在构建阶段, op的执行步骤被描述成一个图. 在执行阶段, 使用会话执行执行图中的op。我们来构建一个简单的计算图。每个节点采用零个或多个张量作为输入,并产生张量作为输出。一种类型的节点是一个常数。像所有TensorFlow常数一样,它不需要任何输入,它输出一个内部存储的值。我们可以创建两个浮点型常量node1 ,node2如下所示:


登录后复制

node1 = tf.constant(3.0, tf.float32)node2 = tf.constant(4.0)print(node1, node2)1.2.3.

最终的打印声明生成


登录后复制

Tensor("Const:0", shape=(), dtype=float32) Tensor("Const_1:0", shape=(), dtype=float32)1.

他为什么不是输出结果,那是因为tensorflow中的图形节点操作必须在会话中运行,稍后介绍

构建图

构建图的第一步, 是创建源 op (source op). 源 op 不需要任何输入, 例如 常量 (Constant). 源 op 的输出被传递给其它 op 做运算.TensorFlow Python 库有一个默认图 (default graph), op 构造器可以为其增加节点. 这个默认图对 许多程序来说已经足够用了.,后面我们会接触多个图的使用

默认Graph值始终注册,并可通过调用访问 tf.get_default_graph()

登录后复制

import tensorflow as tf# 创建一个常量 op, 产生一个 1x2 矩阵. 这个 op 被作为一个节点,加到默认图中.构造器的返回值代表该常量 op 的返回值.matrix1 = tf.constant([[3., 3.]])# 创建另外一个常量 op, 产生一个 2x1 矩阵.matrix2 = tf.constant([[2.],[2.]])# 创建一个矩阵乘法 matmul op , 把 'matrix1' 和 'matrix2' 作为输入.返回值 'product' 代表矩阵乘法的结果.product = tf.matmul(matrix1, matrix2)print tf.get_default_graph(),matrix1.graph,matrix2.graph1.2.3.4.5.6.7.8.9.10.11.12.

重要注意事项:此类对于图形构造不是线程安全的。所有操作都应从单个线程创建,或者必须提供外部同步。除非另有说明,所有方法都不是线程安全的

在会话中启动图

构造阶段完成后,才能启动图。启动图的第一步是创建一个Session对象,如果无任何创建参数,会话构造器将启动默认图。

调用Session的run()方法来执行矩阵乘法op, 传入product作为该方法的参数,会话负责传递op所需的全部输入,op通常是并发执行的。

登录后复制

# 启动默认图.sess = tf.Session()# 函数调用 'run(product)' 触发了图中三个 op (两个常量 op 和一个矩阵乘法 op) 的执行.返回值 'result' 是一个 numpy `ndarray` 对象.result = sess.run(product)print result# 任务完成, 关闭会话.sess.close()1.2.3.4.5.6.7.8.9.

Session对象在使用完后需要关闭以释放资源,当然也可以使用上下文管理器来完成自动关闭动作。

op

计算图中的每个节点可以有任意多个输入和任意多个输出,每个节点描述了一种运算操作(operation, op),节点可以算作运算操作的实例化(instance)。一种运算操作代表了一种类型的抽象运算,比如矩阵乘法、加法。tensorflow内建了很多种运算操作,如下表所示:


类型示例
标量运算Add、Sub、Mul、Div、Exp、Log、Greater、Less、Equal
向量运算Concat、Slice、Splot、Constant、Rank、Shape、Shuffle
矩阵运算Matmul、MatrixInverse、MatrixDeterminant
带状态的运算Variable、Assign、AssignAdd
神经网络组件SoftMax、Sigmoid、ReLU、Convolution2D、MaxPooling
存储、恢复Save、Restore
队列及同步运算Enqueue、Dequeue、MutexAcquire、MutexRelease
控制流Merge、Switch、Enter、Leave、NextIteration

feed

TensorFlow还提供了feed机制, 该机制可以临时替代图中的任意操作中的tensor可以对图中任何操作提交补丁,直接插入一个 tensor。feed 使用一个 tensor 值临时替换一个操作的输入参数,从而替换原来的输出结果.

feed 只在调用它的方法内有效, 方法结束,feed就会消失。最常见的用例是将某些特殊的操作指定为"feed"操作, 标记的方法是使用 tf.placeholder() 为这些操作创建占位符.并且在Session.run方法中增加一个feed_dict参数

登录后复制

# 创建两个个浮点数占位符opinput1 = tf.placeholder(tf.types.float32)input2 = tf
.placeholder(tf.types.float32)#增加一个乘法opoutput = tf.mul(input1, input2)with tf.Session() as 
sess:  # 替换input1和input2的值  print sess.run([output], feed_dict={input1:[7.], input2:[2.]})1.2.
3.4.5.6.7.8.9.10.

如果没有正确提供feed, placeholder() 操作将会产生错误

张量的阶和数据类型

TensorFlow用张量这种数据结构来表示所有的数据.你可以把一个张量想象成一个n维的数组或列表.一个张量有一个静态类型和动态类型的维数.张量可以在图中的节点之间流通.其实张量更代表的就是一种多位数组。

变量的的创建、初始化、保存和加载

Variable类

tf.Variable.init(initial_value, trainable=True, collections=None, validate_shape=True, name=None)

创建一个带值的新变量initial_value

  • initial_value:A Tensor或Python对象可转换为a Tensor.变量的初始值.必须具有指定的形状,除非 validate_shape设置为False.
  • trainable:如果True,默认值也将该变量添加到图形集合GraphKeys.TRAINABLE_VARIABLES,该集合用作Optimizer类要使用的变量的默认列表
  • collections:图表集合键列表,新变量添加到这些集合中.默认为[GraphKeys.VARIABLES]
  • validate_shape:如果False允许使用未知形状的值初始化变量,如果True,默认形状initial_value必须提供.
  • name:变量的可选名称,默认'Variable'并自动获取

变量的创建

创建当一个变量时,将你一个张量作为初始值传入构造函数Variable().TensorFlow提供了一系列操作符来初始化张量,值初始的英文常量或是随机值。像任何一样Tensor,创建的变量Variable()可以用作图中其他操作的输入。此外,为Tensor该类重载的所有运算符都被转载到变量中,因此您也可以通过对变量进行算术来将节点添加到图形中。

登录后复制

x = tf.Variable(5.0,name="x")weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),
name="weights")biases = tf.Variable(tf.zeros([200]), name="biases")1.2.3.

调用tf.Variable()向图中添加了几个操作:

  • 一个variable op保存变量值。
  • 初始化器op将变量设置为其初始值。这实际上是一个tf.assign操作。
  • 初始值的ops,例如 示例中biases变量的zeros op 也被添加到图中。



变量的初始化

  • 变量的初始化必须在模型的其它操作运行之前先明确地完成。最简单的方法就是添加一个给所有变量初始化的操作,并在使用模型之前首先运行那个操作。最常见的初始化模式是使用便利函数 initialize_all_variables()将Op添加到初始化所有变量的图形中。


登录后复制

init_op = tf.global_variables_initializer()with tf.Session() as sess:  sess.run(init_op)1.2.3.4.
  • 还可以通过运行其初始化函数op来初始化变量,从保存文件还原变量,或者简单地运行assign向变量分配值的Op。实际上,变量初始化器op只是一个assignOp,它将变量的初始值赋给变量本身。assign是一个方法,后面方法的时候会提到


登录后复制

with tf.Session() as sess:    sess.run(w.initializer)1.2.



通过另一个变量赋值

你有时候会需要用另一个变量的初始化值给当前变量初始化,由于tf.global_variables_initializer()初始化所有变量,所以需要注意这个方法的使用。

就是将已初始化的变量的值赋值给另一个新变量!

登录后复制

weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),name="weights")w2 = tf
.Variable(weights.initialized_value(), name="w2")w_twice = tf.Variable(weights.initialized_value() 
* 0.2, name="w_twice")1.2.3.4.5.


所有变量都会自动收集到创建它们的图形中。默认情况下,构造函数将新变量添加到图形集合GraphKeys.GLOBAL_VARIABLES。方便函数global_variables()返回该集合的内容。

属性

name

返回变量的名字

登录后复制

weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),name="weights")print(weights.name)1.2.


op

返回op操作

登录后复制

weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35))print(weights.op)1.2.

方法

assign

为变量分配一个新值。

登录后复制

x = tf.Variable(5.0,name="x")w.assign(w + 1.0)1.2.


eval

在会话中,计算并返回此变量的值。这不是一个图形构造方法,它不会向图形添加操作。方便打印结果

登录后复制

v = tf.Variable([1, 2])init = tf.global_variables_initializer()with tf.Session() as sess:    sess
.run(init)    # 指定会话    print(v.eval(sess))    # 使用默认会话    print(v.eval())1.2.3.4.5.6.7.8.9.10.

变量的静态形状与动态形状

TensorFlow中,张量具有静态(推测)形状和动态(真实)形状



静态形状:

创建一个张量或者由操作推导出一个张量时,初始状态的形状

  • tf.Tensor.get_shape:获取静态形状
  • tf.Tensor.set_shape():更新Tensor对象的静态形状,通常用于在不能直接推断的情况下


动态形状:

一种描述原始张量在执行过程中的一种形状

  • tf.shape(tf.Tensor):如果在运行的时候想知道None到底是多少,只能通过tf.shape(tensor)[0]这种方式来获得
  • tf.reshape:创建一个具有不同动态形状的新张量


要点

1、转换静态形状的时候,1-D到1-D,2-D到2-D,不能跨阶数改变形状

2、 对于已经固定或者设置静态形状的张量/变量,不能再次设置静态形状

3、tf.reshape()动态创建新张量时,元素个数不能不匹配

4、运行时候,动态获取张量的形状值,只能通过tf.shape(tensor)[]



管理图中收集的变量

tf.global_variables()

返回图中收集的所有变量
 

登录后复制

weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35))print(tf.global_variables())1.2.3.

               



免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空