2022.3.22--pytorch的学习:

>>pytorch有gpu加速(就是一个处理数据的库)

张量数据类型部分:

数据在cpu和gpu上部署都是不一样的,gpu上有个cuda

python的数据类型在pytorch都有对应的数据类型,但是会有demension 维度

>>pytorch的标量即demension为0

dimension :即这个张量是几维的,size/shape:即指的是这个张量的形状,即几乘几的。

demension为1的张量,即一个向量,长度为任意的向量,自己定。eg:[1,2,3,3,3]

bias偏置一般是demension为1的张量。

dimension为2 的张量,即矩阵。看中括号是两个了。

dimension为3的张量,三个中括号,另外,这里三维上的size是1.即两个中括号外只有一个括号。

适合RNN的处理

dimension为4的,适合 图片即cnn处理:

b bathsize c chanel 。其实具体看这个张量,只要关注两个中括号里面的就是每张图片每个通道的像素数据。因为这里c为3,且bath为2 .即两张通道都为三的图形,所以会有6个这样矩阵。 

查看具体数据类型的方法。

创建数据类型:

1.从numpy转成tensor

从list(python中的数组)直接转成tensor

 

 torch.tensor(输入的数据)这些数据类型是floatTensor。强化学习,一般用的是double,所以,要改掉默认设置

tensor的具体操作方法:

1索引与切片:

索引,比如这个张量 a=tensor(4,3,28,28)

用类似于python的索引方式:

即a[x,y,z,w]即取出,第x张图片的y通道的z行,w列。a[1]即取出第1张图片的张量

高级索引方式:

即,:即相当于箭头。第7行的:从0往后取,但是不包括2.

第10行。从末尾取到1,因为三个通道,0,1,2.所以即取得是2和1的,往前取是包含的。因为数组索引方式也可以负,如左。

注意,打逗号的,即是一个维度一个维度分开

 这个相当于采样一样的:

select索引方式:

第一个2,代表在第二个维度上操作即H为28上操作。然后torch.arange(8),即取0-8即8个

这些维度上的值,有时候表示全都取,即用...来表示

2维度的变换:

不变的是数据本身,变的是对数据操作的理解,这些对tensor具体的操作。

view/shape 这两个就是一样的函数 保持数据张量总数不变(即size不变)。

比如:6行的,就是把h w c三者信息全融合在四张图片上。

19行,把每张图片的通道数直接整合在一个图片上,即只关心整个的featuremap 

squeeze/unsqueeze(即展开维度)

即改变维度维度维度!!!size就是表示这个tensor的维度是啥样子

负数的插入就从这个的后面,正数是在之前。另外比如第五行的五位数据表示,你展开添加了个维度但是这个size数据量不会的变的。只是又增加了一个物理含义,这里就是一组,即一组四个图片(bathsize) 。

样例演示:

注意torch.tensor()这个括号里面就是具体的tensor数据,而其他的都是这个tensor的维度和样子,即这里是四维的,即图片。

squeeze(即删减维度):

比如:b=torch.size([1,32,1,1])即一个四维的。

而且只有那个索引为1才能被删减,不然不变。 

expand/repeat:(这个不同于上面一组,这是维度不变,只是相应维度的shape变化)

只有那个维度是1才能expand到相应维度,不然会报错。-1就是那个维度不变。

 而repeat:b.repeat(4,2,1,1)这个就是把b的每个维度都按照这个复制(不建议用)

维度的交换,即矩阵转置那种(适用于任何维度不过)

transpose:

13行的操作,a2是跟a是一样的结果。要把这个维度信息跟踪住,是bchw 还是bcwh 

permute:它是可以使用transpose来交换的。

注意一个图形能不能显示,一定是Hw这个顺序。【4,3,28,28】只是认为习惯bchw

若转成[4,28,28,3]bhwc一样的可以,只是通道在最后维度

它同样的会可能造成内存不连续错误,如果报contigue错误,就.contigue来重新排。

合并与分割常用API:

合并:

Cat:dim=0即在第一个维度上拼接,自然其他维度的size要一样的。这个api挺简单

stack:(它是会创建新的维度)所以它是所有的维度都要一致。

它的应用场景,就是我合并起来了,但是还是有区别两者。dim=2,即在维度2的新建一个维度,

第五行代码:则2维度上取0则代表拼接之一的a,1就是拼接之一的b。

split跟chunk差不多:

两种拆分方式:1用列表,[2,3]即5拆成2,3.split(2,dim=0)其实就是维度0上,以2拆分。 

 overfiting:过拟合,即数据训练,学习太过。则测试的时候,结果不好,但是训练结果很好。现在网络层数可以设置很大,大部分都是过拟合。

所以出现了验证集,验证集的作用就是:在防止过拟合的临界点前,选取最好的网络模型,即那些权重w/b即保存到checkpoint。通俗的讲,就是一直训练过程中,同时对验证集测试,看其loss是不是一直下降的。急剧上升,即恶化了过拟合了。

比如train和val的数据集总共有100k个 分成90k给train 10k给val。注意,一般都会交叉验证,即100k里面随机拿10k给val,其他都train。这样就防止了死记硬背。

如何减轻overfiting--

1更多数据

2:regularization:就是把训练出来的网络模型,泛化能力降低些。(因为此时是过拟合)weigth_decay

momentum:

原本sgd那种最原始的优化器,求全局最小值,只考虑当前梯度的方法。但是加momentum则会考虑上一次的梯度方向,则综合考虑。但是目前Adam优化器,它是自带这个momentu帮你优化。

learning rate的影响:

学习率太小,则收敛太慢训练太久。太大,就是会像图中那样。所以,一般把learning rate 设置成一个动态的,多少个步长,就下降下学习率。起初设置比较大,让他快点。

early stopping:

显然就是 ,train accuracy是会要一直上涨趋近去平缓才好。可是,你中途就出现了test下降。则你肯定要在 最好的地方,保存数据模型checkpoint。

droput:

拟合一个超级复杂网络模型,会可能产生过拟合。但是我们采用droput,即有些权系数我不进行估计训练,即有效减少参数量。不容易出现过拟合。

所以在train中才采用这种措施,test /验证就不用,本来就要结果好。

卷积神经网络:

图形像素0-255.但是深度学习中是要0-1,所以先除255.

线形层是这样:输入784个结点,所以参数量计算:就是权重数目,即如下:

这个784呢,就好比是一张图片所有的像素参数。80年代,就通过学习完全的特征来,所以才有后面的卷积网络。学习局部特征。

全连接网络和卷积网络的区别:

多个卷积核的操作:

一个卷积核/filter/卷积的权重,都是有一个偏置。(偏置和卷积核个数一致)注意一个卷积核的通道数是和输入的通道数一致的。一个卷积核(每个channel对应算)的featur map经过运算后再求和+偏置。 几个卷积核就得到几个输出,

具体卷积操作pytorch实现:

直接用实例对象的layer(x)不要用.forward调用,所以对一个图像卷积操作还是比较简单的。 

 池化层与采样:

pooling:把featuremap变小,有点类似下采样。

cnn最基本的单元:conv2d-batchnorm- pooling-relu

batch norm部分没怎么听懂欸!

Residual network:提出的意义:就是解决网络深度的叠加反而效果不好的现象,于是呢,比如一个网络前面是vgg-19net的然后后面加残差网络单元,就算训练的效果不好,我也至少可以退化到vgg19的样子。

nn.mudule模块:

所有网络的父类。

nn.module这个类,就比如提供了这个sequential的类(相当于网络的容器),它就直接把网络层数写进去就好,然后使用,就是调用self.net(input)即可。 


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值