大家好,欢迎来到IT知识分享网。
本文记录博主自学唐宇迪深度学习(包括卷积网络、循环神经网络、对抗神经网络、Tensorflow实战)过程中博主自己的一些理解,以及学习过程中遇到的困难的解决方法,希望能给你带来帮助!
本文选取了各网站的部分名词解释,如有侵权请联系我修改。
一:神经网络基础知识
这节课涉及:深度学习与人工智能概述、机器学习常规套路、前向传播基础、反向传播与最优化问题。
1-1 课程概述与环境配置
安装python:
- 在python官网安装,不推荐(需要自行配置环境变量,自行安装各类包)
- Anaconda,推荐(安装python,配置变量,各类python库,notebook)
Anaconda安装:
官网:Download Now | 更改aconda
博主选择了Windows-Python3.12-64位版本的Anaconda。
安装完成后的win文件夹中显示内容:
安装tensorflow:
- pip install tensorflow pip直接安装
- pip install tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple 变源pip安装
由于pip下载是直接从官方源下载库往往速度较慢,有时是国外源,因此为了提高安装速度和成功率,需要更换为国内源,如果只是偶尔需要临时从其他源安装库,可以使用-i
参数临时指定源,该代码是更换了清华源安装tensorflow,也可以用于后续其他库pip指令的安装,如numpy库。
Jupyter Notebook主页(此电脑项目列表):
记得更改Jupyter Notebook默认保存路径!!!
1-2 深度学习与人工智能概述
计算机视觉核心任务:图像分类
1-3 机器学习常规套路
图像在计算机中的表示:
w(wide宽度)*h(hight高度)*c(channel通道)
图像识别的难点:
照射角度、光照强度、形状改变、部分遮蔽
机器学习的常规套路:
- 收集数据集并给定标签(使用网络上的训练集,自己标注较麻烦)
- 训练一个分类器
- 测试、评估
超参数是机器学习和深度学习模型中的参数,是在训练模型之前设置的,而不是通过训练过程学习的。
一些常见的超参数包括:
学习率、批量大小、迭代次数、正则化参数、隐藏层的数量和单元数、优化算法、激活函数
1-4 K近邻与交叉验证
k近邻法(k-nearest neighbor, kNN)是一种基本的分类与回归方法,是一种基于有标签训练数据的模型,是一种监督学习算法。
基本做法的三个要点是:
- k值的选择(找出训练集中与带估计点最靠近的k个实例点)
- 确定距离度量
- 分类决策规则
对于未知类别属性数据集中的点:
- 计算已知类别数据集中的点与当前点的距离
- 按照距离依次排序
- 选取与当前点距离最小的k个点
- 确定前k个点所在类别的出现概率
- 返回前k个点出现频率最高的类别作为当前点预测分类
实线圆中,绿色可归为三角形;虚线圆中,绿色可归为正方形
K近邻算法的不足:
当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。
解决办法:
不同的样本给予不同权重项
交叉验证是评估和选择机器学习模型的重要方法,有助于避免欠拟合和过拟合,确保模型在训练和测试集上有良好表现,顾名思义,就是重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集,用训练集来训练模型,用测试集来评估模型预测的好坏。在此基础上可以得到多组不同的训练集和测试集,某次训练集中的某样本在下次可能成为测试集中的样本,即所谓“交叉”。
参数的选择:
- 选取超参数的正确方法是:将原始训练集分为训练集和验证集,我们在验证集上尝试不同的超参数,最后保留表现最好那个。
- .如果训练数据量不够,使用交叉验证方法,它能帮助我们在选取最优超参数的时候减少噪音。
- 一旦找到最优的超参数,就让算法以该参数在测试集跑且只跑一次,并根据测试结果评价算法。
- k近邻算法简单易实现,但需要存储所有训练数据,并且在测试的时候过于耗费计算能力。
- 图像更多的是按照背景和颜色被分类,而不是语义主体分身。
1-5 得分函数
在神经网络的输出层,得分函数将网络的内部表示转化为具体的预测值或分类结果。在分类任务中,得分函数通常表现为一个线性组合或非线性映射,它将网络的输出转换为每个类别的得分或概率。通过比较不同类别的得分,我们可以确定输入数据所属的类别。在回归任务中,得分函数则直接输出预测值,如房价、股票价格等连续变量。
假设该图片为4个像素点,其值分别为:56、231、24、2,为Xi,对每个像素计算其不同类别的分值,4个像素点的权重参数进行3个类别的判断,形成一个得分矩阵W,该矩阵W大小为3*4,计算W*Xi,得到3个类别的得分(正值表示正面影响,负值表示负面影响),加上得分参数矩阵b,构成得分结果矩阵f(Xi;W,b)
1-6 损失函数
损失函数衡量了神经网络的预测值与实际值之间的差距,为优化算法提供了指导方向。常见的损失函数包括均方误差损失(用于回归任务)、交叉熵损失(用于分类任务)等。这些损失函数根据不同的任务需求和数据特点设计,旨在最小化预测值与实际值之间的误差。在神经网络的训练过程中,我们通过反向传播算法和梯度下降等优化算法来不断调整网络参数,以最小化损失函数的值。选择合适的损失函数进行迭代并优化算法,我们可以使神经网络在训练过程中不断逼近真实的数据分布和规律,从而提高其预测性能和泛化能力。
损失值:
当前权重对模型表达的情况是好还是不好。
Max损失函数:
根据图片在不同种类的得分值,计算正确分类得分与错误分类得分的差异值,如计算第一张图在‘猫’、‘车’、‘青蛙’的得分差异,max(0,5.1-3.2+1)+max(0,-1.7-3.2+1)=max(0,2.9)+max(0,-3.9)=2.9,同理得0,12.9。
上面的结果表明,对第二张图片的识别损失很小,识别率高,对第三张图片的识别损失很大,识别率低。
对于不同的得分矩阵W1,W1,…,用相同的loss方式计算损失值,选取合适的loss函数使其得分结果矩阵的损失最小。
1-7 softmax分类器
经过损失函数和得分函数处理后得到的数据是一个包含图片在每个类别的得分值矩阵,我们可以使用softmax运算把该得分值转换为概率。softmax运算的本质是将各个预测结果的单个可能性转换为整体预测中的概率,即输出的分类概率加和为1。
sigmoid函数(一个经典的非线性函数):
对任意的一个实数X1我们都可以得到一个在[0,1]值域的Y1,结合之前的得分函数,一个输入对应每一个类别的得分X,我们都可以把这个得分映射到[0,1]区间内,也就是把我们的得分数值转成了相应的概率值Y。
sigmoid函数运行流程:
- 对应于一个输入,计算出它属于每种类别的得分值
- 使用指数函数放大得分值差异
- 利用sigmoid函数把所有的得分值映射成一个概率值(总和为1的几个数)
- 对最终正确分类所占的概率求log值再取负号就得到了最终结果(总和为1的几个数)
二:神经网络架构
这节课涉及:神经网络整体构架、神经网络工作原理、激活函数、反正则化与过拟合问题。
2-1 梯度下降原理
在一个3072个像素点的图像中,有3072个对应的权重参数w,我们可以想象该图像为一个山,我们在山上的某一处位置。沿着山坡往下走,到达山坡的最低点,当前的最低点意味着该损失函数的模型更合适。沿着一个函数的导数方向走时,函数下降的最快。正常情况下,梯度方向都使值上升,因此沿着梯度反方向走,可得到下降的函数值。在走的过程中,若步长过大,容易错过最小值点。
步长:
步长是实际上在梯度下降的过程中沿梯度负方向移动的距离,也就是对应于上文中所提到的两次测量最陡路径之间的距离,在机器学习中也被称为学习率。
梯度(求导):
梯度下降求解思路:
while True: weights_grad = evaluate_gradient(loss_fun, data, weights) weights += -step_size * weights_grad #执行参数更新
Bachsize(批处理)求解思路:
while True: data_batch = sample_training_data(data, 256) #256例样本 weights_grad = evaluate_gradient(loss_fun. data_batch, weights) weights += -step_size * weights_grad #执行参数更新
Bachsize通常是2的整数倍(32,64,128)
正常情况下,当进行一个图像训练时,基于梯度下降算法先算损失值,找出合适的更新方式。然而一张图像更新参数时,该图像可能包含一定量的噪音/离群值,或者该图像的标注有问题,导致不一定使参数往正确方向更新,因此需要引入Bachsize进行批处理,一次处理一堆图像,统一计算出平均更新方向,即为大致正确方向。
2-2 学习率的作用
训练网络时的LOSS值可视化结果:
由图可见,过高的学习率反而会使LOSS值上升,因此应该选择偏低的学习率。
假设有5w个数据,跑完5w个数据称为1个epoch,其中每次以100个数据为一批单位,进行500次迭代。epoch = bachsize * 迭代次数。
2-3 反向传播
神经网络三部分:前向传播、反向传播、参数更新
前向传播:
有一个输入经过了神经网络的这么多层,得到的loss值。
反向传播:
基于前向传播得到的loss值,判断神经网络中的参数该往什么方向调节,使得结果往优化方向走。
参数更新:
沿着上一步求出的梯度反方向,乘上步长(学习率)对参数进行更新。
对下列函数f(x, y, z)=(x + y) * z
通过f对z求偏导,得3,即z增大1倍,会导致结果增大3倍,因此需要把z减小。
通过f对q求偏导,得-4,q再对x求偏导,得1,则f对x求偏导为-4,即x增大1倍,会导致结果减小4倍。
y同理,得5。
更复杂的例子(sigmoid方程):
对于该方程,想求反向传播,由最终结果0.73往回传……
首先结果为0.73,由1/x=0.73得,x=1.37,将1/x对x求偏导得-1/x²,带入x=1.37,得-1/1.37²=-0.53,得偏导1.00*-0.53=-0.53。
对结果1.37和偏导-0.53,由x+1=1.37得,x=0.37,将x+1对x求偏导得1,带入x= 0.37,得偏导-0.53*1=-0.53。
对结果0.37和偏导-0.53,由e的x次幂=0.37得,x=-1,将e的x次幂对x求偏导得e的x次幂,带入x=-1,e的-1次方=0.37,得偏导-0.53*0.37=-0.196≈-0.20。
……依次往前回传。
博主的理解思路:
2-4 神经网络基础架构
神经网络的特点:
- 神经网络是全连接层次的结构
- 非线性(若不使用非线性的激活函数,则多少层都可看作一层)
对于下列例子:
- 将[1*3]的输入层,使用非线性的激活函数和一个[3*4]权重参数矩阵,特征提取为[1*3]*[3*4]=[1*4]的隐藏特征层1;
- 再通过一个[4*4]权重参数矩阵,特征提取为[1*4]*[4*4]=[1*4]的隐藏特征层2;
- 再使用非线性的激活函数一个全连接的[4*1]权重参数矩阵,最终得到[1*4]的输出层。
2-5 神经网络实例演示
使用浏览器展示深度学习参数:
ConvNetJS:浏览器中的深度学习 (stanford.edu)
神经网络内部可解释性较差的原因:
- 神经元多,内部权重参数组合的方式很难确定
- 结构分层,隐藏层多
- 神经网络的参数对应的特征不是人工设计的,是神经网络在学习过程中自己选择的,因此无法解释整个模型的运作机制,自然也无法得出明确而又针对性的优化方案。
2-6 正则化与激活函数
神经网络最大的问题:深度学习模型具有很高的灵活性和能力,如果训 练数据集不够大,将会造成一个严重的问题–过拟合,神经网络为了使得训练集中的每一个点都能找到,决策边界会为了满足某些个别点、噪音点、离群点的需求,会产生奇怪的分类决策边界。
机器学习中的一个核心目标,是设计不仅在训练数据上表现好,且能在新输入上泛化好的算法。在机器学习中,许多可能会以增大训练误差为代价的策略被设计来减少测试误差,这些策略被统称为正则化。尽管神经网络在训练集上效果很好,但是学到的网络不能应用到测试集中,所以在深度学习模型中使用正则化是必要的。
通过正则化,分类边界变得更趋于线性与简单性,而测试精度也更高,避免了过拟合,且具有更强的泛化能力。
越多的神经元,就越能够表达更复杂的模型,但同时过拟合的风险也越高。
激活函数:
激活函数是一种添加到人工神经网络中的函数,对所有的隐藏层和输出层添加一个非线性的操作,使得神经网络的输出更为复杂、表达能力更强,其中非线性激活函数允许网络复制复杂的非线性行为。此外,复杂的激活函数也许产生一些梯度消失或爆炸的问题。
sigmoid的缺点:反向传播中,一旦某一层的梯度值≈0,之后所有层的梯度值都≈0,无法进行传播,即无法更新参数。
ReLU函数优点:
- 梯度传播不会消失
- 计算简单,效率高
2-7 drop-out
数据预处理:
- x值各减去均值(使x值分布在原点周围)
- 归一化处理,使x和y的重要程度相当
Drop-out:通过在训练神经网络期间随机丢弃单元来防止神经网络过拟合的措施。
测试的时候仍用全部神经元,但在训练时只用随机部分神经元。
在神经网络的训练过程中,对于一次迭代中的某一层神经网络,先随机选择其中的一些神经元并将其临时丢弃,然后再进行本次的训练和优化。在下一次迭代中,重新随机隐藏一些神经元,直至训练结束。故而每一个批次都在训练不同的网络,能够减少神经元之间复杂的共适应关系,从而降低过拟合风险。
三:迈向计算机视觉-卷积神经网络(核心)
这节课涉及:卷积神经网络整体架构、卷积计算流程、池化层原理、卷积神经网络涉及参数详解。
3-1 tensorflow安装
3-2 tensorflow基本套路
3-3 tensorflow常用操作
3-4 tensorflow实现线性回归
3-5 tensorflow实现手写字体
3-6 参数初始化
3-7 迭代完成训练
四:卷积神经网络技巧
这节课涉及:数据增强策略、迁移学习、网络设计技巧、三代经典物体检测框架。
4-1 卷积体征提取
4-2 卷积计算流程
4-3 卷积层计算参数
4-4 池化层操作
4-5 卷积网络整体构架
4-6 经典网络构架
五:自然语言处理
这节课涉及:递归神经网络、LSTM网络架构、语言模型、Word2vec词向量实战。
5-1 卷积网络复习
5-2 使用CNN训练mnist数
5-3 卷积与池化操作
5-4 定义卷积网络计算流程
5-5 完成迭代训练
5-6 验证码识别概述
5-7 验证码识别流程
六:深度学习框架Tensorflow
这节课涉及:Tensorflow基本操作、Tensorflow构建回归模型、Tensorflow神经网络实战、Tensorflow构造卷积神经网络。
6-1 自然语言处理与深度学习
6-2 语言模型
6-3 神经网络模型
6-4 CBOW模型
6-5 参数更新
6-6 负采样模型
6-7 案例:影评情感分类
七:Tensorflow案例实战
这节课涉及:Mnist手写字体识别、验证码识别案例、强化实战案例、让AI自己玩游戏。
7-1 急于词袋模型训练分类器
7-2 准备word2vec输入数据
7-3 使用gensim构建word2
7-4 tfidf原理
7-5 对抗生成网络原理概述
7-6 GAN网络结构定义
7-7 GAN迭代生成
7-8 DCGAN网络特性
7-9 DCGAN网络细节
八:Tensorflow黑科技实战
这节课涉及:Tensorflow实战RNN与LSTM网络、使用Tensorflow训练AI自己写唐诗、图像风格转换原理、构造艺术风格生成网络。
8-1 RNN网络架构
8-2 LSTM网络架构
8-3 案例:使用LSTM进行情感分析
8-4 情感数据集处理
8-5 基于word2vec的LSTM模型
8-6 趣味网络串讲
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/157409.html