>>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)即可。