wndDL课后学习笔记

在这里插入图片描述

··————————·· 1.1 深度学习简介
·AI是新电力的意思就是,就像100年前产生电能一样,AI正在改变很多的行业。

·深度学习快速发展的两个原因是更快的硬件计算能力和更多的数据。

·关于不同的机器学习思想的迭代图能够让深度学习工程师快速地实现自己的想法、更快的训练模型、在更好的计算机上能减少训练时间,但在大数据集上的训练时间不会快于小数据集,这是常识。

·不管是经验丰富还是新手,都需要通过不同的模型多次迭代来选择一个最佳模型。
也许之前的一些经验可能会有所帮助,但没有人总是可以找到最佳模型或超参数而无需迭代多次。

·图片(识别猫)属于非结构化数据,统计不同城市人口、GDP、经济增长的统计数据集是结构化数据。

·为什么在上RNN(循环神经网络)可以应用机器翻译将英语翻译成法语?
因为它可以被用作监督学习,适合用于输入-输出序列的场景。

·增加训练集或神经网络的大小通常不会影响算法的性能,这可能会有很大的帮助。

··————————·· 1.2 神经网络基础
·神经元节点先计算线性函数(z = Wx + b),再计算激活。

·img是一个RGB三通道的32x32像素的图像,如何将其重新转换为列向量
x=img.reshape((32323,1))

·维度(2,3)+(2,1)=(2,3),dot((2,5),(5,3))=(2,3),(3,3)*(3,1)=(3,3)
广播机制

·矩阵乘法调用dot,直接用*会报错(*是元素乘法,需要两维度相同才可以)

·假设你的每一个实例有n_x个输入特征,在X=[x(1), x(2)…x(m)]中,X的维度是多少?
(n_x, m)

···code logistic
z=wx+b,y=a=sigm(z) -L=ylogy+(1-y)log(1-y) costJ=(∑L)/m

plt.imshow(train_x[2]) # 查看图片

sigm的函数:s = 1 / (1 + np.exp(-z))

#正向传播
A = sigmoid(np.dot(w.T,X) + b)
cost = (- 1 / m) * np.sum(Y * np.log(A) + (1 - Y) * (np.log(1 - A)))
#反向传播
dw = (1 / m) * np.dot(X, (A - Y).T)
db = (1 / m) * np.sum(A - Y)
每执行一次梯度下降更新一次wb,然后重新计算costJ
w = w - learning_rate * dw
b = b - learning_rate * db

#绘制训练学习率的图
costs = np.squeeze(d[‘costs’])
plt.plot(costs)
plt.ylabel(‘cost’)
plt.xlabel(‘iterations (per hundreds)’)
plt.title(“Learning rate =” + str(d[“learning_rate”]))
plt.show()

流程:数据集(读取,reshape,正则或归一标准化)–wb初始化
正反传播迭代模型(一次正反函数,优化器迭代(更新wbJ),模型构建+预测)
画图

··————————·· 1.3 浅层神经网络
·向量化大X是一个矩阵,包含所有的x样本,其中每个列都是一个训练示例

·tanh激活函数通常比隐藏层单元的sigmoid激活函数效果更好,因为其输出的平均值更接近于零
tanh的输出为(-1,1),因此它将数据集中在一起,使得下一层的学习变得更加简单
(除非用在二元分类的输出层,不然sigm基本不用,它的输出可以理解为概率)

·第l层向前传播的向量化实现
Z[l]=W[l]A[l−1]+b[l]
A[l]=gl

·A = np.random.randn(4,3)
B = np.sum(A, axis = 1, keepdims = True)
B.shape = (4, 1)
我们使用(keepdims = True)来确保A.shape是(4,1)而不是(4,),它使我们的代码更加严格。

·第一个隐藏层中的每个神经元节点将执行相同的计算。 所以即使经过多次梯度下降迭代后,层中的每个神经元节点都会计算出与其他神经元节点相同的东西。

·隐藏单元使用tanh激活,如果将权重初始化为相对较大的值,这将导致tanh的输入也很大,因此导致梯度接近于零,优化算法将因此变得缓慢。

···code 单隐藏层网络
#前向传播
Z1 = np.dot(W1 , X) + b1
A1 = np.tanh(Z1)
Z2 = np.dot(W2 , A1) + b2
A2 = sigmoid(Z2)
#反向传播
dZ2= A2 - Y
dW2 = (1 / m) * np.dot(dZ2, A1.T)
db2 = (1 / m) * np.sum(dZ2, axis=1, keepdims=True)
dZ1 = np.multiply(np.dot(W2.T, dZ2), 1 - np.power(A1, 2))
dW1 = (1 / m) * np.dot(dZ1, X.T)
db1 = (1 / m) * np.sum(dZ1, axis=1, keepdims=True)
梯度下降更新w1、w2、b1、b2-=learning_rate * d?

··————————·· 1.4 深度神经网络的关键概念
·实现前向传播和反向传播中使用的cache,用它传递前向传播中计算的变量到相应的反向传播步骤,它包含用于计算导数的反向传播的有用值。

·隐藏层大小、学习率、迭代次数、神经网络层数都属于超参数。

·神经网络的更深层通常比前面的层计算更复杂的输入特征。

·在层间计算中,我们不能避免for循环迭代,可以优化减少一个for循环(样本矩阵化),但还是需要显示的使用for。

·神经网络层数被计为隐藏层数+1。输入层和输出层不计为隐藏层。

·在反向传播期间,您需要知道正向传播中使用哪种激活函数才能计算正确的导数。

··————————·· 2.1 深度学习的实践
·开发和测试集应该来自同一分布。

·如果你的神经网络模型有很高的方差,可以添加正则化或获取更多的数据。

·L2正则化也称为权重衰减,实际上就是梯度下降在每次迭代时权重收缩,会平衡过拟合欠拟合问题

·用dropout、L2正则化、增加数据集可用于减少方差(减少过拟合)。

·归一化的作用:如果输入特征处于不同范围内,使用归一化,使其趋向归于相似范围,导致costJ会更圆一些,更易优化,梯度下降更易找到最低点(它使成本函数更快地进行优化)。

·反向dropout:使用a除以keep_prob,在计算成本的时候仍然具有相同的期望值(不能改变z的期望值)。

··————————·· 2.2 优化算法
在梯度下降中,我们希望纵向b减缓摆动,加快横向w的学习速度

优化算法:mini-batch梯度下降法:把样本x和y打包成很多小包,同时处理小量样本,用各个子训练集进行梯度下降算法,在巨大数据集面前,它可以更持久,不会因为一部分崩掉而整个崩掉
计算每个batch的梯度下降得到x{1},y{1}约等于整个训练集的x,y
实践中应该选择不大不小的minibatch,这样效果最好

优化算法:指数加权平均,比如取0.9(指数加权平均数)的上个结果+0.1的今天的结果所得到的非线性图像
可以引入一个参数做偏差修正,Vt/(1-β^t),β=0.98,对初始时期的误差做处理,偏差修正能帮助在早起获得更好的估测

优化算法:momentum动量梯度下降法,类似于加权算法,对dw和db重新赋值,Vdw=β的Vdw+(1-β)的dw,β=0.9,一般省掉(1-β),所以实质就是把dw.db的答案乘以了1/(1-β)倍,使梯度下降就像碗中球一样越滚越快(我们希望学习时横向速度变快)

优化算法:RMSprop算法(root mean square prop),Sdw=β的Sdw+(1-β)的dw^2,β=0.9,再在反向求导更新w.b时减去a*dw/S的平方根
(为了防止S在某时值很小,对w.b的更新影响太大,我们会在分母上加一个挺小的数ε来适当防止数值不稳定,ε常常为10^-8)
原理是纵轴上b的斜率大,求得的S就大,致使b更新的摆动变小,而w则相反,更新速度变快

优化算法:Adam算法(adaptive moment estimation)(momentum+RMSprop)
Adam算法是训练神经网络中最有效的算法之一,它是RMSProp算法与Momentum算法的结合体。
初始化Vdw.Vdb和Sdw.Sdb,指定两个超参数β1.β2,之后的计算中,w.b的更新式子中加入V和S来优化,β1.β2常常为0.9和0.999

学习率衰减的好处是在结果时可以收敛到距最优解相对较小的区域波动
令a乘上一个衰减率,使学习率a离散下降,或者使用指数下降学习率的方法也是一个不错的选择,但都需要你不断的调试参数。并且这个方法不是必须的

··————————·· 2.3 超参数调整,批量标准化,编程框架
在参数中,最重要的有三个,指数加权平均、隐藏单元数、minibatch的大小,其他的参数还有β1、β2、ε、层数、学习率衰减率等
选择参数调试时,先选几个重要的,在一个随机域中随机选择,如果效果好的话然后就在那周围小范围更密集的取值(由粗糙到精确的策略)
(如在以0.001-1内取值,可以用10的梯度来规划取值域)

··————————·· 3.1 和平之城中的鸟类识别(案例研究)
·算法模型的准确度是一个优化指标; 运行时间和内存大小是令人满意的指标。

·如果只知道训练集和开发集误差,还不知道贝叶斯最优误差时,是说明不了说明问题的,知道了人们对图片识别的误差后,才好进行优化。

·学习算法的性能可以优于人类表现,但它永远不会优于贝叶斯错误的基准线。

··————————·· 3.2 自动驾驶(案例研究)
·机器学习是一个高度迭代的过程。我们需要在基本模型上创建、编码和实验,然后迭代以找出对给定问题最有效的模型。
所以开始新任务时,最好的做法是先花几天时间训练一个基本模型,看看它会犯什么错误。

··————————·· 4.1 卷积神经网络的基本知识
·假设你的输入是一个300×300的彩色(RGB)图像,而你没有使用卷积神经网络。如果第一个隐藏层有100个神经元,每个神经元与输入层进行全连接,那么这个隐藏层有多少个参数(包括偏置参数)
100(X)*3(RGB)300300+100(b)=27000100 个参数

·假设你的输入是300×300彩色(RGB)图像,并且你使用卷积层和100个过滤器,每个过滤器都是5×5的大小,请问这个隐藏层有多少个参数(包括偏置参数)
参数和输入的图片大小是没有关系的,参数值只与过滤器有关,并且每一个完整的过滤器有一个偏置参数b
(355+1)*100=7600 个参数

·卷积网络的维度:
n_output=((n_input+2pad-filter)/step) +1
当步幅为1,使用same卷积方式时,filter=2
pool+1

·卷积网络的两个好处:参数共享和稀疏连接
前者是适用于整个样本输入的计算,它允许在整个输入值的多个位置使用特征检测器
后者是它允许梯度下降将许多参数设置为零,从而使得连接稀疏,下一层中的每个激活只依赖于前一层的少量激活

·CNN构成:conv-relu-pool-fc-softmax

·池化层会减少输入的宽度和高度,这样它会较少计算量的同时也使特征检测器对其在输入中的位置更加稳定。
两种类型的池化层:

最大值池化层:在输入矩阵中滑动一个大小为fxf的窗口,选取窗口里的值中的最大值,然后作为输出的一部分。

均值池化层:在输入矩阵中滑动一个大小为fxf的窗口,计算窗口里的值中的平均值,然后这个均值作为输出的一部分。

··————————·· 4.2 深度卷积模型
·计算残差(ResNet)块的公式:
a[l+2]=g(z[l+2]+a[l])=g(w[l+2]*a[l+1]+b[l+2]+a[l])=…
a[l+1]=g(w[l+1]*a[l]+b[l+1])

·关于残差网络:跳跃连接计算输入的复杂的非线性函数以传递到网络中的更深层,跳跃连接能够使得网络轻松地学习残差块类的输入输出间的身份映射。

·你有一个维度为nH×nW×nC的卷积输入(卷积层为1x1,step为1,padding为0)
你能够使用1x1的卷积层来减少nC,但是不能减少nH、nW,可以使用池化层减少nH、nW,但是不能减少nC

·Inception块通常使用1x1的卷积来减少输入卷积的大小,然后再使用3x3和5x5的卷积。

·使用开源实现可以很简单的来实现复杂的卷积结构,这对其他计算机视觉任务的预训练是有用的。
并且使用获得计算机视觉竞赛奖项的相同的技术,可以广泛应用于实际部署。

··————————·· 4.3 检测算法
·目标检测需要输出n个标记时,会有2n个输出节点,因为图像是二维的。

·YOLO算法目标检测,只有一个包含对象的中心/中点的一个单元负责检测这个对象。

·使用YOLO算法,使用19x19格子来检测20个分类,使用5个锚框(anchor box)。在训练的过程中,对于每个图像你需要输出卷积后的结果yy作为神经网络目标值(这是最后一层),yy可能包括一些“?”或者“不关心的值”。请问最后的输出维度是多少?
目标向量:
19*19(网格)*5(anchorbox对象检测数)*25(向量维度=目标对象数+对象id+边界框参数)

·yolo算法的y=(Pc,bx,by,bh,bw,c)分别为概率.(x,y)坐标.height.weight.目标
检测出来对象了使用非极大值抑制NMS(non-maximum suppression)确定目标作为最终输出(只取其中最大loU值的那个输出)

··————————·· 4.4 特殊应用:人脸识别和神经风格转换
·面部验证只需要将新图片与1个人的面部进行比较,而面部识别则需要将新图片与K个人的面部进行比较。

·人脸识别的一个问题就是一次学习(one shot)的问题
解决方法:similarity函数d=两张图片的差值,如果差异值大于某个阈值,就预测不是同一个人

·训练人脸识别系统的数据集,每个人都需要多张照片。

·孪生卷积网络(Siamese network)即便输入不同,其中各种参数也是相同的。

·神经风格转换不属于监督学习,因为它的图片没有标签。
神经风格转换优化算法迭代时更新的是生成图像G的像素值。

·用拥有的是3D的数据,现在构建一个网络层,其输入的卷积是32×32×32×16(此卷积有16个通道),对其使用32个3×3×3的过滤器(无填充,步伐为1)进行卷积操作,输出的卷积是30×30×30×32

·在人脸验证中,你需要给出两张照片并想知道是否是同一个人,最简单的方法是逐像素地比较这两幅图像,如果图片之间的误差小于选择的阈值,那么则可能是同一个人。
当然,如果你真的这么做的话效果一定会很差,因为像素值的变化在很大程度上是由于光照、人脸的朝向、甚至头部的位置的微小变化等等。接下来与使用原始图像不同的是我们可以让系统学习构建一个编码f(img),对该编码的元素进行比较,可以更准确地判断两幅图像是否属于同一个人。

使用三元组图像APN进行训练
三元组损失函数:L=max(||AP||2-||AN||2+α,0)

神经风格转换(Neural Style Transfer,NST)是深学习中最有趣的技术之一。它合并两个图像,内容图像(Content)和风格图像(Style),以创建生成的图像(Generated)。
生成的图像G将图像C的内容与图像S的风格相结合。

使用在不同任务上训练的网络并将其应用于新任务的想法称为迁移学习。

神经风格转换:J(G)=aJ(C,G)+bJ(S,G)(内容和风格代价函数)
内容代价:通过aC和aG的激活值求差平方
风格代价:一个风格S矩阵一个G矩阵求差平方归一后得到风格代价函数

··————————·· 5.1 循环神经网络
·Γu的向量维度等于LSTM中隐藏单元的数量。

·你有一只宠物狗,它的心情很大程度上取决于当前和过去几天的天气。你已经收集了过去365天的天气数据x<1>,…,x<365>,这些数据是一个序列,你还收集了你的狗心情的数据y<1>,…,y<365>,你想建立一个模型来从x到y进行映射,你应该使用单向RNN还是双向RNN来解决这个问题?
单向RNN,因为狗的心情不会依赖明天的天气情况

·RNN和一般DNN的区别在于,它是一层一个输出,RNN需要显式for循环(遍历时间步T_x)。

·LSTM网络有三门:遗忘门、更新门、输出门。
假设我们正在阅读文本中的单词,并希望使用LSTM来跟踪语法结构,比如主语是单数还是复数。如果主语从单数变为复数,我们需要找到一种方法来摆脱我们先前存储的单复数状态的记忆值,这就用到了遗忘门Γ⟨t⟩f=σ(Wf[a⟨t−1⟩,x⟨t⟩]+bf)
一旦我们“忘记”所讨论的过去的主题是单数,我们需要找到一种方法来更新它,以反映新的主题现在是复数,用到了更新门Γ⟨t⟩u=σ(Wu[a⟨t−1⟩,x⟨t⟩]+bu)
然后经过一个更新单元:
c⟨t⟩=tanh(Wc[a⟨t−1⟩,x⟨t⟩]+bc),c⟨t⟩=Γ⟨t⟩f∗c⟨t−1⟩+Γ⟨t⟩u∗c⟨t⟩
最后是决定输出的输出门:
Γ⟨t⟩o=σ(Wo[a⟨t−1⟩,x⟨t⟩]+bo),a⟨t⟩=Γ⟨t⟩o∗tanh(c⟨t⟩)

猜你喜欢

转载自blog.csdn.net/weixin_42394432/article/details/82918009