回归问题
分类问题(手写数字识别)
![](https://i-blog.csdnimg.cn/blog_migrate/74b50c92675f4a6f21d606a09dba725b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ff2122a0fb384630b84f74ec2ca3cfab.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1dafb8702c465ed3f2637c512159cf2b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5eb881194bba893491e02215a9f227c2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6565528113f2a13a5158bf143b8e9c65.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b968e006abc6c9dbbee4b9e58b8f56e4.png)
基础知识
张量数据类型
python和PyTorch类型对应
![](https://i-blog.csdnimg.cn/blog_migrate/41433a5899960df1d687f5b81a0e1551.png)
但是String在PyTorch中是没有对应的,可以有以下两种方法,一是用onehot编码代替,比如分类猫和狗 【1 0 】代表狗,【0,1】代表猫;第二中在NLP中常用的glove等。
![](https://i-blog.csdnimg.cn/blog_migrate/1c0655270fca68b8fc99603997bb0ad7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/fdaa9c796cc7d9dd08ca2ae361f68128.png)
但是这里也要注意,即使是同一个数据,被放在CPU和GPU上的数据类型也是不一样的。
1. 类型推断
![](https://i-blog.csdnimg.cn/blog_migrate/4c5646ecac61a6eb10ffc16ca801ddaf.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7acacefa4a707501eba0c2160b1f9aac.png)
2. dim=0的标量
loss通常就是一个标量
![](https://i-blog.csdnimg.cn/blog_migrate/c72b3c089142b22b1d0b723302782c1f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f018b6bb7ded04ffde5c1741800e87a9.png)
3. dim=1的张量
![](https://i-blog.csdnimg.cn/blog_migrate/65d1d31c9fb7ef05642c40f8ce5ee66c.png)
也可以从numpy引入
![](https://i-blog.csdnimg.cn/blog_migrate/65bd95cc6d68eeaf9f52a93d8b0e1b55.png)
dim(维度)=1的张量通常用于bias
怎么区分开shape,dim,size?
比如有一个张量
[1,2,5
3,4,9],
dim就是行和列两个维度,dim=2;但是size/shape就是[2,3],代表的是形状
4. dim=n的张量
![](https://i-blog.csdnimg.cn/blog_migrate/ce96b6c3641dfc8178c2e1c6c3cf23c2.png)
三维适合RNN的文字处理
![](https://i-blog.csdnimg.cn/blog_migrate/4f87bfa740a13a79f3ddb9f185548a99.png)
四维适合图片类型
![](https://i-blog.csdnimg.cn/blog_migrate/c9638822b29c7c059fb7d736ff7135b7.png)
(2,3,28,28)对应(b,c,h,w),b是batchsize,c是channel,h是height,w是width。
![](https://i-blog.csdnimg.cn/blog_migrate/2e025dcc949aa2cf72899cbd9890777b.png)
numel即number of element=2328*28=4704
创建Tensor
大写Tensor和小写tensor,区别
![](https://i-blog.csdnimg.cn/blog_migrate/7835badd9d5a77c1544d3ed2f812ca52.png)
从numpy导入
![](https://i-blog.csdnimg.cn/blog_migrate/d75dfa6b4f5c4292f59a65ed8c446bd4.png)
从list导入
![](https://i-blog.csdnimg.cn/blog_migrate/40b2a25e36b0ffa41d207fcca86fa840.png)
empty()
![](https://i-blog.csdnimg.cn/blog_migrate/eb2ef872bba225c99d6499e6655b987f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d888e8989527ef49994d3a6c4888a180.png)
set default type
![](https://i-blog.csdnimg.cn/blog_migrate/ec7cb907879b40dbf838c96442b33f9c.png)
rand/rand_like,randint
随机初始化tensor
![](https://i-blog.csdnimg.cn/blog_migrate/aca02e52bfc0d27d18c8c353c2a8a6af.png)
正态分布构造 randn
![](https://i-blog.csdnimg.cn/blog_migrate/07bcbdb495fd4d82f3f5ee4f7ac843e7.png)
full构造
![](https://i-blog.csdnimg.cn/blog_migrate/54f66b8bfe78d0869b4aa6752e6c9bd8.png)
arange/range
![](https://i-blog.csdnimg.cn/blog_migrate/7e386d570b884caaf99d34ae76a18dc0.png)
linspace/logspace
切割
![](https://i-blog.csdnimg.cn/blog_migrate/a37a8d4f40da38616ffb56dd3d6f941d.png)
ones/zeros/eye
![](https://i-blog.csdnimg.cn/blog_migrate/cd97388b9a27d2af827f267a91004d76.png)
随机打散,这啥意思,不懂啊
randperm
是把索引随机打散,下面10,就是把0到10随机打散
![](https://i-blog.csdnimg.cn/blog_migrate/29921cb3873320c30d744e18b58dc669.png)
索引与切片
如何对tensor索引
![](https://i-blog.csdnimg.cn/blog_migrate/6687e52162a2812cbc2c675c1b81f723.png)
高级索引方式,连续选取
冒号
可以看成箭头
![](https://i-blog.csdnimg.cn/blog_migrate/4da69a90f85ac7196cc9686e635c3c6f.png)
-1就是从最后一个索引位置开始
隔行索取,有2个冒号出现,后面一个是步伐,其实通用形式就是start:end:step
![](https://i-blog.csdnimg.cn/blog_migrate/a1d58233d311d7261ef1fa7925d2e223.png)
index_select
若给了具体的索引
![](https://i-blog.csdnimg.cn/blog_migrate/d823078169749c38f16e1c640563135e.png)
...
表示任意多的维度,其实就是简化一些 :,:,
![](https://i-blog.csdnimg.cn/blog_migrate/5ca1030d9f26dc44a29532ce7184689f.png)
mask_select
使用掩码索引,有弊端:会把数据默认打平,故不常用
下面就是把大于0.5的变成1,再用masked_select提取出来
![](https://i-blog.csdnimg.cn/blog_migrate/cfe777c6ede546faece38848d44abda0.png)
take函数
还有一种也是打平,用的也不多
![](https://i-blog.csdnimg.cn/blog_migrate/6fec353928e51451164ea8d876700146.png)
维度变换
![](https://i-blog.csdnimg.cn/blog_migrate/28d98a9881f0fc611d76fc06d3ae61e1.png)
View reshape
![](https://i-blog.csdnimg.cn/blog_migrate/d2e1735411fd5d4f84ef2d2a78e924d5.png)
数据的储存/维度顺序非常重要!!!如上22,23,24行,如果恢复错误则出现混乱,这是view的致命缺点:把维度顺序丢失
Squeeze v.s. unsqueeze
挤压和展开
unsqueeze!!!
用于插入
![](https://i-blog.csdnimg.cn/blog_migrate/d64f292b7310a110c037cad251b653cd.png)
0表示在0位置之前插入,-1表示在-1位置之后插入
正数插在前,负数插在后
下面是个好例子
![](https://i-blog.csdnimg.cn/blog_migrate/5d937a605243a35c7c2e2f573125a62f.png)
要把b加到f上,先要让它们维度一致,给b插入维度
![](https://i-blog.csdnimg.cn/blog_migrate/4970bcc810210ad207f27d259809cc66.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9ba3d9e1d0f52ab9431a37d649175054.png)
在新的上面插入,维度一致后再扩张,后续讲到
Squeeze
squeeze(参数),不加参数就把能挤压的全部挤压
![](https://i-blog.csdnimg.cn/blog_migrate/74ffb1a9ac607a4ffc25decf550729db.png)
13.14行,因为1位置是32不是1,无法挤压,返回原来的
Expand/repeat
![](https://i-blog.csdnimg.cn/blog_migrate/8a780a90f58f5951aefa188f51111de6.png)
二者都扩展维度,expand只在需要的时候同时扩展数据,repeat实实在在把数据复制和扩展进来
因此推荐使用expand,不占内存
![](https://i-blog.csdnimg.cn/blog_migrate/65330ef9c7a40eea491c14a6da338b28.png)
原来size不为1想扩展到别的size是没办法的,只能由1->N
-1表示这个维度的size不变,12和13行是bug但在最新版本已经被修复
repeat函数,数字表示在该维度上重复的次数
![](https://i-blog.csdnimg.cn/blog_migrate/2116ce43d79b5b65eebed02362f8918d.png)
矩阵转置
a.t() 只适2D(矩阵),否则会报错
![](https://i-blog.csdnimg.cn/blog_migrate/1edee8e3bebf82ec0190a45c60908fea.png)
Transpose
![](https://i-blog.csdnimg.cn/blog_migrate/853ea4064474c9447bdb4172165af650.png)
view会导致维度关系变模糊,所以需要人为跟踪,contiguous函数使内存顺序变得连续,重新申请一片内存再复制过来
permute
[b,c,h,w]-->[b,h,w,c]
[b,h,w,c]是numpy存储图片的格式,需要这一步才能导出numpy
可以用transpose,但是可以看出很麻烦
![](https://i-blog.csdnimg.cn/blog_migrate/cb324c764507f0f47943d51620acd77a.png)
14,15行,现在的1位置放放原来的2位置,以此类推
Broadcasting自动扩展
![](https://i-blog.csdnimg.cn/blog_migrate/34aaae1905a28b03a82495de223613a6.png)
手动插入,先插小维度
![](https://i-blog.csdnimg.cn/blog_migrate/244b70e977013c0ec6a679e0ffe80260.png)
如下,2和3
![](https://i-blog.csdnimg.cn/blog_migrate/176458e6bb1c70104bd91b4e26bf9c79.png)
broadcasting可以直接让2个不同shape的tensor相加,同时省下了大量内存消耗
如下,给4个班,32个学生,8门课的分数都+5分
如果用unsqueeze和expand很麻烦,但直接用broadcasting很快
![](https://i-blog.csdnimg.cn/blog_migrate/1180f6fb27ccbbd3c3228eac7ec476fe.png)
小维度指定,大维度随意,指定每一门课都加5分,前面没有?话意味着对大维度也适合,即对每个班级下每个学生都适合:每门课加5分
下面有误,【4,32,8】
也可以指定只对英语科目加5分,给出小维度的8
如果给出1就是对所有科目
左下给出4,只给出4门课的指定,无法broadcasting
![](https://i-blog.csdnimg.cn/blog_migrate/494d6e0d8d66908faf4867b2b06c24ab.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2d718e2726dfc0ff443789e1a443dd16.png)
如下,对4张图32个通道都使用,自动插入1,把【14,14】的数据叠加上去
![](https://i-blog.csdnimg.cn/blog_migrate/3d47a3420ce0c53158f551d8d4527c2d.png)
,下面不符合使用broadingcast,要使用手动
![](https://i-blog.csdnimg.cn/blog_migrate/f45caec150df5e24e9d5e290237a3ac8.png)
其实就是给出某维度上的1就是都适用去加相同的数据的意思,给出某维度上的全部size就是按照指定的加,已理解
要么给出1,要么给出维度上的最大size
![](https://i-blog.csdnimg.cn/blog_migrate/a6387eb7fc245ee5870fd5259dceeeb6.png)
合并与分割(拼接与拆分)
cat
![](https://i-blog.csdnimg.cn/blog_migrate/ce8693a8c8cae0d64214cfd68a5b503c.png)
在非cat的维度上的size要一样,例如
![](https://i-blog.csdnimg.cn/blog_migrate/40c7b53eff32f49d586a06d3cab98767.png)
stack
与cat不同的是会创造新的维度,给出的两个tensor形状必须一模一样,然后在给出的dim前面插入新的维度,size为2
例如两个班级,a:[32,8] 表示32个学生,8门课程,b:[32,8] 表示32个学生,8门课程;
但是cat的话,就是[64,8],班级的维度就没了
于是stack,就是[2,32,8],下标[0表示a班,[1]表示b班
![](https://i-blog.csdnimg.cn/blog_migrate/647ef89fbc0b0261e933378c8ec285c6.png)
cat v.s stack
![](https://i-blog.csdnimg.cn/blog_migrate/2bbf5a6650fbbfe9e93738a35f4dfba5.png)
split
根据长度来拆分,c.split([a,b],dim=0),表示0维度上拆分成长度为a的一份和长度为b的一份,只有一个数字就是均分
![](https://i-blog.csdnimg.cn/blog_migrate/619deaea57fcf6a0bc6431f85933d2cf.png)
chunk
按照数量拆分
bac拆分成2份
![](https://i-blog.csdnimg.cn/blog_migrate/4a571be88cd2e6770c08a1128377b4b7.png)
数学运算
basic
![](https://i-blog.csdnimg.cn/blog_migrate/78c02ca194f1ea38281084064e22b894.png)
+-*/对应函数add,sub,mul,div,本质是一样的
/表示除法,//表示整除
matmul
矩阵相乘,也可以用@符号
![](https://i-blog.csdnimg.cn/blog_migrate/2ab55a89339994697cad2ff79dba8f93.png)
把a降维[4,784]->[4,512]
![](https://i-blog.csdnimg.cn/blog_migrate/221b34cbf3654562677bd63dad502c26.png)
若对4维度进行相乘,mm会报错
matmul会对后面两个维度进行相乘
![](https://i-blog.csdnimg.cn/blog_migrate/224699d71ab0a13c87c2b3cafbe6b256.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b52d8bbed9ec1d90be0f24cd5470f35d.png)
15,16会进行broadingcast后再相乘,但是18,19不会,于是报错
power
次方运算
![](https://i-blog.csdnimg.cn/blog_migrate/dafdb60e2e3d3c148c7a14e3dca3d450.png)
exp log
![](https://i-blog.csdnimg.cn/blog_migrate/890574286071082fc10b2827b3e2348e.png)
log默认以e为底,要以10为底就是log10
近似
向下取整,向上取整,拆成整数和小数部分
round四舍五入
![](https://i-blog.csdnimg.cn/blog_migrate/526cd9896ac93ce7ccf01582a7ff5f55.png)
clamp
裁剪功能
梯度的模:w.grad.norm(2)
clamp(10)就是要求里面最小的是10,就会把小于10的变为10
![](https://i-blog.csdnimg.cn/blog_migrate/fa5b353e822e0915dd8ecdfc2bce5250.png)
统计属性
norm
范数,
1范数,所有元素绝对值求和;2范数,所有元素绝对值的平方求和再开根号
![](https://i-blog.csdnimg.cn/blog_migrate/1060a0f0daef29abcae8c9303ff7ab04.png)
取哪个维度的范数,取完后的形状这个个维度就会消掉?
mean,sum,min,max,prod,argmax,argmin
prod是累乘
argmax和argmin返回索引
(首先会先打平再得出索引!如下12行得出7而不是[1,3])
![](https://i-blog.csdnimg.cn/blog_migrate/88c8fe87436b2191bc22a4410c2e7616.png)
若argmax(参数给出维度),就是在某个维度的最大值
如下右边,12行输出:给出1dim上的索引,即每行最大值给出列索引
4张照片,每张照片10个prediction,给出每张照片最大prediction的索引
argmax(dim=1)会输出4个索引
argmax(dim=0)会输出10个索引
![](https://i-blog.csdnimg.cn/blog_migrate/c5a3d0bc1d95e4ac3ce49a5928f23031.png)
dim,keepdim
max不仅会返回索引,还会返回值,比argmax多一个功能
![](https://i-blog.csdnimg.cn/blog_migrate/9cb89ba7e80eb14fddd2f0708c29bd30.png)
如果不keepdim,返回[4],维度为1
keepdim则返回[4,1],维度还是2
top-k or k-th
比max返回更多
a.topk(3,dim=1)表示返回最大的前3个,把largest=False就是返回最小
a.kthvalue(8,dim=1)表示返回第8小的
![](https://i-blog.csdnimg.cn/blog_migrate/323273184b7e959838c26d454fedfc63.png)
compare
gt也表示>0
eq,都是对4行10列中的每一个元素进行逐一比较
equal是对整个进行 比较2个tensor是否完全相同,返回ture或false
![](https://i-blog.csdnimg.cn/blog_migrate/6dff0822f6b075573de9c4073d40ebc7.png)
高阶操作
where
![](https://i-blog.csdnimg.cn/blog_migrate/4465717602f5b6000374940d84c1b43d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/163506c545fcfd62107fa81afa1b6dd1.png)
for语句是在cpu上运行的,我们用where就能在gpu上运行,实现并行处理
gather
其实就是一个查表的操作,看右边板书好理解
![](https://i-blog.csdnimg.cn/blog_migrate/23209281410c7d0e9862eac1966dfa88.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9565bed1aeb4a225365e6a7ac4c04f6f.png)
例子,gathe使用完成了从retrieve到globel的映射
![](https://i-blog.csdnimg.cn/blog_migrate/f3d3e2c66784211863361115431da143.png)
搜索一些东西,long()
![](https://i-blog.csdnimg.cn/blog_migrate/f6239c7b4c58de7c91386ff72e906541.png)
梯度
什么是梯度
![](https://i-blog.csdnimg.cn/blog_migrate/3dd9248d7c8f2376be1ca13a8cc9b19b.png)
梯度是一个向量,向量的长度(模)表示函数增长速度,方向表示在当前点最快的增长方向
我们常用梯度来搜索极小值
![](https://i-blog.csdnimg.cn/blog_migrate/39d3e511353604092e8be1a99925ddfd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/bea305506864b6718a4f55ca5589bdd2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5946049777ff045800073d37e7ba786c.png)
凸函数,可以找到全局最优解
![](https://i-blog.csdnimg.cn/blog_migrate/e56773bf37054549dbe00e812b5e04b1.png)
从不同位置初始化可能得到不同的局部最优解
![](https://i-blog.csdnimg.cn/blog_migrate/279be175657c5b1295458de481b17d6e.png)
resnet56很好解决了掉入局部最小值的情况,loss变平滑,更快找到全局最小值,网络可以迭得很深而且很好的优化
![](https://i-blog.csdnimg.cn/blog_migrate/9c0153f2e375227dfe56d28e9fe2bd2a.png)
鞍点,在一个位置
![](https://i-blog.csdnimg.cn/blog_migrate/292968bcd5a0e9b1c689b4049f59fb78.png)
还有几种影响因素
![](https://i-blog.csdnimg.cn/blog_migrate/a7a1f734ffce779c8eb43f0a769c29e5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a6563e800f00df09a04f27464fa4c176.png)
![](https://i-blog.csdnimg.cn/blog_migrate/26199f9d4ba0a67cbcd8dd9edc380fa7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/66fa98f349dd26066c492fe7107d309d.png)
如何逃出局部极小值,添加一个动量(惯性)!可以理解为惯性使其冲出局部最小值
![](https://i-blog.csdnimg.cn/blog_migrate/5721232fd0426e547b1dc45a304f75df.png)
常见函数的梯度
就是求偏微分,很简单
激活函数与loss的梯度
激活函数
sigmoid函数
![](https://i-blog.csdnimg.cn/blog_migrate/ec681e73f30b2481f7c153e82e46f18a.png)
连续,光滑,压缩在0到1之间
![](https://i-blog.csdnimg.cn/blog_migrate/ac97afeedf247074d759c6bee5a7b6ba.png)
代码实现
torch.nn.functional as F!!!
![](https://i-blog.csdnimg.cn/blog_migrate/0bfcb215f5436da00d9bac21894ec58c.png)
Tanh
在RNN网络中用的比较多
![](https://i-blog.csdnimg.cn/blog_migrate/6541bb8b389f764c020b6d985731bfb1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f1a320b9e68cdb1cf700a12db3996e52.png)
![](https://i-blog.csdnimg.cn/blog_migrate/216508dd30030c56520e40e40367d617.png)
Relu
最常用,deep Learning
因为导数计算简单,x>0时就是1,适合寻找最优解
不会出现梯度离散和梯度爆炸的情况
![](https://i-blog.csdnimg.cn/blog_migrate/63127aca2058f41e874de199887895d6.png)
![](https://i-blog.csdnimg.cn/blog_migrate/de9d0a04edaf11a1cf1aacf652519aa4.png)
loss及其梯度
![](https://i-blog.csdnimg.cn/blog_migrate/c089826ea2efe4bfaeb983a0edf993c3.png)
MSE
均方差
![](https://i-blog.csdnimg.cn/blog_migrate/bb279579f3bc41a31d8a66972e01cb8f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ba2cf262c441dc59eec17fcfa137b31f.png)
F.mse_loss(predict,label),完成动态图的建图
autograd.grad
会报错是因为没有设置w是需要求导的
可以像22行那样对w参数进行更新,注意最后的_,告诉系统w是需要梯度的
也可以在定义的时候就给出w需要梯度信息:w=torch.full([1],2,require_grad=Ture)
![](https://i-blog.csdnimg.cn/blog_migrate/9400e8e6b3bdcad4f3728d406b280529.png)
loss.backward
使用后会对需要求导的参数求导,使用w.grad即可调用
![](https://i-blog.csdnimg.cn/blog_migrate/c6bcd168aba7793af214ab013f364fe7.png)
自动求导api
![](https://i-blog.csdnimg.cn/blog_migrate/b019102e66e07ce435cf8c433ae1014b.png)
Softmax激活函数
![](https://i-blog.csdnimg.cn/blog_migrate/05d642a519ffff765c4003b6f6a64e16.png)
求导
当i=j时
![](https://i-blog.csdnimg.cn/blog_migrate/d4249e9c5b72d11e0820c43fa6e2239a.png)
当i !=j时
![](https://i-blog.csdnimg.cn/blog_migrate/7f9266225f7b5b330a979ba5735b2ae9.png)
结论
![](https://i-blog.csdnimg.cn/blog_migrate/9f046652dce62f10d89f2fdf34e0a5e5.png)
p.backward(retain_graph=Ture)只会保持一次,第二次再使用会报错,应该再设置一次
无论是grad函数还是backward函数,传入的loss一定是dim=1的[1],或者dim=0的数
所以不能把整个p传入求导,可传p[1],或者p[2]
![](https://i-blog.csdnimg.cn/blog_migrate/647a8c8fedc58d82baeb51c8c7ab7d8c.png)
感知机的梯度推导
单输出感知机
![](https://i-blog.csdnimg.cn/blog_migrate/51035d4cea61cb111b5aba1e9d6b0440.png)
上标表示层,下标表示节点
![](https://i-blog.csdnimg.cn/blog_migrate/61dee1e67d7c5f1f943d067d231b86d2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f55bb3d11317e16410e8b6f7fcbf58ca.png)
最终结果,很简洁
![](https://i-blog.csdnimg.cn/blog_migrate/d35ded979e3fe6e025661523b0ec4afb.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1bd2628bbc5bbb134034479c314fc912.png)
多输出感知机(全连接输出层)
共有N*M个梯度
![](https://i-blog.csdnimg.cn/blog_migrate/c1142108da9016ae090f05089fc6cafa.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a7cce8ff3a2f836b7157a65d354a2941.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9c896afd68438e2cd14be34a63738279.png)
链式法则
![](https://i-blog.csdnimg.cn/blog_migrate/7800901b68a47b771af0fc900139c226.png)
![](https://i-blog.csdnimg.cn/blog_migrate/98d5902cae61e99f87afbe78ac35dc21.png)
验证链式法则成立
![](https://i-blog.csdnimg.cn/blog_migrate/0266a0158ba24dc28a75e30eaca1a7c7.png)
MLP反向传播
![](https://i-blog.csdnimg.cn/blog_migrate/fdea90feb812dfc6eb7dca91fc9999fc.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d484070e7d97b78149c522ca1b4eafb4.png)
最终结果
![](https://i-blog.csdnimg.cn/blog_migrate/dc267d5d1403ea5dc58952c61dd0cc3d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/61f5bde9b7e15801b5fba4b011811aca.png)
总结
对于任何一层的偏微分式子就可以通过输出层的δ慢慢反推
![](https://i-blog.csdnimg.cn/blog_migrate/f75b1be003ef07ac9eda0869a1109ad3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/34fcd9e8958fb913b97c855936616e62.png)
优化问题实战
2D函数优化实例
![](https://i-blog.csdnimg.cn/blog_migrate/ace5e8d7092df9929db86d75e4435579.png)
2元函数可以画图,其实是不必要的,从图中可以看出初始值
![](https://i-blog.csdnimg.cn/blog_migrate/994240ad45d1a8474f113dacbe3a9f5c.png)
实战
![](https://i-blog.csdnimg.cn/blog_migrate/aacff954254dfa64b605befcaf24b488.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b58bc18dd297bbe902b9f7b768915bbe.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3b0211501bb4b7f15118447d32472ad7.png)
Logistic Regression
![](https://i-blog.csdnimg.cn/blog_migrate/dd08d84984372bf5b058ec51cd55c346.png)
![](https://i-blog.csdnimg.cn/blog_migrate/62cdef0c24b0a46e79bf60aa59baf930.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e552349196e02bf810d3ea1e1f7d550c.png)
二分类
![](https://i-blog.csdnimg.cn/blog_migrate/2a5fefde759fc7ec60f7feacfa93d87a.png)
多分类
![](https://i-blog.csdnimg.cn/blog_migrate/26c15d74151af8a7b2708010555856bb.png)
需要激活函数,让输出具有概率特征,并且导数像sigmoid函数一样有一定的特征
![](https://i-blog.csdnimg.cn/blog_migrate/c4589cadd9927f0fbe62106daa0ae753.png)
交叉熵
与softmax匹配的loss,适用于分类问题
![](https://i-blog.csdnimg.cn/blog_migrate/eff7765ddcea745a59e28c4c14fdeaff.png)
就是信息量,越确定的事情信息量越小,越不确定的事情信息量越大
entropy是单个事件
![](https://i-blog.csdnimg.cn/blog_migrate/461ef9f3bee9e0b825338b41a3f2ba2c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/fe3de00b70256281e116036d2c1242b4.png)
cress entropy是两个事件,Dkl是KL Divergence,即散度
![](https://i-blog.csdnimg.cn/blog_migrate/af9e85d31e2caae1472acb352f485222.png)
![](https://i-blog.csdnimg.cn/blog_migrate/dd868a9edc7cc51ca6ebfd330ac75bae.png)
于是就可以用交叉熵来作为loss
对于二分类问题
![](https://i-blog.csdnimg.cn/blog_migrate/e13d76bcd3fab4401acc11f0c1326798.png)
举例,说明越接近的两个向量,交叉熵越小
![](https://i-blog.csdnimg.cn/blog_migrate/9e09e41602ef6085a9bedea9881898c8.png)
交叉熵和MSE其实各有优缺点,MSE的梯度计算比交叉熵简单
但对于分类问题使用交叉熵
![](https://i-blog.csdnimg.cn/blog_migrate/7b904e824a174a6eaade5843e4fb33d3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2a30f8a1ad39605bfe28f28ce691ccde.png)
注意:pytorch中已经将softmax和交叉熵计算打包在一起,所以使用的时候如下图
要么用41行的形式,要么用42行,注意传入参数
![](https://i-blog.csdnimg.cn/blog_migrate/b998c05ea993a73362ed83e8cf818acf.png)
网络构建
全连接层
![](https://i-blog.csdnimg.cn/blog_migrate/68e310c06b04e31f05d08f68c63629f9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e1163f1a88f04c3e388d53a030048d2d.png)
初级方法
![](https://i-blog.csdnimg.cn/blog_migrate/19d2a61c02840a38b6e3fd30ef1df58b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/54800f43ec25eb0805ec3c3252213db5.png)
若loss长时间不更新:梯度迭代出问题
检查以下几种地方:激活函数,初始值设置有问题
![](https://i-blog.csdnimg.cn/blog_migrate/97141beac9012d86c9cfc0680f5cbc1c.png)
总结
![](https://i-blog.csdnimg.cn/blog_migrate/6ecb0120f6914249a8cce715434bf326.png)
高级方法
![](https://i-blog.csdnimg.cn/blog_migrate/abab6d2c8d8672ead37908a2ec5d27c1.png)
总结
![](https://i-blog.csdnimg.cn/blog_migrate/baa2beba12ef2bda0d1e36763902b58b.png)
对比
![](https://i-blog.csdnimg.cn/blog_migrate/a6775149f0c3f4f4f3a5a74e1b2dd84d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/093a50cb3807a9726e3f068358fef3ff.png)
激活函数与gpu加速
以下当x趋于无穷梯度为0,会出现梯度离散现象
![](https://i-blog.csdnimg.cn/blog_migrate/9f729ae9e9074e121e8b447317341ce5.png)
右边梯度为1,性质好,不会出现梯度离散,但也有可能出现在x<0时
![](https://i-blog.csdnimg.cn/blog_migrate/598d601d5639c6cfacdfa80c63de2420.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e5bfb86532d04af45d45af06f8282ea1.png)
于是出现
Leaky ReLu
![](https://i-blog.csdnimg.cn/blog_migrate/e98b968de752844b0a6c6a5e14ed60ba.png)
![](https://i-blog.csdnimg.cn/blog_migrate/87fbdb53f717ee9b7b5e44ee529e8cea.png)
SELU
由两个函数的合并,目前很少很少用到
![](https://i-blog.csdnimg.cn/blog_migrate/17304dbdb3929a4947fcf699f8c1c3fe.png)
softplus
时relu函数在0附近平滑处理,也用的很少很少
![](https://i-blog.csdnimg.cn/blog_migrate/fad741b32c205b925452864514da8b1a.png)
GPU accelerate
.to方法
![](https://i-blog.csdnimg.cn/blog_migrate/a0a9dfa51b55f6f8b42af48b6f633fb2.png)
测试,计算accuracy
![](https://i-blog.csdnimg.cn/blog_migrate/51ea76e13901118b41b76f4b8ca8b114.png)
![](https://i-blog.csdnimg.cn/blog_migrate/22e421eab9f8a70c03d8c729a9b923fa.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6ecb5ef152443b0df3d93f30ef3019b9.png)
如何test,计算accuracy
![](https://i-blog.csdnimg.cn/blog_migrate/36dcfea1764e5e5b225e19bf8a06be50.png)
Visdom可视化
![](https://i-blog.csdnimg.cn/blog_migrate/cc4eecd270e835ad37f3a3e778e586ef.png)
tensor丢到cpu上再转换为numpy才能做这样的可视化
visdom可以直接接受tensor,还有各种功能
打开监听功能,复制链接到网页,不能关闭
![](https://i-blog.csdnimg.cn/blog_migrate/f7b5da9f7f4cc7779eec263fde0eff85.png)
![](https://i-blog.csdnimg.cn/blog_migrate/230ca432f704ec37aa5320556512a97b.png)
对于image可以直接接受tensor,对直线类型还是接受的numpy数据?
append表示连续画点,刷新率很快,大概一秒一次
![](https://i-blog.csdnimg.cn/blog_migrate/45731494b44dbed654ac651355c965ad.png)
想同时看多个数据这样
![](https://i-blog.csdnimg.cn/blog_migrate/733b7287c81b26e7ff0890f7efd2ff7f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/317e230739be6722fa95b2480ef3eb87.png)
可视化功能
![](https://i-blog.csdnimg.cn/blog_migrate/bcc289e42b8d05ee71a3eab7b0966b18.png)
![](https://i-blog.csdnimg.cn/blog_migrate/030e3097f7b6bb98985a08af9d9759b3.png)
过拟合和欠拟合
![](https://i-blog.csdnimg.cn/blog_migrate/7dd9d5045ad67cd1723662fa5827ada0.png)
![](https://i-blog.csdnimg.cn/blog_migrate/21ba190eb470e9863a0349e6c8910cae.png)
给一个误差
![](https://i-blog.csdnimg.cn/blog_migrate/8455612c4b4aed001857b8f375efdae9.png)
现在我们来选择一个模型去测量
![](https://i-blog.csdnimg.cn/blog_migrate/c1d13341b2a06ef4b8bf42c51b0c7ddf.png)
衡量模型的学习能力?
次方越高,模型表达能力越强 model capacity
![](https://i-blog.csdnimg.cn/blog_migrate/f2e16b37df8758bd60a53558bf96673a.png)
但是参数越高,学习能力越强,占内存越大
![](https://i-blog.csdnimg.cn/blog_migrate/5bee851c83c850919cb760e838a28908.png)
举例
underfitting
以下,模型表达能力不够,复杂度较低
![](https://i-blog.csdnimg.cn/blog_migrate/96b50abb88269efed6ce3cb1fd231ee1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b4fc8982eb75a6c949e44cbd30d1d146.png)
overfitting
过分考虑极端点,模型复杂度太高,更接近于每一个点,可能train得很好,但是test的时候不好
![](https://i-blog.csdnimg.cn/blog_migrate/758ecadaad0c03d5765b211aa3e6edcb.png)
泛化能力也变差
![](https://i-blog.csdnimg.cn/blog_migrate/4507c2b65dfbcdcab2b7972c2c0178dd.png)
总结
![](https://i-blog.csdnimg.cn/blog_migrate/e031d4a822d4d211f25f627b79cbd241.png)
现实情况更多的是overfitting,两种fitting都是对于给定数据集而言,当数据集足够多的情况下可能就不会over fitting
我们要做的事情是如何检测和消除overfitting
![](https://i-blog.csdnimg.cn/blog_migrate/813933673037ee1d25782208fad99844.png)
交叉验证(划分train和test)
如何检测呢
划分,两个部分的分布肯定是一样的
![](https://i-blog.csdnimg.cn/blog_migrate/124fc1da960c0d6a7ce34e46e961f304.png)
![](https://i-blog.csdnimg.cn/blog_migrate/76085ac1b61361a11d7d931eb466a7b4.png)
根据test_loss的情况判断是否overfitting,一般选取testaccurancy最高的点停止,选取这点的状态作为模型参数最佳状态
![](https://i-blog.csdnimg.cn/blog_migrate/c7a7b58ad98fbf748fb076f0a2c7fec0.png)
下图就是再5位置之后过拟合了,最佳状态会被保存,再往后发现确实过拟合了,就将最佳状态作为模型参数
![](https://i-blog.csdnimg.cn/blog_migrate/64be8b06811e7bdb7c0440d690d6bca9.png)
val set
新增的set
防止过拟合的功能交给了val set,一般test set在客户手中你不知道,防止你作弊,过拟合
test set完全只是 单纯用来测试,如果用test测试的数据来反挑选模型,叫做数据污染,用人为想法去得到参数
![](https://i-blog.csdnimg.cn/blog_migrate/30248f7fb1400cff5a7c05ef33af7098.png)
如何划分呢,
![](https://i-blog.csdnimg.cn/blog_migrate/b6c96c3369580a82697f48cba6e80245.png)
左边60k随机切割用来train和validation
![](https://i-blog.csdnimg.cn/blog_migrate/6194bbe12876ed58e5209a0ec0cd737b.png)
Regularization
![](https://i-blog.csdnimg.cn/blog_migrate/cdd83d7e8b775a2baed02f70d3c04fe7.png)
使参数的范数趋近0,会得到更低复杂度的模型,防止overfitting
![](https://i-blog.csdnimg.cn/blog_migrate/36ab9c7dd95a001f037fee980c01b2b1.png)
低维参数足够表达,高维度参数会很小,使模型泛化
![](https://i-blog.csdnimg.cn/blog_migrate/3d08a6fe596caba5dc815d17b1c94291.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ae1c83d9789b744fd82f325541fc03ab.png)
代码实现
![](https://i-blog.csdnimg.cn/blog_migrate/dc0754e99a07f685d383bd601a562797.png)
如果没有over fit ing却设置了regularzition,会使模型变差
![](https://i-blog.csdnimg.cn/blog_migrate/7eedf56a3cfd3b704494ee07878f4c07.png)
动量与学习率衰减
![](https://i-blog.csdnimg.cn/blog_migrate/d6047d47995325af737de48151cf0781.png)
当前的更新方向加上上一次的更新方向
momentum参数数值表示考虑多少的历史方向
帮助逃脱局部极小值
但是不理想的情况,可能导致更新得很慢
代码实现
![](https://i-blog.csdnimg.cn/blog_migrate/9bfd415ad882809856de926aa7e625c5.png)
有的优化器不需要额外管理momenteum,如adm,它自带
关于learning rate,使其动态更新,就可以在短时间内达到最低点
![](https://i-blog.csdnimg.cn/blog_migrate/07195532a97d84136139d2f568f00fce.png)
在平坦的地方减小lr
![](https://i-blog.csdnimg.cn/blog_migrate/aa3e7ecc94f339f6bdfb52451630b89e.png)
另外一种学习率监听
![](https://i-blog.csdnimg.cn/blog_migrate/babf45833dced61e4c13884056915c51.png)
Early Stop,dropout,SGD
![](https://i-blog.csdnimg.cn/blog_migrate/1ddfe70138cefcf5e4826bc90f4e2a3f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/facf9ee8a1125cb8437492228f5d4899.png)
dropout
每次断掉一些连接,有一定概率,不是真实的减少
![](https://i-blog.csdnimg.cn/blog_migrate/687def78f7f7f2c80a32a6cbef164b4a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/06314962d6e027953931747a2d7d3b20.png)
代码实现
这是在两层之间实现随机断开,不是在线性层内部
![](https://i-blog.csdnimg.cn/blog_migrate/a1f2b6c4c65051e7ac78a031abcb0089.png)
dropout_prob是断掉的概率,keep——prob是保持的概率,使用这两种的时候不要搞混!
![](https://i-blog.csdnimg.cn/blog_migrate/16cdf5a7c8eafd2c873f4a2c88f110a6.png)
在test的时候不dropout,把所有连接恢复
![](https://i-blog.csdnimg.cn/blog_migrate/030c157edcadfd805f158a85e29c9d34.png)
stochastic gradient decent:SGD 随机梯度下降
stochastic不是完全随机
![](https://i-blog.csdnimg.cn/blog_migrate/8caceb7adb07109b2ad3db5db98a999d.png)
若数据集很大,梯度累加很耗显存?
![](https://i-blog.csdnimg.cn/blog_migrate/586140e3e8c32d2d2fbc2f8bd18a53aa.png)
仅仅是把数据集上所有梯度的平均值化为在一个batch上的平均值
![](https://i-blog.csdnimg.cn/blog_migrate/2898357639252c62c9adacc4be558dd8.png)
卷积神经网络
什么是卷积
图片是如何表达的,这里是0—255,一般我们会变成0—1之间
![](https://i-blog.csdnimg.cn/blog_migrate/7c4ee3b253d2adc9021aec5ce70b0998.png)
![](https://i-blog.csdnimg.cn/blog_migrate/bda086b7497893523ceeb29a55102030.png)
rgb
![](https://i-blog.csdnimg.cn/blog_migrate/3990af7dd68c005372a26f0b144b48d8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7c73e9b1fa5eb376d3b9501a94b99e62.png)
4个隐藏层,共5层的网络需要多少参数
在过去连1.6mb都算大,装不下
![](https://i-blog.csdnimg.cn/blog_migrate/7d6b78b3d19b4400185527ea35066e79.png)
人眼有局部相关性,局部感受
![](https://i-blog.csdnimg.cn/blog_migrate/ee20a8f84b8a8222105d724331b117c2.png)
因此提出了卷积神经网络,利用局部相关性
全值共享,用一个小窗口扫描整个图片
![](https://i-blog.csdnimg.cn/blog_migrate/f61f234ba99f9efebf96956be14a5c3c.png)
参数量只有小窗口的参数量
![](https://i-blog.csdnimg.cn/blog_migrate/64fd3f228f62b554dba49542e52bc925.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d057b7855cff46ba778380a965312502.png)
卷积表达式
![](https://i-blog.csdnimg.cn/blog_migrate/553b75656c10c3479cce9b40d7222f4f.png)
延伸到图片上!
![](https://i-blog.csdnimg.cn/blog_migrate/5e47caf90f9cf026b7ac525a2ab4b355.png)
锐化图片,锐化核与原图片卷积
![](https://i-blog.csdnimg.cn/blog_migrate/9843879841f116c00c0f072dae922876.png)
模糊
![](https://i-blog.csdnimg.cn/blog_migrate/78d0a568a047d6594bad18aee593c926.png)
边缘检测
![](https://i-blog.csdnimg.cn/blog_migrate/c9dd08ff49c64abbd13317df68c1c65c.png)
具体?
![](https://i-blog.csdnimg.cn/blog_migrate/ab4d27b9a4f7bf1cdcf15c01e12f4bb5.png)
使用卷积网络
![](https://i-blog.csdnimg.cn/blog_migrate/f5634fd684f7bff3bb6f6966d12e16ba.png)
k,小窗口就是代表不同观察角度,观察出不同的图片效果
![](https://i-blog.csdnimg.cn/blog_migrate/a6b213c07ceb88530739af8b51be3c92.png)
具体如何运算?
![](https://i-blog.csdnimg.cn/blog_migrate/dcdf0907e9c54480be074eed0326fd1c.png)
kernel有“2个通道”,看multi-k,意会一下
multi-k[16,3,3,3]第一个16表示:sharpen、bluer等16个channel
第二个3表示RGB3个通道,从上一层输入图片x中继承而来
![](https://i-blog.csdnimg.cn/blog_migrate/071295114aaee0cd203438b428563949.png)
LeNet-5
![](https://i-blog.csdnimg.cn/blog_migrate/e68f33208907f25f4b2f844cdafeb10e.png)
特征学习
![](https://i-blog.csdnimg.cn/blog_migrate/db90516be4a164b79342d4ab77e80cc8.png)
卷积运算代码
没打padding图像会小一点点
使用类的实例,它就会先运行hooks,(pytorch自带的一些功能,帮助更好的建设?),再调用.foward函数——————看19,20行
![](https://i-blog.csdnimg.cn/blog_migrate/5388efed42b415cc6c4beda3a3db9043.png)
自动更新窗口参数,所以需要梯度更新
![](https://i-blog.csdnimg.cn/blog_migrate/39d7c4d642618028131b620c47ae1bfa.png)
还有一个比较低阶的调用接口F.conv2d (小写的c,表示函数,大写一般表示类
![](https://i-blog.csdnimg.cn/blog_migrate/8ca9282d2382b5b6674e398bca9f83ad.png)
池化层 pooling层
![](https://i-blog.csdnimg.cn/blog_migrate/922eb5f5dcc55d570842c7d4ec0b4bc0.png)
向下采样
隔行或隔列,完成降维的过程
![](https://i-blog.csdnimg.cn/blog_migrate/80291fc1ab0bd35b3b55e64a0ef96759.png)
取2*2窗口中最大的值
![](https://i-blog.csdnimg.cn/blog_migrate/1b90ff4337e2172993811be603298150.png)
下图有错,是取average
![](https://i-blog.csdnimg.cn/blog_migrate/f7fe657c09be870a263c23b59774a040.png)
代码
![](https://i-blog.csdnimg.cn/blog_migrate/8ab9938a6af30118d22b32c49105cedb.png)
向上采样
放大2倍?
![](https://i-blog.csdnimg.cn/blog_migrate/36dbc5b042764fa7910be2ff60a3b2f7.png)
代码
放大2倍,
![](https://i-blog.csdnimg.cn/blog_migrate/388d8d0d735746ccef70c6fbba50a9a4.png)
ReLu
把比较黑的点,数值为负,去掉,就变得颜色灰了些
![](https://i-blog.csdnimg.cn/blog_migrate/3b353f5050fb63ce7bab0509cd67b1db.png)
代码
inplace表示覆盖原来的内存空间,减小内存使用
![](https://i-blog.csdnimg.cn/blog_migrate/78382cdd39d83d2c01534c30a3b51868.png)
BatchNorm
sigmoid函数会出现梯度离散,尽量少用但是,偶尔会有用到的时候
怎么办呢
例子
![](https://i-blog.csdnimg.cn/blog_migrate/1f70c8baf94318863259220b776fa466.png)
右下的搜索方式会更稳定
![](https://i-blog.csdnimg.cn/blog_migrate/a9275e16c78d2070bf6ec5dbfbd1ff6b.png)
全值缩放,使其分布为N(0,1)
右下数字是统计得出,可以使RGB 3 个通道分布为N(0,1)
![](https://i-blog.csdnimg.cn/blog_migrate/109c00751d372fb1c495d69712e6a8a3.png)
Batch Norm具体是什么?其他很像
3个channel,[3]的均值和方差
![](https://i-blog.csdnimg.cn/blog_migrate/e99f3d8028f11aa05fa0014daf6d36be.png)
具体例子
(6,3,784)6张图片,3个通道进行batchnorm得到均值μ和方差,(在当前batch)
再通过右上角运算迫使其分布变为N(0,1)
第二个运算式子。。。差不多
![](https://i-blog.csdnimg.cn/blog_migrate/b3219bc3dd37004a007e54ca25ec7cb6.png)
代码实现
对1d数据
running_μ和running_σ² 表示全值的均值和方差
![](https://i-blog.csdnimg.cn/blog_migrate/ec98f46f54a55c3ccaad9a8b9a7c343e.png)
batchnorm内部行为
running_μ和σ需要更新,β和γ也需要梯度信息会自动更新???
第2步就是放缩变换,,
![](https://i-blog.csdnimg.cn/blog_migrate/9dc0fb8383049ae679eee08694342f31.png)
对2d数据
weight和bias就是γ和β
对于当前μ和σ²无法直接知道,但是通过running可以获得全值的
![](https://i-blog.csdnimg.cn/blog_migrate/374d8b0d3a26530702506be2539e54f0.png)
affine指是否对数据进行β和γ的变换和自动更新,设置为false就是N(0~1),并且不会自动进行更新
![](https://i-blog.csdnimg.cn/blog_migrate/a95366892cf3e0e11c4a584b01c3765a.png)
在test数据集上时,与上不同
eval()函数将其模式转换为test用的
μ和σ²就是全值,γβ不需要更新???
![](https://i-blog.csdnimg.cn/blog_migrate/774f77dc28d9b6e77d5e0eea9e191975.png)
效果
![](https://i-blog.csdnimg.cn/blog_migrate/6a159a33b5883d596aa2ea18e8b6e089.png)
收敛速度更快,表现更好,更稳定
![](https://i-blog.csdnimg.cn/blog_migrate/11188ed1c68f57c3aefc346b1fc1ad7f.png)
经典卷积网络
![](https://i-blog.csdnimg.cn/blog_migrate/21f24f28b13eb01a67ed8eba272ae561.png)
LeNet-5
![](https://i-blog.csdnimg.cn/blog_migrate/a6b2b4cda48334fcb1b79d73be2a8bda.png)
AlexNet
大爆炸进展!!!
![](https://i-blog.csdnimg.cn/blog_migrate/a95f2f4e6f81ae6d2bfeb5df6b6fec64.png)
VGG
![](https://i-blog.csdnimg.cn/blog_migrate/ecce4bd992f1f7a544dbde76eab3178c.png)
1*1的卷积核???
Googlenet
同一层用不同卷积核
![](https://i-blog.csdnimg.cn/blog_migrate/0a63a02dec58bb4e69f71a450e92d163.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e41af078f7b626c7acafd8d18ec27f4c.png)
不是层越多,train得越好
![](https://i-blog.csdnimg.cn/blog_migrate/91f3e68e38f706df353c64c9011e883d.png)
如今已经有1000多层了,怎么做到的?
ResNet
深度残差网络
增加了短路连接,shortcut防止前面的层梯度离散
最差也能退化到22层效果
![](https://i-blog.csdnimg.cn/blog_migrate/b4d4e08553d9a8854d1a8ba95a430711.png)
这里参数量???减少
![](https://i-blog.csdnimg.cn/blog_migrate/3e132b612a0624b6aa5f6f21ad2f2954.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f9aa23d216a848889814569941e9c58b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/62860c061b886fbfc0705b874ab8c595.png)
代码
![](https://i-blog.csdnimg.cn/blog_migrate/bd98a2105faf77d7f3af4e866b38ee06.png)
DenseNet
![](https://i-blog.csdnimg.cn/blog_migrate/1713d1c1128d4824eda165f93abe86eb.png)
nn.Module
![](https://i-blog.csdnimg.cn/blog_migrate/d9a1acc1e1c1f6cd5842c7c7d9b71f59.png)
1.好处
![](https://i-blog.csdnimg.cn/blog_migrate/1487fd16376de9c4a1dc84da1120e830.png)
2.容器
![](https://i-blog.csdnimg.cn/blog_migrate/90eb01d78ed10b2e6040f32407d18d04.png)
3.参数
![](https://i-blog.csdnimg.cn/blog_migrate/b7256d2eafd53c4a54d76baceff5bd38.png)
4.modules
modules是包含了自己在内的所有子类,显示出来
![](https://i-blog.csdnimg.cn/blog_migrate/0ea96f0a7e71e6267c7571352b1f56c1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/368f7a4ecb7b10fcee0f69f89d1f0132.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3b8d28e63725b4eeb6e01a0fd79b107c.png)
5.to(device)
直接转移到gpu
对于类,返回的就是net本身,对于tensor返回a_gpu
![](https://i-blog.csdnimg.cn/blog_migrate/1baeffa0b8de669fe61b9b73576cf23f.png)
6.save and load
![](https://i-blog.csdnimg.cn/blog_migrate/0336d9d125defb5520aa0bce45756101.png)
-
train/test
切换,因为有些层对于train和test的功能不一样,比如dropout和BN
![](https://i-blog.csdnimg.cn/blog_migrate/12e95474240784f6e4bebbd3d0445fac.png)
8.
![](https://i-blog.csdnimg.cn/blog_migrate/65cbde2e9e6ff1c6da1cfda50e27436e.png)
nn.Parameter 类,自动封装w,b,nn.parameters方法即可直接调用,并且不用写需要梯度这句话
![](https://i-blog.csdnimg.cn/blog_migrate/1afab171f010cbb6ae60eb34752ad3ab.png)
数据增强
big data
![](https://i-blog.csdnimg.cn/blog_migrate/59e185c02e546d050716d25244fe110b.png)
data argumentation将10张照片变换为20张,例如旋转,调色等等
![](https://i-blog.csdnimg.cn/blog_migrate/2b025307bec291c72dcb5f0d62d9b386.png)
Flip 翻转
![](https://i-blog.csdnimg.cn/blog_migrate/3866262a28cdb5e2fc33feadd9827e75.png)
rotate旋转
![](https://i-blog.csdnimg.cn/blog_migrate/eef7e9ea917fe03d2987034a54018829.png)
scale缩放
![](https://i-blog.csdnimg.cn/blog_migrate/12f40743dd8e0f84a6272bda8ecb5b91.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ed00c08e3f36ffdeb9ced7acb24dc788.png)
crop part裁剪
![](https://i-blog.csdnimg.cn/blog_migrate/0ec7138b77d7285dca59d399b8fe1a98.png)
noise高斯噪声
![](https://i-blog.csdnimg.cn/blog_migrate/d44f9c0376bebcb6db8f71c6aa61fe89.png)
pytorch里面好像没有,需要人为添加
上述操作会帮助,但还是原本就有很多数据好
卷积网络与resnet实战
时间序列表示方法
将string类型表示
![](https://i-blog.csdnimg.cn/blog_migrate/81c42f353cd2a5c4db84a48e8f981417.png)
第一个是有多少字,第二个是表达方式
对于图片,从上往下看的话
![](https://i-blog.csdnimg.cn/blog_migrate/4e780298795c5cb3ae4df2615bfab3d8.png)
文字
![](https://i-blog.csdnimg.cn/blog_migrate/46cf6647c8e189b6ae545fa02fe319c2.png)
另外一种编码方式,更好用
语义相关性
![](https://i-blog.csdnimg.cn/blog_migrate/2d0ae0ba9fed0a70cbf2d737f904bede.png)
啥 Embedding
![](https://i-blog.csdnimg.cn/blog_migrate/60968ac171fbe255887f16ed41539325.png)
查表操作
![](https://i-blog.csdnimg.cn/blog_migrate/7aeafdac28c4b7bc7137afcef3953b5c.png)
glove
![](https://i-blog.csdnimg.cn/blog_migrate/9b3b9965162407b089115950ce682122.png)
循环神经网络RNN
RNN原理
评价一句话是好评还是差评
![](https://i-blog.csdnimg.cn/blog_migrate/b6cfae253d89564eb99b6593d2f5e9ef.png)
![](https://i-blog.csdnimg.cn/blog_migrate/968b168c26e5726508e01c2700bd5b13.png)
因此,w,b参数全局共享,增加语义信息,减少参数量
![](https://i-blog.csdnimg.cn/blog_migrate/d648cf1dc2b915879d9b405c4cf82d24.png)
然鹅,我们需要一个长期的memory来保存
这个单元贯穿整个语境,考虑上一步的输入
![](https://i-blog.csdnimg.cn/blog_migrate/8d59cf7bc9004061f8b690a6149e1979.png)
ht是语境信息,更新自我!
![](https://i-blog.csdnimg.cn/blog_migrate/06efcd111968560a5d8a732607f81ec5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3a19c53fdcdabe596acadf69d130598e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/66f4640fa2be0681a1a0dda2c845218a.png)
梯度推导
![](https://i-blog.csdnimg.cn/blog_migrate/4bd85087f5f51ee97691d0b6df6ea860.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3a72ac45224c71494d940389ff37de2b.png)
RNN Layer使用
参数理解
x[10,3,100] 表示一句话10个单词,一次处理3句话,每个单词表达方式(长度
xt [3,100] 一次 处理3个句子,一个时间戳处理3个句子的第一个单词
最后知道了h0是[b,20]这样的一个维度
![](https://i-blog.csdnimg.cn/blog_migrate/4223b47552aafd28b0d75cf7a891f849.png)
![](https://i-blog.csdnimg.cn/blog_migrate/acf7b88a8c58cc094541473eb9004c00.png)
RNN输入参数
![](https://i-blog.csdnimg.cn/blog_migrate/3a4928332acc6d5095501a99224c66dc.png)
forward函数
[5,3,100]5个单词,3句话,每个单词100维
但是不需要人为喂5次(因为5个单词)forward函数一次喂到位,直接喂x,不是xt
最后的输出,ht是最后的memory信息,out是每个memory的一个聚合
![](https://i-blog.csdnimg.cn/blog_migrate/5b2ff7410bfb7841ec5e45a281f866b6.png)
layer=1
![](https://i-blog.csdnimg.cn/blog_migrate/8947b6fecd7596bf2503b72225878428.png)
对于多层呢
layer=2
![](https://i-blog.csdnimg.cn/blog_migrate/759fb659053f772086486b6aae5d5bf5.png)
out是最后输出的也就是最后一层的
![](https://i-blog.csdnimg.cn/blog_migrate/2ba60cb65a1a3e2cec36c6897f3d0275.png)
h0= [4,3,20] h(最后一层)= [4,3,20]
out= [10,3,20]
![](https://i-blog.csdnimg.cn/blog_migrate/37f9160cb1bdb3049ba35600dd56a5f1.png)
手动循环
一句话10个单词,手动喂10次,(小方块是一个cell,没有循环的箭号
传入的参数和RNN一样
![](https://i-blog.csdnimg.cn/blog_migrate/4b30009820e5136d39ce3c4614edbc8a.png)
人为for几次,在x[0]上循环
layer=1
![](https://i-blog.csdnimg.cn/blog_migrate/308e4a748fd62ee85bb59cbced5120d4.png)
layer=2
注意第一层30和第二层30匹配
![](https://i-blog.csdnimg.cn/blog_migrate/bba9df36a42e7d9c2398de8f68adc866.png)
时间序列预测
波形预测
![](https://i-blog.csdnimg.cn/blog_migrate/44bd4121594f09b4cd9abce96859a2f8.png)
使用另一种表达方式 [b,50,1] , b=1时表示 一共送一条曲线,每条曲线50个点,每个点就是一个数值
start是随机的,防止网络记住
例如最下,给0~48个点,预测1~49个点
![](https://i-blog.csdnimg.cn/blog_migrate/9aa0fa0bc87163946bfd8d3ede1d21d5.png)
batch_first = Ture,表达方式改变下
![](https://i-blog.csdnimg.cn/blog_migrate/68209862c026940f7e31a365038a3d36.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cdc96f389c278cf6b41aa67cbbbf8e33.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7276c9b660d3eae7a9e3f88d4d8e510f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a580ec305f7b62e6f777a6d32436017a.png)