废话不多说,直接上货....
![0f5659f7e02f47765658dfc48dcc6c79.png](https://i-blog.csdnimg.cn/blog_migrate/df6e0f48663e22187d9354f1da2eba92.jpeg)
一、TensorFlow
(TensorFlow以后简写为TF)
TensorFlow是一个开源软件库,用于各种感知和语言理解任务的机器学习。目前被全球知名的50个团队用于研究和生产许多Google商业产品,如语音识别、Gmail、Google 相册和搜索等,其中许多产品曾使用过其前任软件DistBelief。此外,TensorFlow最初由谷歌大脑团队开发,且用于Google的研究和生产,于2015年11月9在Apache 2.0开源许可证下发布。
二、TensorFlow基础架构
关于TF的基础架构,其实从“Tensorflow”一词中就已经回答了这个问题:
Tensorflow是由Tensor和flow组成的,其中Tensor素有张量的数学含义,flow则表示流的概念。那么为何称为TensorFlow呢? 从结构意义上来讲,张量是计算机程序计算过程中的一个计算图(也称为有向图),其实计算图与流程图也极为相似,但也有区别
一般滴,张量(Tensor)也就是结构图上的边(edge)中流动着的数据,而在链接边的点称为节点(node);对于流(flow)就是张量所代表的数据沿着边在不同节点间流动发生数据转化的一动态特征。
我们可以通过下面的一张gif图来认识的TF的内在运行机制:计算图
计算图下面我会介绍,这里只是先打个预防针
三、TensorFlow基础解析
0、安装TF:
如果你觉得我文章开头给你的安装TF2.0教程太麻烦也可以继续在Ubuntu下创建TF其他版本的虚拟环境:
例如,创建一个tf 1.15.0版本,环境为tensorflow1x
conda create -n tensorflow1x python=3.7.7
激活:
source activate tensorflow1x
安装1.15.0版本:豆瓣:最快速的镜像之一,我非常喜欢的国内镜像,其他镜像请移步到我的博客查看:https://kangchou001.cn/
pip install --index-url https://pypi.douban.com/simple tensorflow==1.15.0
截图给大家看看速度:
安装后自行选择版本进行编译开发
检验一下版本:
在该版本的虚拟环境下使用spyder测试一下:成功
备注:后面会介绍下面测试使用的回归方法
1、常函数tf.constant
函数结构:
tf.constant( value, dtype=None, shape=None, name='Const', verify_shape=False)
参数说明:
value,值 (通常是数字、列表、numpy数组这类的数据结构较多)
shape,数据形状 (包含数据类型的维数,长度,大小)
dtype,数据类型 (数据的类型,一般为float32或64)
name,名称 (这个参数虽然编程的时候用处不太大,但是在TF的 )
下面来看看一个简单的例子:将一个数字“2020”标量生成指定形状维度的矩阵
首先进入TF环境启动jupyter notebook:
打开jupyter notebook网页编译器开始干:
import tensorflow as tf #设定参数c = tf.constant(2020, shape=[2,3], dtype=tf.float32, name=None) #会话模式with tf.Session() as sess: print(sess.run(c))
执行结果:
[[2020. 2020. 2020.] [2020. 2020. 2020.]]
可以发现,执行结果与python打印的结果类似。当然,常函数的用处还很多,下面就一起展示一下:
import tensorflow as tftensor=tf.constant([1,2,3,4,5,6,7,8,9])print(tensor.shape) #打印张量形状print(tf.shape(tensor))print(tensor.get_shape())tensor=tf.constant([[1,2,3],[4,5,6],[7,8,9]])print(tensor.shape)print(tf.shape(tensor))print(tensor.get_shape())tensor=tf.constant([[[1,1,1],[2,2,3],[3,3,3]],[[4,4,4],[5,5,5],[6,6,6]]])print(tensor.shape)print(tf.shape(tensor))print(tensor.get_shape())(9,)Tensor("Shape:0", shape=(1,), dtype=int32)(9,)(3, 3)Tensor("Shape_1:0", shape=(2,), dtype=int32)(3, 3)(2, 3, 3)Tensor("Shape_2:0", shape=(3,), dtype=int32)(2, 3, 3)
常用常量函数汇集:
#创建一个所有的参数为0的tensor对象tf.zeros(shape, dtype=tf.float32, name=None)#创建一个所有参数均为0的tensor对象tf.zeros_like(tensor, dtype=None, name=None)# 创建一个所有的参数为1的tensor对象tf.ones(shape, dtype=tf.float32, name=None)# 创建一个所有参数均为1的tensor对象tf.ones_like(tensor, dtype=None, name=None)# 创建一个维度为dims,值为value的tensor对象.# 当value为0时,该方法等同于tf.zeros()# 当value为1时,该方法等同于tf.ones()tf.fill(dims, value, name=None)# 创建一个常量tensor,按照给出value来赋值,可以用shape来指定其形状。tf.constant(value, dtype=None, shape=None, name='Const')
下面先来了解一下什么是计算图?
2、TF计算图
计算图由节点(nodes)和线(edges)构建的。节点表示操作符Operator,或者称之为算子,线则表示计算间的依赖,或者说是数据间流动的桥梁,当然也称为边,并且这些边是具有方向性的,即:线的箭头所指方向为当前程序计算执行方向。其中,实线表示有数据传递依赖,传递的数据即张量。虚线通常可以表示控制依赖,即执行先后顺序。如下图所示:这是一个加法和乘法的计算图
3、TF计算图简短入门
自从TF发展到现在,TF就有三种计算图的构建方式:静态计算图,动态计算图,以及Autograph.(这三种图会在本公众好陆续推送)
在TensorFlow1.x时代,采用的是静态计算图,需要先使用TensorFlow的各种算子创建计算图,然后再开启一个会话Session,显式执行计算图。
而在TensorFlow2.x时代,采用的是动态计算图,即每使用一个算子后,该算子会被动态加入到隐含的默认计算图中立即执行得到结果,而无需开启Session。
先看一个简单的例子:
根据要求,Tensorflow设计的计算图步骤如下:
第1步. 初始化一个空的计算图
第2步. 为该计算图加入节点(张量和操作)
第3步. 执行计算图:
3.1.开始一个新的会话
3.2.初始化图中的变量
3.3.运行会话中的计算图
import tensorflow.compat.v1 as tf# 初始化一个空的计算图g = tf.Graph()# 为该计算图加入节点(张量和操作)with g.as_default(): a = tf.constant(3.01,name="a") b = tf.constant(6.0,name="b") c = tf.constant(4.13,name="c") z =a +b + c # 执行计算图## 通过调用tf.Session产生会话对象,该调用可以接受一个图为参数(这里是g),否则将启动默认的空图## 执行张量操作的用sess.run(),他将返回大小均匀的列表with tf.Session(graph=g) as sess: print('a +b + c =>',sess.run(z))
执行结果:
a +b + c => 13.14
再来看一个例子:
import tensorflow as tf#为了确保对老版本tensorflow项目的兼容性,在tf.compat.v1子模块中保留了对TensorFlow1.0那种静态计算图构建风格的支持# 定义一个计算突g = tf.compat.v1.Graph()with g.as_default():# 设定默认计算图#placeholder为占位符,执行会话时候指定填充对象 x = tf.compat.v1.placeholder(name='x', shape=[], dtype=tf.string) y = tf.compat.v1.placeholder(name='y', shape=[], dtype=tf.string) z = tf.strings.join([x,y],name = "join",separator = " ")# 执行计算突with tf.compat.v1.Session(graph = g) as sess: # fetches的结果非常像一个函数的返回值,而feed_dict中的占位符相当于函数的参数序列。 result = sess.run(fetches = z,feed_dict = {x:"hello",y:"world"}) print(result)
其中,Tensorflow有提供数据的特别机制。其中一种机制就是使用占位符placeholder,说白了就算预先定义好类型和形状的张量。通过调用tf.placeholder函数把这些张量加入计算图中,而且他们不包括任何数据。然而一旦执行图中的指定的节点就需要提供数据阵列。
执行结果:
b'hello world'
4、入门TensorBoard可视化工具
TensorBoard 是 TensorFlow提供的一组可视化工具(a suite of visualization tools),可以帮助开发者方便的理解、调试、优化TensorFlow程序。TensorBoard可以将模型训练过程中的各种汇总数据展示出来,包括标量(Scalars)、图片(Images)、音频(Audio)、计算图(Graphs)、数据分布(Distributions)、直方图(Histograms)和潜入向量(Embeddigngs)。Tensorflow代码执行的过程是先构建图Graph,然后在执行会话Session。
可视化的具体流程如下:
1).先建立一个graph
2).确定要在graph中的哪些节点放置summary operations以记录信息
使用tf.summary.scalar记录标量
使用tf.summary.histogram记录数据的直方图
使用tf.summary.distribution记录数据的分布图
使用tf.summary.image记录图像数据3).operations并不会去真的执行计算,除非你告诉他们需要去run,或者它被其他的需要run的operation所依赖。而我们上一步创建的这些summary operations其实并不被其他节点依赖,因此,我们需要特地去运行所有的summary节点。但是,一套计算下来可能有超多这样的summary 节点,要手动一个一个去启动自然是及其繁琐的,因此我们可以使用tf.summary.merge_all去将所有summary节点合并成一个节点,只要运行这个节点,就能产生所有我们之前设置的summary data。
4).使用tf.summary.FileWriter将运行后输出的数据都保存到本地磁盘中
5).运行整个程序,并在命令行输入运行tensorboard的指令,之后打开web端可查看可视化的结果
下面我们来操作一下:使用乘法和加法的案例
步骤简要说明:
第一步:先建立在一个test文件夹下(/home/zhoukang/test/)创建tf2.py文件,内容为
import tensorflow as tfa = tf.constant(5, name="input_a") #常数b = tf.constant(3, name="input_b")c = tf.multiply(a, b, name="mul_c") #乘法d = tf.add(a, b, name="add_d") #加法
第二步:执行
执行结果会在你当前的py文件目录下生成一个事件evens.out文件,如果你想换其他存放目录也行,只需修改以上程序中的存储位置即可
writer = tf.summary.FileWriter("/存储位置", tf.compat.v1.get_default_graph())br
第三步:在生成该文件的文件目录下打开终端,进入指定TF编译环境的终端,输入:
tensorboard --logdir=/home/zhoukang/test/logs
tensorboard --logdir=/home/zhoukang/test/logsServing TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_allTensorBoard 2.2.2 at http://localhost:6006/ (Press CTRL+C to quit)
其中包含了乘法与加法和其他与之相关执行模块的流程:
四、TensorFlow数据结构
TensorFlow用张量这种数据结构来表示所有的数据.你可以把一个张量想象成一个n维的数组或列表.一个张量有一个静态类型和动态类型的维数.张量可以在图中的节点之间流通.其实张量更代表的就是一种多位数组。
阶:
在TensorFlow系统中,张量的维数来被描述为阶.但是张量的阶和矩阵的阶并不是同一个概念.张量的阶(有时是关于如顺序或度数或者是n维)是张量维数的一个数量描述.比如,下面的张量(使用Python中list定义的)就是2阶.
t = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
你可以认为一个二阶张量就是我们平常所说的矩阵,一阶张量可以认为是一个向量.
阶(维数) | 数学实例 | Python | 例子 |
---|---|---|---|
0 | 标量 | (只有大小) | s = 2020 |
1 | 向量 | (大小和方向) | v = [1.1, 2.2, 3.3] |
2 | 矩阵 | (数据表) | m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] |
3 | 3阶张量 | (数据立体) | t = [[[2], [4], [6]], [[8], [10], [12]], [[14], [16], [18]]] |
n | n阶 | .... | .... |
Tensors有一个数据类型属性.你可以为一个张量指定下列数据类型中的任意一个类型:
数据类型 | Python 类型 | 描述 |
---|---|---|
DT_FLOAT | tf.float32 | 32 位浮点数. |
DT_DOUBLE | tf.float64 | 64 位浮点数. |
DT_INT64 | tf.int64 | 64 位有符号整型. |
DT_INT32 | tf.int32 | 32 位有符号整型. |
DT_INT16 | tf.int16 | 16 位有符号整型. |
DT_INT8 | tf.int8 | 8 位有符号整型. |
DT_UINT8 | tf.uint8 | 8 位无符号整型. |
DT_STRING | tf.string | 可变长度的字节数组.每一个张量元素都是一个字节数组. |
DT_BOOL | tf.bool | 布尔型. |
DT_COMPLEX64 | tf.complex64 | 由两个32位浮点数组成的复数:实数和虚数. |
DT_QINT32 | tf.qint32 | 用于量化Ops的32位有符号整型. |
DT_QINT8 | tf.qint8 | 用于量化Ops的8位有符号整型. |
DT_QUINT8 | tf.quint8 | 用于量化Ops的8位无符号整型. |
五、TF求导机制
tf.GradientTape()
这个 “求导记录器” 来实现自动求导。以下代码展示了如何使用
tf.GradientTape()
计算函数
()
![6d36e6733e4ee68a0d9a91148f9a3d86.png](https://i-blog.csdnimg.cn/blog_migrate/e5f5debbddb97553310fde8995381b94.png)
x
是一个初始化为 3 的
变量
(Variable),使用
tf.Variable()
声明。与普通张量一样,变量同样具有形状、类型和值三种属性。使用变量需要有一个初始化过程,可以通过在
tf.Variable()
中指定
initial_value
参数来指定初始值。这里将变量
x
初始化为
3.
。变量与普通张量的一个重要区别是其默认能够被 TensorFlow 的自动求导机制所求导,因此往往被用于定义机器学习模型的参数。
tf.GradientTape()
计算函数.以下损失函数x与b为列向量,A为矩阵
#单纯的求导数求值A = tf.constant([[1.,2.], [3.,4.]])b = tf.constant([[1.],[2.]])x = tf.Variable(initial_value = [[1.], [2.]])with tf.GradientTape() as tape: J =tf.reduce_sum(tf.square(tf.matmul(A, x) - b))x_grad = tape.gradient(J, x)print(J,x_grad)
tf.Tensor(97.0, shape=(), dtype=float32) tf.Tensor([[62.] [88.]], shape=(2, 1), dtype=float32)
开
来来来,入本公众号微信群一起学习,免费资料不会少
参考文献
https://mp.weixin.qq.com/s/RVPNYAc1OcvVNK4UVGt5mwhttps://www.cnblogs.com/fwl8888/p/9791692.htmlhttps://wiki.jikexueyuan.com/project/tensorflow-zh/resources/dims_types.htmlhttps://tf.wiki/zh_hans/basic/basic.html