一、深度学习的介绍
1. 深度学习与机器学习的区别
![image-20240328145555308](https://img-blog.csdnimg.cn/img_convert/2146d0b47b669cac4ea491131ebbb1ad.png)
- 特征提取方面
- 数据量和计算性能要求
- 算法代表
2. 特征提取方面
- 机器学习的特征工程步骤是要靠手动完成的(特征提取),而且需要大量领域专业知识
- 深度学习通常由多个层组成,它们通常将更简单的模型组合在一起,将数据从一层传递到另一层来构建更复杂的模型。通过训练大量数据自动得到模型,不需要人工特征提取环节
深度学习算法试图从数据中学习高级功能,这是深度学习的一个非常独特的部分。因此,减少了为每个问题开发新特征提取器的任务。适合用在难提取特征的图像、语音、自然语言处理领域
3. 数据量和计算性能要求
机器学习需要的执行时间远少于深度学习,深度学习参数往往很庞大,需要通过大量数据的多次优化来训练参数
![image-20240328153057836](https://img-blog.csdnimg.cn/img_convert/4fecde3c1e15e78cd3afbd1d1fd88235.png)
- 第一,深度学习需要大量的训练数据集
- 第二,训练深度神经网络需要大量的算力
可能要花费数天、甚至数周的时间,才能使用数百万张图像的数据集训练出一个深度网络。所以深度学习通常- 需要强大的GPU服务器来进行计算
- 全面管理的分布式训练和预测服务
4. 算法代表
- 机器学习:朴素贝叶斯,决策树
- 深度学习:神经网络
二、TensorFlow结构分析(数据流图)
TensorFlow程序通常被组织成一个构建图阶段和一个执行图阶段。
在构建图阶段,数据与操作的执行步骤被描述成一个图。
- 流程图,定义数据(张量Tensor)和操作(节点Op)
在执行图阶段,使用会话(调用系统资源)执行构建好的图中的操作。
- 调用各方资源,将定义好的数据和操作运行起来
- 图和会话:
- 图:这是TensorFlow将计算表示为指令之间的依赖关系的一种表示法,数据 + 操作
- 会话:TensorFlow跨一个或多个本地或远程设备运行数据流图的机制
- 张量(数据):TensorFlow中的基本数据对象
- 节点(操作):提供图当中执行的操作
TensorFlow:Tensor:张量、数据 Flow:流动
1. 图结构
图结构:数据(Tensor)+ 操作(Operation)
图包含了一组tf.Operation代表的计算单元对象和tf.Tensor代表的计算单元之间流动的数据
2. 图的相关操作
通常TensorFlow会默认帮我们创建一张图。
查看默认图的两种方法:
- 调用方法
- 通过调用tf.get_default_graph()访问,要将操作添加到默认图形中,直接创建OP即可。
- 查看属性
- op、sess都含有graph属性,默认都在一张图中
3. 创建图
- 可以通过tf.Graph()自定义创建图
- 如果要在这张图中创建OP,典型用法是使用tf.Graph.as_default()上下文管理器
4. TensorBoard可视化学习
TensorFlow有一个亮点就是,我们能看到自己写的程序的可视化效果,这个功能就是Tensorboard。在这里我们先简单介绍一下其基本功能。
实现程序可视化过程:
-
将图进行数据序列化,为events文件
- TensorBoard通过读取TensorFlow的事件文件来运行,故需要将图序列化为Summary对象
- tf.summary.FileWriter(path, graph=sess.graph)
-
打开终端,启动tensorBoard
- tensorboard --logdir=path
![image-20240429142423367](https://img-blog.csdnimg.cn/img_convert/81a3dbac64983bb475ac0c3fec46b1bd.png)
圆圈是因为:在定义a_t和b_t时,使用constant函数,所以按照TensorBoard中的表示为圆圈
圆圈前面的Const和Const_1代表为:指令名称
"Const:0"代表:该操作只有一个输出,若为多个输出则为:0,1,2……
5. OP
数据:Tensor对象
操作:Operation对象,简称:Op
常见Op
类型 | 实例 |
---|---|
标量运算 | add,sub, mul, div,exp, log, greater, less,equal |
向量运算 | concat,slice,splot, constant,rank,shape, shuffle |
矩阵运算 | matmul, matrixinverse,matrixdateminant |
带状态的运算 | Variable, assgin, assginadd |
神经网络组件 | softmax,sigmoid,relu,convolution,max_pool |
存储,恢复 | Save,Restroe |
队列及同步运算 | Enqueue,Dequeue,MutexAcquire,MutexRelease |
控制流 | Merge,Switch, Enter,Leave,Nextlteration |
操作函数 | 操作对象 |
---|---|
tf.constant(Tensor对象) | 输入Tensor对象—Const—输出 Tensor对象 |
tf.add(Tensor对象1,Tensor对象2) | 输入(Tensor对象1,Tensor对象2) —Add对象—输出 Tensor对象3 |
一个操作对象(Operation)是TensorFlow图中的一个节点,可以接收0个或者多个输入Tensor,并且可以输出0个或者多个Tensor,Operation对象是通过op构造函数(如tf.matmul())创建的。
例如:c=tf.matmul(a,b)创建了一个Operation对象,类型为MatMul类型,它将张量a,b作为输入,c作为输出,并且输出数据,打印的时候也是打印的数据。其中tf.matmul()是函数,在执行matmul函数的过程中会通过MatMul类创建一个与之对应的对象
注意,打印出来的是张量值,可以理解成OP当中包含了这个值。并且每一个OP指令都对应一个唯一的名称,如上面的Const:0,这个在TensorBoard上面也可以显示
请注意,tf.Tensor对象以输出该张量的tf.Operation明确命名。张量名称的形式为“<OP_NAME>:< i >",其中:
- "<OP_NAME>"是生成该张量的指令的名称
- "< i >"是一个整数,它表示该张量在指令的输出中的索引
指令名称
tf.Graph对象为其包含的tf.Operation对象定义的一个命名空间。TensorFlow会自动为图中的每个指令选择一个唯一名称,用户也可以指定描述性名称,使程序阅读起来更轻松。我们可以以以下方式改写指令名称
- 每个创建新的tf.Operation或返回新的tf.Tensor的API函数可以接受可选的name参数。
例如,tf.constant(42.0,name=”answer")创建了一个名为“answer”的新tf.Operation并返回一个名为answer:0”的tf.Tensor。如果默认图已包含名为“answer”的指令,则TensorFlow会在名称上附加"1"、“2”等字符,以便让名称具有唯一性。
6. 会话
一个运行TensorFlowoperation的类。会话包含以下两种开启方式:
- tf.Session:用于完整的程序当中
- 快速查看张量的值,在会话中调用 对象.eval() 查看
- tf.InteractiveSession:用于交互式上下文中的TensorFlow,例如shell
- 直接通过 对象.eval() 查看
TensorFlow使用tf.Session类来表示客户端程序(通常为Python程序,但也提供了使用其他语言的类似接口)与C++运行时之间的连接
tf.Session对象使用分布式TensorFlow运行时提供对本地计算机中的设备和远程设备的访问权限。
会话可能拥有的资源,如tf.Variable,tf.QueueBase和tf.ReaderBase。当这些资源不再需要时,释放这些资源非常重要。因此,需要调用tf.Session.close会话中的方法,或将会话用作上下文管理器。
-
会话掌握资源,用完要回收。——上下文管理器 (with …… as …)
-
初始化会话对象时的参数
- tf.Session(target=‘’,graph=None,config=None)
- target:如果将此参数留空(默认设置),会话将仅使用本地计算机中的设备。可以指定grpc://网址,以便指定TensorFlow服务器的地址,这使得会话可以访问该服务器控制的计算机上的所有设备
- graph:默认情况下,新的tf.Session将绑定到当前的默认图
- config:此参数允许您指定一个tf.ConfigProto以便控制会话的行为。例如,ConfigProto协议用于打印设备使用信息
- tf.Session(target=‘’,graph=None,config=None)
-
run方法
只要开启会话(session),运行其中的值(run),才能看到结果
若不开启会话,只是单纯的去打印,只能看到tensor对象
run(fetches, feed_dict=None, options=None, run_metadata=None)
-
通过使用sess.run()来运行operation
-
fetches:传入单一的operation,或者列表、元组(属于tensorflow的类型)
-
feed_dict:参数运行调用者覆盖图中张量的值,运行时赋值,与tf.placeholder()占位符搭配使用,则会检查值的形式是否与占位符兼容
注: 使用tf.operation.eval()也可以运行operation,但需要在会话中运行
feed操作:
- placeholder提供占位符,run时候通过feed_dict传参
-
请注意运行时候报的错误error:
RuntimeError:如果这Session是无效状态(例如已关闭)。
TypeError:如果fetches或者feed_dict键的类型不合适。
valueError:如果fetches或feed_dict键无效或引用Tensor不存在的键。
三、张量Tensor
TensorFlow的张量就是一个N维数组,类型为tf.Tensor。
Tensor具有以下两个重要的属性:
- type:数据类型
- shape:形状(阶)
标量:一个数字 0阶张量
向量:一维数组 [2,3,4] 1阶张量
矩阵:二维数组 [[2,3,4], 2阶张量
[2,3,4]]
……
张量: n维数组 n阶张量
1. 张量的类型
默认:tf.float32
数据类型 | 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位无符号整型 |
2. 张量的阶
阶 | 数学实例 | Python | 例子 |
0 | 纯量(标量) | (只有大小) | s = 483 |
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阶 | (自己想想看) |
0维:() 1维:(10,) 2维:(3,4) 3维:(3,4,5)
3. 创建张量
创建固定值张量
tf.zeros(shape, dtype=tf.float32,name=None)
创建所有元素设置为零的张量。此操作返回一个dtype具有形状shape和所有元素设置为零的类型的张量。
tf.zeros_like(tensor,dtype=None, name=None)
给tensor定单张量(),此操作返回tensor与所有元素设置为零相同的类型和形状的张量。
tf.ones(shape, dtype=tf.float32, name=None)
创建一个所有元素设置为1的张量。此操作返回一个类型的张量,dtype形状shape和所有元素设置为1。
tf.ones_like(tensor, dtype=None, name=None)
给tensor定单张量(),此操作返回tensor与所有元素设置为1相同的类型和形状的张量。
tf.fill(dims, value, name=None)
创建一个填充了标量值的张量。此操作创建一个张量的形状dims并填充它value.
tf.constant(value, dtype=None,shape=None, name=‘Const’"
创建一个常数张量。
创建随机张量
tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32,seed=None,name=None)
从截断的正态分布中输出随机值,和 tf.random_normal()一样,但是所有数字都不超过两个标准差
tf.random_normal(shape, mean=0.0,stddev=1.0, dtype=tf.float32, seed=None, name=None)
从正态分布中输出随机值,由随机正态分布的数字组成的矩阵
其它特殊的创建张量的OP
- tf.Variable
- tf.placeholder
4. 张量的变换
-
类型改变
- tf.cast(tensor,dtype)
- 不会改变原始的tensor
- 返回新的改变类型后的tensor
- tf.cast(tensor,dtype)
-
形状修改
- 静态形状
- 只有在形状没有完全固定下来的情况下,才可以改变/更新静态形状
- tensor.set_shape(shape)
- 动态形状
- tf.reshape(tensor,shape)
- 不会改变原始的tensor
- 返回新的改变形状后的tensor
- 动态创建新张量时,张量的元素个数必须匹配
- 静态形状
5. 变量OP
TensorFlow变量是表示程序处理的共享持久状态的最佳方法。变量通过tf.VariableOP类进行操作。变量的特点:
-
存储持久化
-
可修改值
-
可指定被训练
-
创建变量
- 变量需要显式初始化,才能运行值
![image-20240506174845184](https://img-blog.csdnimg.cn/img_convert/3833dde6db5cc1e24d941996b0230670.png)
- 使用tf.variable_scope()修改变量的命名空间
- 使得结构更加清晰
6. API
-
基础API
-
tf.app
- 这个模块相当于为TensorFlow进行的脚本提供一个main函数入口,可以定义脚本运行的flags
-
tf.image
- TensorFlow的图像处理操作。主要是一些颜色变换、变形和图像的编码和解码
-
tf.gfile
- 这个模块提供了一组文件操作函数
-
tf.summary
- 用来生成TensorBoard可用的统计日志,目前Summary主要提供了4种类型:audio、image、histogram、scalar
-
tf.python_io
- 用来读写TFRecords文件
-
tf.train
- 这个模块提供了一些训练器,与tf.nn结合起来,实现一些网络的优化计算
-
tf.nn
- 这个模块提供了一些构建神经网络的底层函数。TensorFlow构建网络的核心模块,其中包含了添加各种层的函数,比如添加卷积层、池化层等。
-
-
高级API
-
tf.keras
- Kears本来是一个独立的深度学习库,tensorflow将其学习过来,增加这部分模块在于快速构建模型
-
tf.layers
- 高级API,以便高级的概念层来定义一个模型。类似tf.kears
-
tf.contrib
- tf.contrib.layers提供够将计算图中的网络层、正则化、摘要操作,是构建计算图的高级操作,但是tf.contrib包含不稳定和实验代码,有可能以后API会改变
-
tf.estimator
- 一个estimator相当于model + training + evaluate 的合体。在模块中,已经实现了几种简单的分类器和回归其,包括:Baseline,learning 和 DNN。这里的DNN的网络,只是全连接网络,没有提供卷积之类的
-
![image-20240506193810715](https://img-blog.csdnimg.cn/img_convert/68c111fa3e9e5d716125b5f3a1a779ab.png)
四、案例:实现线性回归
1. 线性回归原理
根据数据建立回归模型,w1x1+w2x2+…+b=y,通过真实值与预测值之间建立误差,使用梯度下降优化得到损失最小对应的权重和偏置。最终确定模型的权重和偏置参数。最后可以用这些参数进行预测
- 构建模型
- y=w1x1+w2x2++wnxn+b
- 构造损失函数
- 均方误差、最小二乘法
- 优化损失
- 梯度下降