TensorFlow架构详解:原理与构成

一、Tensorflow的基础框架。



1、系统框架

虽然Tensorflow的框架的版本不断的进行更新,但是系统架构并没有发生根本性的变化。它以不同的功能需求进行分层处理,以统一接口屏蔽具体实现,从而集中各自的关注层次,更好的提升Tensorflow的适用性,系统架构如下:

tensorflow 架构图 tensorflow架构及原理_tensorflow

从上图可以明显的看出:Tensorflow系统框架分为三层,从上而下依次是应用层、接口层、核心层。


2、TensorFlow的系统的六个特性
TensorFlow的系统架构具有许多特性:

  • 高度灵活性
  • 真正的可移植性
  • 连接研究与产品
  • 自动微分
  • 多语言选择
  • 最大化性能



3、TensorFlow的编程特点

TensorFlow除了以数据流为核心外,在编程实现过程中还具备以下的两大特点:


  • 将图的定义和图的运行完全分开
    使用Tensorflow进行编程与使用Python进行编程有明显的区别。在进行Python进行编程时,只要定义了相关变量以及运算,在程序运行时就会直接执行相关运算得到结果。在Tensorflow中需要预先定义各种变量,建立相关数据流图,在数据流图中定义各种变量之间的关系,以此完成图的定义。此时,图只是运算规则,没有任何实际数据,需要把运算的输入数据放进去后,才会形成输出值。


  • 图的计算在会话中执行
    Tensorflow的相关计算在图中进行定义,而图的具体运行环境在会话(Session)中。只有开启会话后,才可以使用相关数据去填充节点,这样才能开始计算;关闭会话后,就不能进行计算。

下面是Python与TensorFlow的编程思路对比,来实现简单的一些计算:
在python中:

登录后复制

a=3
b=4
c=5
y=a*b+c
print(y)

则会输出结果:17
在TensorFlow中,我们也输入类似的代码:


登录后复制

import tensorflow as tf
a=3
b=4
c=5
y=tf.add(a*b,c)
print(y)

则会输出: Tensor(“Add:0”, shape=(), dtype=int32)

可以明显的看到,并没有输出运算的结果,而是输出了一个Tensor,这是因为我们仅仅完成了图的定义,而没有实现具体的运算
下面我们就更改上述的代码,实现运算,就需要满足Tensorflow中计算的几个阶段,首先进行定义计算图,然后创建会话,最后则完成计算。

登录后复制

import tensorflow as tf
#创建图
a=tf.constant(3,tf.float32)  #定义常量
b=tf.constant(4,tf.float32)
c=tf.constant(5,tf.float32)
y=tf.add(a*b,c)  #定义计算公式
print(y)
sess=tf.Session() #创建会话
print(sess.run(y))  #计算
sess.close() #关闭会话

运行结果如下:

登录后复制

Tensor("Add:0", shape=(), dtype=float32)
17.0

可以看出,只有在会话中完成计算后才会输出计算结果17。
TensorFlow采用这样的设计主要因为他是针对机器学习的框架,消耗最多的是对输入数据的训练。

二、TensorFlow的基本概念


1、Tensor

Tensor是张量,是最基本的概念,也是TensorFlow中最主要的数据结构。张量用于在计算图中进行数据的传递,但是创建了一个张量后,不会立即在计算图中增加该张量,而需要将该张量赋值给一个变量或者占位符,之后才会将该张量增加到计算图中。

张量,可理解为一个 n 维矩阵,所有类型的数据,包括标量、矢量和矩阵等都是特殊类型的张量。

tensorflow 架构图 tensorflow架构及原理_tensorflow_02


tensorflow 架构图 tensorflow架构及原理_Tensorflow_03

张量的生成方式有很多种,例如固定张量、相似张量、序列张量、分布张量等。


登录后复制

import tensorflow as tf
#Tensor
row=3.0
col=4.0
zero_tsr= tf.zeros([row,col]) #值为0,指定维度的张量
ones_tsr=tf.ones([row,col])   #值为1,指定维度的张量
filled_tsr=tf.fill([3,4],2.0)    #指定填充数值2.0 ,指定维度的张量
constant_tsr=tf.constant([1,2,3])  #已知常数的张量

zeros_similar=tf.zeros_like(constant_tsr)  #所有元素为0,与constant_tsr类型一致的张量
ones_similar=tf.ones_like(constant_tsr)  #所有元素为1,与constant_tsr类型一致的张量

liner_tsr=tf.linspace(start=0.0,stop=2.0,num=3) #创建指定的区间,等间距的张量
integer_seq_str=tf.range(start=0,limit=5,delta=1)   #创建指定的区域,间隔的张量

randunif_tsr=tf.random_uniform([3,4],minval=0,maxval=2)#创建均匀分布随机数的张量
randnorm_tsr=tf.random_normal([3,4],mean=0.0,stddev=1.0)#创建正态分布随机数的张量
runcnorm_tsr=tf.truncated_normal([3,4],mean=0.0,stddev=1.0)#创建指定边界的正态分布张量
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init_op)     
    #Tensor
    print ('zero_tsr is ',sess.run(zero_tsr))
    print ('ones_tsr is ',sess.run(ones_tsr))
    print ('filled_tsr is ',sess.run(filled_tsr))
    print ('constant_tsr is ',sess.run(constant_tsr))
    
    print ('zeros_similar is ',sess.run(zeros_similar))
    print ('ones_similar is ',sess.run(ones_similar))
    
    print ('liner_tsr is ',sess.run(liner_tsr))
    print ('integer_seq_str is ',sess.run(integer_seq_str))
    
    print ('randunif_tsr is ',sess.run(randunif_tsr))
    print ('randnorm_tsr is ',sess.run(randnorm_tsr))
    print ('runcnorm_tsr is ',sess.run(runcnorm_tsr))
sess.close()

输出结果:

登录后复制

zero_tsr is  [[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
ones_tsr is  [[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]]
filled_tsr is  [[2. 2. 2. 2.]
 [2. 2. 2. 2.]
 [2. 2. 2. 2.]]
constant_tsr is  [1 2 3]
zeros_similar is  [0 0 0]
ones_similar is  [1 1 1]
liner_tsr is  [0. 1. 2.]
integer_seq_str is  [0 1 2 3 4]
randunif_tsr is  [[0.92969847 0.7200849  1.4162304  1.2510674 ]
 [0.97165823 1.45502    1.5120289  0.9996681 ]
 [0.96171427 0.8367257  0.731313   1.85327   ]]
randnorm_tsr is  [[-0.670491    1.5340202   0.47463468 -1.9473785 ]
 [-1.1878501  -0.521639    0.10082857 -2.3056    ]
 [ 0.51349676  0.6248353   0.53046846  0.24368662]]
runcnorm_tsr is  [[ 1.1717324  -0.12139019  0.97365093  0.28850073]
 [ 0.96101403 -0.46031672 -0.65009755  1.5967586 ]
 [-1.8578918   0.15960255 -0.38491356  1.5632377 ]]
 
 



2、Variable

Variable即变量、一般用来表示图中的各个计算参数,包括矩阵和向量,他在计算图中有固定的位置。一般我们在TensorFlow中通过调整这些变量的状态来优化机器学习算法。
创建变量使用函数
tf.Variable(),通过输入一个张量,返回一个变量。变量声明后需要进行初始化才能使用。通过打印张量和变量,可对比他们的不同之处。

登录后复制

import tensorflow as tf  
tensor=tf.zeros([1,2])
m_var=tf.Variable(tensor)
init_op=tf.global_variables_initializer()
sess=tf.Session()
with tf.Session() as sess:
    print("tensor is",sess.run(tensor))
    sess.run(init_op)
    print("m_var is",sess.run(m_var))
    
    

输出结果:

登录后复制

tensor is [[0. 0.]]
m_var is [[0. 0.]]




3、Placeholder

Tensorflow占位符,用于表示输入输出数据的格式,允许传入指定类型和形状的数据。占位符仅仅声明了数据位置,告诉系统这里有一个值、向量或者矩阵、现在还没法给出具体值。占位符通过会话的feed_dict参数获取数据,在计算图运行时使用获取的数据进相应的计算,计算完毕后获取的数据就会消失。

登录后复制

import tensorflow as tf  
#placeholder
x=tf.placeholder(tf.float32)
y=tf.placeholder(tf.float32)
z=tf.add(x,y)
x_data=[1.0,2.0]
y_data=[10.0,11.0]
init_op = tf.global_variables_initializer()
sess = tf.Session()  
with tf.Session() as sess:
    print(sess.run( [z],feed_dict={x:x_data,y:y_data} ))
    
    

运行结果:

登录后复制

[array([11., 13.], dtype=float32)]



4、Session

Session是会话,是TensorFlow中计算图的具体执行者,与图进行实际的交互。一个会话中可以有多个图,会话的目的是将训练数据添加到图中进行训练,当然也可以进行修改图的结构。
下面进行介绍会话的两种使用方式:

  • 明确的调用会话的生成函数和关闭函数。

登录后复制

sess=tf.Session()
sess.run()
sess.close() #调用sess.close(),释放资源。

  • 利用上下文管理机制自动释放所有资源。(不用调用sess.close()释放资源,在退出with语句时,会话自动关闭并释放资源)

登录后复制

with tf.Session() as sess:
    sess.run()
    
    



5、Operation

Operation是操作。是Tensorflow图中的节点,它的输入与输出都是Tensor。它的作用是完成各种操作,包括运算操作、矩阵操作、和神经网络构建操作等。

介绍主要的操作
数学运算Add, Sub, Mul, Div, Exp, Log, Greater, Less, Equal
数组运算Concat, Slice, Split, Constant, Rank, Shape, Shuffle
矩阵运算MatMul, MatrixInverse, MatrixDeterminant
神经网络构建操作SoftMax, Sigmoid, ReLU, Convolution2D, MaxPool
检查点操作Save, Restore
队列和同步操作Enqueue, Dequeue, MutexAcquire, MutexRelease
张量控制操作Merge, Switch, Enter, Leave, NextIteration

     

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

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

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

* 公司名称:

姓名不为空

手机不正确

公司不为空