tensorflow简要笔记

云梦
2021-02-21 / 0 评论 / 13 阅读 / 正在检测是否收录...
播放预览
剧集列表
哪吒1
高清

TensorFlow的优点:

  • 易用性:有对应Python的API
  • 可移植性:一套代码就可以适应单个或者多个CPU、GPU、移动设备等
  • 灵活性:可以部署在树莓派、安卓、windows、ios、linux等上
  • 可视化:有tensorboard提供开发的可视化界面,方便跟踪调参
  • 检查点:可以通过检查点记录保存实验数据
  • 自动微积分:自动求解梯度
  • 庞大的社区:一年内拥有10000+的开发者,3000+的项目
  • 大量基于TensorFlow的项目代码

  在使用TensorFlow的公司包括:Google ,OpenAI,DeepMind,SnapChat,Airbus,eBay等。

  下面就来学习下TensorFlow的基础知识,TensorFlow不仅提供了基础的语法,还提供了一些简化的API:

  • TF Learn,tf.contrib.learn,基于scikit-learn风格的API
  • TF Slim,tf.contrib.slim,轻量级的tf构建API,可以自动配置默认值,简化使用
  • Keras,更高级更抽象的API,使用Keras之后,就像叠积木一样创建模型,不过对于背后的原理隐藏的太深太深

  TensorFlow的名字中已经说明了它最重要的两个概念——Tensor和Flow。Tensor就是张量,张量这个概念在数学或者物理学中可以有不同的解释,但是这里我们不强调它本身的含义。在TensorFlow中,张量可以被简单地理解为多维数组,Flow翻译成中文就是“流”,它直观的表述计算的编程系统。TensorFlow中的每一个计算都是计算图上的一个节点,而节点之间的边描述了计算之间的依赖关系。

1.常量&变量
每个 Tensor 是一个类型化的多维数组. 例如, 你可以将一小组图像集表示为一个四维浮点数数组, 这四个维度分别是 [batch, height, width, channels].
 
在 TensorFlow 中,数据不是以整数,浮点数或者字符串形式存在的,而是被封装在一个叫做 tensor 的对象中。Tensor是张量的意思,张量包含了0到任意维度的量,其中,0维的叫做常数,1维的叫做向量,二维叫做矩阵,多维度的就直接叫张量量。
tensor1 = tf.constant(1234) #0维
tensor2 = tf.constant([123,456,789]) #1维
tensor3 = tf.constant([ [123,456,789], [222,333,444] ])#2维
参考https://blog.csdn.net/fei13971414170/article/details/73309106 
 
常量:
tf.constant(‘Hello World!’),这个tf.constant是用来定义常量的,其值是不变的
 
变量:
需要用到tf.placeholder() 和 feed_dict
tf.placeholder表示一个占位符,至于是什么类型,看自己定义了
x = tf.placeholder(tf.string) 
y = tf.placeholder(tf.int32) 
z = tf.placeholder(tf.float32) 
with tf.Session() as sess: 
  output = sess.run(x, feed_dict={x: 'Test String', y: 123, z: 45.67})
 
********************************************************************************
2.图(Graph)的概念
图: 表示计算任务,描述计算的过程。为了进行计算, 图必须在 会话 里被启动.
 
TensorFlow 程序通常被组织成一个构建阶段和一个执行阶段. 在构建阶段, op 的执行步骤 被描述成一个图. 在执行阶段, 使用会话执行执行图中的 op.
例如, 通常在构建阶段创建一个图来表示和训练神经网络, 然后在执行阶段反复执行图中的训练 op.
构建图的第一步, 是创建源 op (source op). 源 op 不需要任何输入, 例如 常量 (Constant). 源 op 的输出被传递给其它 op 做运算.
TensorFlow Python 库有一个默认图 (default graph), op 构造器可以为其增加节点. 这个默认图对 许多程序来说已经足够用了. 阅读 Graph 类 文档 来了解如何管理多个图.
 
举例:
# 创建一个常量 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)
默认图现在有三个节点, 两个 constant() op, 和一个matmul() op. 为了真正进行矩阵相乘运算, 并得到矩阵乘法的 结果, 你必须在会话里启动这个图.
 
构造阶段完成后, 才能启动图. 启动图的第一步是创建一个 Session 对象, 如果无任何创建参数, 会话构造器将启动默认图.
# 启动默认图.
sess = tf.Session()
 
********************************************************************************
3.会话(Session)的概念
Tensorflow中的所有计算都构建在一张计算图中,这是一种对数学运算过程的可视化方法。就像刚才的代码:
with tf.Session() as sess:
    output = sess.run(hello_constant)
 
session: 就是负责让这个图运算起来,session的主要任务就是负责分配GPU或者CPU的。
 
会话结束后的操作:
Session 对象在使用完后需要关闭以释放资源. 除了显式调用 sess.close() 外, 也可以使用 "with" 代码块 来自动完成关闭动作.
with tf.Session() as sess:
  result = sess.run([product])
  print result
 
会话执行位置的选择CPU&GPU:
在实现上, TensorFlow 将图形定义转换成分布式执行的操作, 以充分利用可用的计算资源(如 CPU 或 GPU). 一般你不需要显式指定使用 CPU 还是 GPU, TensorFlow 能自动检测. 如果检测到 GPU, TensorFlow 会尽可能地利用找到的第一个 GPU 来执行操作.
如果机器上有超过一个可用的 GPU, 除第一个外的其它 GPU 默认是不参与计算的. 为了让 TensorFlow 使用这些 GPU, 你必须将 op 明确指派给它们执行. with...Device 语句用来指派特定的 CPU 或 GPU 执行操作:
 
********************************************************************************
4.节点Operation(op)的概念
图中的节点被称之为 op (operation 的缩写). 一个 op 获得 0 个或多个 Tensor, 执行计算, 产生 0 个或多个 Tensor.
 
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)
# 函数调用 'run(product)' 触发了图中三个 op (两个常量 op 和一个矩阵乘法 op) 的执行.
# 返回值 'result' 是一个 numpy `ndarray` 对象.
result = sess.run(product)
 
********************************************************************************
5.占位符Placeholder(变量)
 
feed 使用一个 tensor 值临时替换一个操作的输出结果. 你可以提供 feed 数据作为 run() 调用的参数. feed 只在调用它的方法内有效, 方法结束, feed 就会消失. 最常见的用例是将某些特殊的操作指定为 "feed" 操作, 标记的方法是使用 tf.placeholder() 为这些操作创建占位符.
 
input1 = tf.placeholder(tf.types.float32)
input2 = tf.placeholder(tf.types.float32)
output = tf.mul(input1, input2)
with tf.Session() as sess:
  print sess.run([output], feed_dict={input1:[7.], input2:[2.]})
 
# 输出:[array([ 14.], dtype=float32)]
 
********************************************************************************
6.eval & run
tf.Tensor.eval_r(feed_dict=None, session=None)
Evaluates this tensor in a Session.
计算张量的值
 
tf.Operation.run(feed_dict=None, session=None)
Runs this operation in a Session.
执行一个op
 
#调用 sess 的 'run()' 方法来执行矩阵乘法 op
 
********************************************************************************
7.优化器(梯度下降)
• class tf.train.GradientDescentOptimizer
• class tf.train.AdagradOptimizer
• class tf.train.MomentumOptimizer
• class tf.train.AdamOptimizer
• class tf.train.FtrlOptimizer
• class tf.train.RMSPropOptimizer
 
********************************************************************************
8.Session与InteractiveSession的区别
 
tf.InteractiveSession():
它能让你在运行图的时候,插入一些计算图,这些计算图是由某些操作(operations)构成的。这对于工作在交互式环境中的人们来说非常便利,比如使用IPython。
 
tf.Session():
需要在启动session之前构建整个计算图,然后启动该计算图。
意思就是在我们使用tf.InteractiveSession()来构建会话的时候,我们可以先构建一个session然后再定义操作(operation),如果我们使用tf.Session()来构建会话我们需要在会话构建之前定义好全部的操作(operation)然后再构建会话。
 
import tensorflow as tf  
v = tf.constant ([1.0,2.0,3.0])  
sess = tf.Session()  
print(sess.run(tf.log(v)))  
sess.close()  
 
import tensorflow as tf  
v = tf.constant ([1.0,2.0,3.0])  
sess = tf.InteractiveSession()  
print(tf.log(v).eval_r())  
sess.close()  
 
上面两行代码可以得到相同的答案
[ 0.     0.69314718  1.09861231]  
 
![](https://ae01.alicdn.com/kf/U70e80bc1ce2740dd82b74718af87ace7i.jpg)   
观察可以得到,这两种的区别
tf.InteractiveSession()加载它自身作为默认构建的session,tensor.eval_r()和operation.run()取决于默认的session.
换句话说:InteractiveSession 输入的代码少,原因就是它允许变量不需要使用session就可以产生结构。
 
为了便于使用诸如 IPython 之类的 Python 交互环境, 可以使用 InteractiveSession 代替 Session 类, 使用 Tensor.eval_r() 和 Operation.run() 方法代替 Session.run(). 这样可以避免使用一个变量来持有会话.
# 进入一个交互式 TensorFlow 会话.
import tensorflow as tf
sess = tf.InteractiveSession()
x = tf.Variable([1.0, 2.0])
a = tf.constant([3.0, 3.0])
# 使用初始化器 initializer op 的 run() 方法初始化 'x' 
x.initializer.run()
# 增加一个减法 sub op, 从 'x' 减去 'a'. 运行减法 op, 输出结果 
sub = tf.sub(x, a)
print sub.eval_r()
# ==> [-2. -1.]
0

评论 (0)

取消