TensorFlow技术详解(一)
2022-12-19 10:29:16 Author: 白帽子(查看原文) 阅读量:12 收藏

0x00 人工智能背景
TensorFlow是一个基于数据流编程的符号数学系统,被广泛应用于各类机器学习算法的编程实现,其前身是谷歌的神经网络算法库DistBelief,2015年11月9日谷歌公司开源了第二代深度学习系统TensorFlow
人工智能(AI,Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学
机器学习(ML,Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能
深度学习(DL,Deep Learning)是学习样本数据的内在规律和表示层次,这些学习过程中获得的信息对诸如文字,图像和声音等数据的解释有很大的帮助。它的最终目标是让机器能够像人一样具有分析学习能力,能够识别文字、图像和声音等数据。深度学习是一个复杂的机器学习算法,在语音和图像识别方面取得的效果,远远超过先前相关技术
人工智能可以理解为研究用计算机来实现人类的智能,让机器的行为看起来像人所表现出的智能行为一样,研究包括语音识别、图像识别、机器人、自然语言处理等等
人工智能包括计算智能、感知智能和认知智能等层次,目前人工智能还介于前两者之间。深入研究人工智能前我们需要理解人工智能、机器学习与深度学习的区别,可以通过下面的图可以帮助大家快速理解
深度学习的前身是人工神经网络,百度百科给出的定义是从信息处理角度对人脑神经元网络进行抽象,建立某种简单模型,按不同的连接方式组成不同的网络
深度学习又分为有监督学习、无监督学习及半监督学习
  • 有监督学习:用已知某种或某些特性的样本作为训练集,以建立一个数学模型,再用已建立的模型来预测未知样本
  • 无监督学习:让计算机自己学习,所有数据只有特征没有标记
  • 半监督学习:训练数据一部分有标记,另一部分没有标记,没标记数据的数量往往极大于有标记数量
无监督学习典型应用模式:
  • 聚类(算法:K-means)

△  图片来源:
https://ww2.mathworks.cn/help/stats/gaussianmixturemodelsexample_04.png
  • 预测(算法:

    线性回归、Gradient Boosting、AdaBoost、神经网络)

△  图片来源:
https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Linear_regression.svg/1200px-Linear_regression.svg.png
* 分类(算法:逻辑回归、决策树、KNN、随机森林、支持向量机、朴素贝叶斯、神经网络)
通过神经网络,计算机可以自动学习特征,TensorFlow这种深度学习开源工具可以帮助我们搭建神经网络。TensorFlow支持异构设备分布式计算,也就是可以使用CPU、GPU等核心进行更加高效、功耗更低的协同工作,并且能够更加高效的利用机器资源进行训练
TensorFlow特性:
1、高度灵活性:可用于数值计算的开源软件库
2、可移植性:可以在CPU和GPU上运,也可以在台式机、服务器等终端设备上运行
3、自动求微积分:只需定义预测模型的结构和目标函数,TensorFlow可以自动完成微分操作
4、支持多种语言:TensorFlow提供了Python、Java、C++等接口来构建程序
5、性能优化:TensorFlow提供线程、队列、分布式计算等
0x01 TensorFlow安装
我在学习过程中安装的是Anaconda,官网如下
https://www.anaconda.com
Anaconad集成了很多Python的第三方库,可以便捷获取包且对包能够进行管理,同时对环境可以统一管理的发行版本,包含了conda、Python在内的超过180个科学包及其依赖项
Anaconda可以在以下系统平台中安装和使用:
  • Windows

  • macOS

  • Linux(x86 / Power8)

安装条件:
  • 系统要求:

    32位或64位系统均可

  • 下载文件大小:

    约500MB

  • 所需空间大小:

    3GB空间大小(Miniconda仅需400MB空间即可)

安装过程:
下载页面:
https://www.anaconda.com/products/individual#macos
选择适合自己的版本
下载好后我们可以看到
打开后的页面如图,安装Notebook会更方便使用
在terminal中输入jupyter notebook会自动打开Home Page
0x02 TensorFlow基础
 
TensorFlow系统架构下层为网络层与设备层,网络通信层包含RPC(RPC,Remote Procedure Call Protocol)和远程直接数据存取(RDMA,Remote Direct Memory Access),可以在CPU、GPU、FPGA等设备上实现。在操作实现中包含卷积函数等操作,再往上为分布式计算图与本地计算图,再往上则为底层API与上层API
TensorFlow是一个通过计算图的形式表述计算的编程系统,每一个计算都是计算图上的一个节点,节点之间的边表示计算之间的关系。TensorFlow采用符号式编程,预先定义变量,然后建立数据流图,在数据流图中规定各个变量之间的计算关系,最后对数据流图进行编译
TensorFlow = Tensor(张量)+ Flow(流)
Tensor(张量)指数据流图中的边,在TensorFlow中,所有的数据都通过张量的形式来表示,但并没有真正保存数字,而是计算过程。从功能的角度,张量可以简单理解为多维数组:
  • 零阶张量表示标量(scalar),一个数;

  • 一阶张量为向量(vector),一维数组;

  • n阶张量可以理解为一个n维数组;

Flow(流)代表数据流中节点所做的操作

△  图片来源:
https://www.tensorflow.org/images/tensors_flowing.gif
计算图是一个有向图:
  • 节点,每个节点都代表一个操作,是一种运算

  • 有向边,每条边代表节点之间的关系(数据传递和控制依赖)

TensorFlow的边又分为两种:
  • 常规边(实线):代表数据依赖关系,代表数据。

    任何维度的数据统称为张量,一个节点的运算输出成为另一个节点的输入,两个节点之间有tensor流动(值传递)

  • 特殊边(虚线):不携带值,表示两个节点之间的控制相关性,可以控制操作的运行。比如,happens-before关系,源节点必须在目的节点执行前完成执行

TensorFlow中,主要有以下几种数据类型(dtype):
Session(会话)
会话拥有并管理TensorFlow程序运行时的所有资源,创建的计算图只是建立静态计算模型,执行会话才能供数据并获得结果,调用Session对象的run()方法来执行
当所有计算完成之后需要关闭会话帮助系统回收资源,程序因为异常退出时,关闭会话函数可能就不会被执行从而导致资源泄漏
  • tf.Session()

    创建一个会话

  • tf.Session().as_default()

    创建一个默认会话,当上下文管理器退出时会话没有关闭,还可以通过调用会话进行run()和eval()操作

constant(常量)
在运行过程中值不会改变的单元,在TensorFlow中无须进行初始化操作
创建语句:
constant_ name = tf.constant(value)
Variable(变量)
在tensorflow中,所有变量都需要初始化才可以使用,其中也包括所定义的函数中的变量(注意大小写)
创建语句:
name_variable = tf.Variable(value, name)
个别变量初始化:
init_op = name_variable.initializer()
所有变量初始化:
init_op = tf.global_variables_initializer()
需要添加一个init初始化变量,并调用run命令对参数进行初始化
placeholder(占位符)
placeholder()函数用于定义过程,在执行的时候再赋具体的值
tf.placeholder(dtype, shape=None, name=None)
一个简单的计算图实例
node1=tf.constant(1.0,tf.float32,name="node1")node2=tf.constant(2.0,tf.float32,name="node2")node3=tf.add(node1,node2)#输出的结果不是一个具体的数字,而是一个张量的结构print(node3)
"Add:0":名称【“node:src_output”:node 节点名称,“src_output” 来自节点的第几个输出】
shape=():维度【shape=() ,表示标量】
dtype=float32:类型【每一个张量有一个唯一的类型】
建立会话并显示运行结果sess=tf.Session()print("运行sess.run(node3)的结果:", sess.run(node3))sess.close()#关闭session
#创建一个会话,并通过Python中的 上下文管理器来管理这个会话with tf.Session() as sess:print( sess. run(node3))
这种情况下不需要再调用Session.close() 来关闭会话,退出时会话关闭,自动完成资源释放
若为变量形式则为
init=tf.global_variables_initializer()sess.run(init)
0x03 TensorFlow常用API
图(Graph)的核心数据结构与通用函数(Utility function)
  • tf.Graph.__init__():创建一个空图

  • tf.Graph.as_default():将图设置为默认图,并返回一个上下文管理器

  • tf.Graph.control_dependencies(control_inputs):定义一个控制依赖,并返回一个上下文管理器

  • tf.Graph.device(device_name_or_function):定义运行图所使用的设备,并返回一个上下文管理器

  • tf.Graph.name_scope(name):为节点创建层次化名称,并返回一个上下文管理器

tf.Operation类代表途中的一个节点,用于计算张量数据
  • tf.Operation.name:操作的名称

  • tf.Operation.typy:操作的类型

  • tf.Operation.inputs/tf.Operation.outputs:操作的输入输出

  • tf.Operation.control_inputs:操作的依赖

tf.Tensor类应该是最基本最核心的数据结构,他表示的是操作的输出,但不包含操作输出的值,而是提供了在TensorFlow的Session中计算这些值的方法
  • tf.Tensor.dtype:张量的数据类型

  • tf.Tensor.name:张量的名称

  • tf.Tensor.value_index:张量在操作输出中的索引

  • tf.Tensor.graph:张量所在的图

  • tf.Tensor.op:产生张量的操作

可视化给节点添加摘要,摘要会将收集到的数据写入时间文件
  • tf.summary():各类方法能够实现程序的可视化

  • tf.summary().scale:输出包含单个标量值的摘要

  • tf.summary().histogram:训练过程中变量的分布情况

  • tf.summary.distribution:显示weights分布

  • tf.summary.image:输出包含图片的摘要

0x04 神经元函数
激活函数(Activation Functions)
将非线性特性引入到网络中,增加神经网络模型的非线性。激活神经网络中的部分神经元,将激活信息传入下一层的神经网络
常见激活函数
  • Sigmoid(S型)

    激活函数将加权和转换为介于0和1之间的值,是传统神经网络中最常用的激活函数之一,输入数据特征相差不明显可使用Sigmoid

  • Tanh:

    由基本双曲函数双曲正弦和双曲余弦推导而来,收敛速度比Sigmoid快,输入数据特征相差明显可使用tanh,用Sigmoid和tanh时,需对输入进行规范化

  • ReLU(线性整流函数):

    用于隐层神经元输出,大部分卷积神经网络都采用ReLU作为激活函数

△  图片来源:
https://www.researchgate.net/figure/Nonlinear-function-a-Sigmoid-function-b-Tanh-function-c-ReLU-function-d-Leaky_fig3_323617663
池化函数(Pooling Function)
在神经网络中,池化函数一般在卷积函数的下一层,其是利用一个矩阵窗口在张量上进行扫描,将每个矩阵窗口中的值通过取最大值和最小值来减少元素的个数
每个池化操作的矩阵窗口大小由ksize指定,并根据strides决定移动步长
加速神经网络训练
目前的加速方法一般基于梯度下降,TensorFlow的优化器(optimizer)有
  • Tf.train.GradientDescentOptimizer

  • Tf.train.AdadeltaOptimizer

  • Tf.train.AdagradOptimizer

  • Tf.train.AdagradDAOptimizer

  • Tf.train.MomentumOptimizer

  • Tf.train.AdamOptimizer

  • ... ...

队列(queue)
  • FIFOQueue:先入先出队列

  • RandomShuffleQueue:随即队列

若队列长度等于最小值执行出队操作,或队列长度等于最大值执行入队操作则会出现阻断情况
数据加载
TensorFlow官网给出三种读取数据方法:
  • 预加载数据(preloaded data)

    x1=tf.constant([1,2,3])

    x2=tf.constant([2,3,4])

    x3=tf.add(x1,x2)

    定义常量或变量来保存所有数据,将数据直接嵌在数据流图中,当训练数据量过大,非常占内存

  • 填充数据(feeding)

    使用feed_dict()参数,存在数据类型转换也存在消耗内存问题

  • 从文件读取数据(file)

    先把文件写入到TFRecords二进制文件中,再从队列中读取数据

    TFRecords是tensorflow自带的文件格式,是一种二进制文件,能够更加方便的复制和移动,不需要单独标记文件

    了解TFRecords文件的读取流程,首先先理解什么是epoch:

    epoch:使用训练集的全部数据对模型进行一次完整训练

TensorFlow使用文件名队列+内存队列双队列的形式进行读入文件,从TFRecords文件中读取数据,用tf.train.string_input_producer生成一个解析队列后,调用tf.TFRecordReader的tf.parse_single_example解析器
参考书籍及文章:《TensorFlow技术解析与实战》https://blog.csdn.net/weixin_42555080/article/details/100704078https://blog.csdn.net/shenziheng1/article/details/84960746https://www.researchgate.net/figure/Nonlinear-function-a-Sigmoid-function-b-Tanh-function-c-ReLU-function-d-Leaky_fig3_323617663

E

N

D

Tide安全团队正式成立于2019年1月,是新潮信息旗下以互联网攻防技术研究为目标的安全团队,团队致力于分享高质量原创文章、开源安全工具、交流安全技术,研究方向覆盖网络攻防、系统安全、Web安全、移动终端、安全开发、物联网/工控安全/AI安全等多个领域。

团队作为“省级等保关键技术实验室”先后与哈工大、齐鲁银行、聊城大学、交通学院等多个高校名企建立联合技术实验室,近三年来在网络安全技术方面开展研发项目60余项,获得各类自主知识产权30余项,省市级科技项目立项20余项,研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等。对安全感兴趣的小伙伴可以加入或关注我们。

我知道你在看


文章来源: http://mp.weixin.qq.com/s?__biz=MzAwMDQwNTE5MA==&mid=2650246448&idx=2&sn=2d4891d9e8e9dbe8798879ef8e9f8151&chksm=82ea5699b59ddf8ffa6561fc45c03b7d6d755bc3b5d9a9f57c1ed9f7f926629cd300396d9fa9#rd
如有侵权请联系:admin#unsafe.sh