目录:

一、TensorFlow的系统架构

二、TensorFlow的设计理念

三、TensorFlow的运行流程

四、TensorFlow的编程模型:边、节点、图、设备、变量、变量初始化、内核

五、常用的API:图、操作、张量、变量作用域【variable_scope】占位符placeholder

一、TensorFlow的系统架构:

二、设计理念:

(1)将图的定义和运行完全分开。TensorFlow采用符号式编程。

符号式计算一般是先定义各种变量,然后建立一个数据流图,在数据流图中规定各个变量之间的计算关系,最后需要对数据流图进行编译,但这时的数据流图是一个空壳,里面没有实际数据,只有把需要的输入放进去后,才能在整个模型中形成数据流,从而形成输出值。

(2)TensorFlow涉及的运算都放在图中,图的运行只发生在会话(session)中。开启会话后,就可以用数据去填充节点,进行运算。关闭会话后,就不能进行计算了。

三、TensorFlow的运行流程

运行流程主要有2步:构造模型和训练

构造模型阶段,需构建一个图(Graph)来描述我们的模型。所谓的图,可认为是流程图,即将数据的输入--> 中间处理--> 输出的过程表示出来,如下图:

这时候是不会发生实际运算的,在模型构建完毕之后,进入训练步骤。此时才会有实际的数据输入,梯度计算等操作。

构建抽象的模型的几个重要概念:Tensor,Variable,placeholder

训练阶段的重要概念:session

四、编程模型:

(1)边:边有两种连接关系:数据依赖和控制依赖。其中,实现边表示数据依赖,代表数据,即张量。张量具有的一些数据属性:

tf.float32
tf.float64
tf.int64
tf.int32
……

虚线边为依赖控制,可用于控制操作的运行,这类边没有数据流过。但源节点必须在目的节点开始执行前完成执行。常用代码如下:

tf.Graph.control_dependencies(control_inputs)

(2)节点:图中的节点表示一个操作(OP),即数学运算。在建立图的时候确定下来。

(3)图:构建图的第一步是创建各个节点。具体如下:

import tensorflow as tf

#创建一个常量运算操作,产生一个1×2矩阵

matrix1 = tf.constant ( [ [ 3., 3. ] ] )

#创建另一个常量运算操作,产生一个2×1矩阵

matrix2 = tf.constant ( [ [2.] , [2. ] ] )

#创建一个矩阵乘法运算,把两个matrix作为输入
#返回值product代表矩阵乘法的结果 product = tf.matmul ( matrix1,matrix2)

为什么要写 tf.Graph().as_default()?

  • 多线程:

tf.Graph() 表示实例化了一个类,一个用于 tensorflow 计算和表示用的数据流图,通俗来讲就是:在代码中添加的操作(画中的结点)和数据(画中的线条)都是画在纸上的“画”,而图就是呈现这些画的纸,你可以利用很多线程生成很多张图,但是默认图就只有一张。

tf.Graph().as_default() 表示将这个类实例,也就是新生成的图作为整个 tensorflow 运行环境的默认图,如果只有一个主线程不写也没有关系,tensorflow 里面已经存好了一张默认图,可以使用tf.get_default_graph() 来调用(显示这张默认纸),当你有多个线程就可以创造多个tf.Graph(),就是你可以有一个画图本,有很多张图纸,这时候就会有一个默认图的概念了。

  • 上下文管理器

另外一种典型的用法就是要使用到Graph.as_default() 的上下文管理器( context manager),它能够在这个上下文里面覆盖默认的图。

(4)会话:启动图的第一步是创建一个session对象。会话提供在图中执行操作的一些方法,一般的模式是,建立会话,此时会生成一张空图,在会话中添加节点和边,形成一张图,然后执行。

with tf.Session() as sess:
#在调用session对象的run()方法来执行图时,传入一些Tensor,这个过程叫填充(feed),返回的结果类型根据输入的类型而定,这个过程叫取回(fetch)。
result = sess.run ( [product] )
print result

(5)设备(device):一块可以用来运算并且拥有自己的地址空间的硬件,如GPU和CPU。

with tf.Session() as sess:
#指定在第二个gpu上运行
with tf.device("/gpu:1"):
matrix1 = tf.constant ( [ [3. ,3. ]])
matrix2 = tf.constant ( [ [2. ], [ 2. ]])
product = tf.matmul ( matrix1,matrix2)

(6)变量:比如用来建立激活函数中的W、b等矩阵变量。使用tf.Variable()构造函数。

#创建一个变量,初始化为标量0

state = tf.Variable ( 0 , name="counter" )

#以下两个是等价的,在创建变量时,两者区别不大,get_variable可获取变量
v = tf.get_variable("v" , shape = [1] ,initializer = tf.constant_initializer(1.0))
v = tf.Variable(tf.constant(1.0,shape = [1]) ,name = "v")

tf.get_variable函数和tf.Variable函数最大的区别在于指定变量名称的参数。

tf.Variable的变量名称是一个可选的参数,name = "v“。

tf.get_variable的变量名称是一个必填的参数。tf.get_variable根据这个名称创建或获取这个变量。

(7)内核:能运行在CPU、GPU等设备上的一种对操作的实现。

(8)变量初始化:

五、常用的API

(1)图:

(2)操作:

(3)张量:

(4)变量作用域:

TensorFlow有两个作用域:一个是name_scope,另一个是variable_scope。

variable_scope主要是给variable_name加前缀(变量),也可给op_name加前缀(操作),name_scope是给op_name加前缀。

variable_scope有点像将该变量变成全局变量,作用域可以共享变量的意思。

v = tf.variable (name, shape ,dtype , initializer ) #通过所给的名字创建或是返回一个变量

tf.variable_scope(<scope_name>) #为变量指定命名空间

(5)占位符placeholder

tf.placeholder(tf.float32,shape),shape常表示为[None,整数],这里的None表示未知的样本数。

有placeholder后面就有一个feed_dict绑定,

import tensorflow as tf

#placeholder在开始时相当于先为变量占位,在后面在用不同的变量来换掉它

#设置两个占位

input1 = tf.placeholder(tf.float32)
#若需要规定2行2列这种结构可在后面添加成 tf.placeholder(tf.float32 ,[2,2] )
input2 = tf.placeholder(tf.float32) output = tf.mul ( input1,input2) #只要有placeholder后面就有一个feed_dict绑定,在sess.run那用它来赋值 with tf.Session() as sess:
print( sess.run (output, feed_dict= { input1:[7.] , input2:[2.] })

(6)用GPU进行TensorFlow计算加速

GPU只在部分数据类型上支持tf.Variable操作。如果在TensorFlow代码库中搜索调用这段代码的宏TF_CALL_GPU_NUMBER_TYPES,可以发现在GPU上,tf.Variable操作只支持实数型(float16、float32和double)的参数。而在报错的样例代码中给定的参数是整数型的,所以不支持在GPU上运行。为避免这个问题,TensorFlow在生成会话时可以指定allow_soft_placement参数。当allow_soft_placement参数设置为True时,如果运算无法由GPU执行,那么TensorFlow会自动将它放到CPU上执行。以下代码给出了一个使用allow_soft_placement参数的样例。

故tf.device("/gpu:1")有时会报错。

        os.environ["CUDA_VISIBLE_DEVICES"] = ""
config = tf.ConfigProto()
# config.gpu_options.per_process_gpu_memory_fraction = 0.5
config.gpu_options.allow_growth=True # allocate when needed sess = tf.Session(config = config)

(7)embedding_lookup

https://www.cnblogs.com/gaofighting/p/9625868.html

https://blog.csdn.net/laolu1573/article/details/77170407

import tensorflow as tf
p=tf.Variable(tf.random_normal([10,1]))#生成10*1的张量
b = tf.nn.embedding_lookup(p, [1, 3])#查找张量中的序号为1和3的
c = tf.nn.embedding_lookup(p, [[1,2, 3],[2,4,5]])#查找batch_size = 2,ndim = 3的张量中的序号
d = tf.expand_dims(c, -1)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print("b:",b)
print(sess.run(b))
print("c:",c)
print(sess.run(c))
print("d:",d)
print(sess.run(d))
print("p:",p)
print(sess.run(p))
print(type(p))

结果

b: Tensor("embedding_lookup_17:0", shape=(2, 1), dtype=float32)
[[ 1.3196588]
[-0.8500369]]
c: Tensor("embedding_lookup_18:0", shape=(2, 3, 1), dtype=float32)
[[[ 1.3196588 ]
[-0.48340532]
[-0.8500369 ]] [[-0.48340532]
[-0.74867696]
[ 2.043409 ]]]
d: Tensor("ExpandDims_4:0", shape=(2, 3, 1, 1), dtype=float32)
[[[[ 1.3196588 ]] [[-0.48340532]] [[-0.8500369 ]]] [[[-0.48340532]] [[-0.74867696]] [[ 2.043409 ]]]]
p: <tf.Variable 'Variable_9:0' shape=(10, 1) dtype=float32_ref>
[[-0.07763693]
[ 1.3196588 ]
[-0.48340532]
[-0.8500369 ]
[-0.74867696]
[ 2.043409 ]
[ 1.0277175 ]
[ 0.8650728 ]
[-1.1537417 ]
[ 0.4588327 ]]
<class 'tensorflow.python.ops.variables.Variable'>

(8)tf.split

import tensorflow as tf
p=tf.Variable(tf.random_normal([10,1]))#生成10*1的张量
c = tf.nn.embedding_lookup(p, [[1,2, 3],[2,4,5]])#查找batch_size = 2,ndim = 3的张量中的序号
input_att = tf.split(c, 3, axis=1)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print("c:",c)
print(sess.run(c))
print(sess.run(input_att))

结果

c: Tensor("embedding_lookup_24:0", shape=(2, 3, 1), dtype=float32)
[[[-0.02312754]
[ 1.137335 ]
[ 0.28091738]] [[ 1.137335 ]
[-0.39026853]
[ 0.16639084]]]
[array([[[-0.02312754]], [[ 1.137335 ]]], dtype=float32), array([[[ 1.137335 ]], [[-0.39026853]]], dtype=float32), array([[[0.28091738]], [[0.16639084]]], dtype=float32)]

(9) tf.linspace

tensorflow在设计时,尽量模仿numpy,因此很多函数都很类似。不过有一些操作tf中还是无法支持的,比如map:

import tensorflow as tf
import numpy as np
"""
0.0
3.3333333333333335
6.666666666666667
10.0
"""
for a in np.linspace(0., 10., 4):
print(a)
"""
TypeError: Tensor objects are not iterable when eager execution is not enabled. To iterate over this tensor use tf.map_fn.
"""
for a in tf.linspace(0., 10., 4):
print(a)

六、模块

https://blog.csdn.net/u014365862/article/details/77833481

tf.nn,tf.layers, tf.contrib模块有很多功能是重复的,尤其是卷积操作,在使用的时候,我们可以根据需要现在不同的模块。但有些时候可以一起混用。

下面是对三个模块的简述:

(1)tf.nn :提供神经网络相关操作的支持,包括卷积操作(conv)、池化操作(pooling)、归一化、loss、分类操作、embedding、RNN、Evaluation。

(2)tf.layers:主要提供的高层的神经网络,主要和卷积相关的,个人感觉是对tf.nn的进一步封装,tf.nn会更底层一些。

(3)tf.contrib:tf.contrib.layers提供够将计算图中的  网络层、正则化、摘要操作、是构建计算图的高级操作,但是tf.contrib包含不稳定和实验代码,有可能以后API会改变。

以上三个模块的封装程度是逐个递进的。

 
 
 
 
 
 

Tensorflow学习笔记----基础(3)的更多相关文章

  1. tensorflow学习笔记二:入门基础 好教程 可用

    http://www.cnblogs.com/denny402/p/5852083.html tensorflow学习笔记二:入门基础   TensorFlow用张量这种数据结构来表示所有的数据.用一 ...

  2. TensorFlow学习笔记6-数值计算基础

    TensorFlow学习笔记6-数值计算 本笔记内容为"数值计算的基础知识".内容主要参考<Deep Learning>中文版. \(X\)表示训练集的矩阵,其大小为m ...

  3. TensorFlow学习笔记4-线性代数基础

    TensorFlow学习笔记4-线性代数基础 本笔记内容为"AI深度学习".内容主要参考<Deep Learning>中文版. \(X\)表示训练集的设计矩阵,其大小为 ...

  4. Tensorflow学习笔记2019.01.22

    tensorflow学习笔记2 edit by Strangewx 2019.01.04 4.1 机器学习基础 4.1.1 一般结构: 初始化模型参数:通常随机赋值,简单模型赋值0 训练数据:一般打乱 ...

  5. tensorflow学习笔记——使用TensorFlow操作MNIST数据(2)

    tensorflow学习笔记——使用TensorFlow操作MNIST数据(1) 一:神经网络知识点整理 1.1,多层:使用多层权重,例如多层全连接方式 以下定义了三个隐藏层的全连接方式的神经网络样例 ...

  6. tensorflow学习笔记——自编码器及多层感知器

    1,自编码器简介 传统机器学习任务很大程度上依赖于好的特征工程,比如对数值型,日期时间型,种类型等特征的提取.特征工程往往是非常耗时耗力的,在图像,语音和视频中提取到有效的特征就更难了,工程师必须在这 ...

  7. TensorFlow学习笔记——LeNet-5(训练自己的数据集)

    在之前的TensorFlow学习笔记——图像识别与卷积神经网络(链接:请点击我)中了解了一下经典的卷积神经网络模型LeNet模型.那其实之前学习了别人的代码实现了LeNet网络对MNIST数据集的训练 ...

  8. tensorflow学习笔记——使用TensorFlow操作MNIST数据(1)

    续集请点击我:tensorflow学习笔记——使用TensorFlow操作MNIST数据(2) 本节开始学习使用tensorflow教程,当然从最简单的MNIST开始.这怎么说呢,就好比编程入门有He ...

  9. TensorFlow学习笔记5-概率与信息论

    TensorFlow学习笔记5-概率与信息论 本笔记内容为"概率与信息论的基础知识".内容主要参考<Deep Learning>中文版. \(X\)表示训练集的设计矩阵 ...

随机推荐

  1. ubuntu重置root密码(转载自https://zhinan.sogou.com/guide/detail/?id=316512881651)

    ubuntu忘记root密码怎么办?如果普通用户忘记了怎么办 ### 第一种方法:无论你是否申请了root帐号,或是普通账号密码忘记了都没有问题的! 1. 重启ubuntu,随即长按shift进入gr ...

  2. 计蒜客 时间复杂度 (模拟) & 洛谷 P3952 时间复杂度

    链接 : Here! 思路 : 这是一道大模拟, 区分好情况就没问题了 循环构成部分 : $F , x , i , j$ 和 $E$ , 需要注意的是 $i , j$, - 分析 $i, j$ 的情况 ...

  3. nyoj303-序号交换

    序号互换 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 Dr.Kong设计了一个聪明的机器人卡多,卡多会对电子表格中的单元格坐标快速计算出来.单元格的行坐标是由数字编号 ...

  4. 关于NumPy的坑

         初次接触NumPy的时候,感叹这个功能的强大,实现了Python对矩阵的运算,但在写一个项目的时候,发现了一个巨坑无比的情况     分隔符=================     对于被 ...

  5. VUEX 总结

    What is Vuex? vuex是一个专为Vue.js应用程序开发的状态管理模式.他采用集中式储存管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变换 VUEX并不限制你的代 ...

  6. ACdream 1415 Important Roads

    Important Roads Special JudgeTime Limit: 20000/10000MS (Java/Others)Memory Limit: 128000/64000KB (Ja ...

  7. 【LeetCode-面试算法经典-Java实现】【033-Search in Rotated Sorted Array(在旋转数组中搜索)】

    [033-Search in Rotated Sorted Array(在旋转数组中搜索)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Suppose a sort ...

  8. 分享几个可用的rtsp, http測试url

    rtsp://218.204.223.237:554/live/1/0547424F573B085C/gsfp90ef4k0a6iap.sdp rtsp://218.204.223.237:554/l ...

  9. [C++设计模式] iterator 迭代器模式

    迭代器模式定义:提供一种方法顺序訪问一个聚合对象中各个元素,而又不须要暴露该对象. 迭代器分内部迭代器和外部迭代器.内部迭代器与对象耦合紧密,不推荐使用. 外部迭代器与聚合容器的内部对象松耦合,推荐使 ...

  10. JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal start byte 0xfe

    JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal start byte 0xfe 在使用Jni ...