至于为什么推荐使用Pytorch,我想最主要的原因就是它非常的简洁,非常符合Python的风格。
首先确保你已经安装了GPU环境,即Anaconda、CUDA和CUDNN
官网会自动显示符合你电脑配置的Pytorch版本,复制指令到conda环境中运行即可
测试是否安装成功
32位浮点型
二者的主要区别在于创建的对象的size和value不同
生成的数据类型为浮点型,与numpy.randn生成随机数的方法类似,生成的浮点数的取值满足均值为0,方差为1的正态分布
torch.randpern(n)为创建一个n个整数,随机排列的Tensor
生成一个一维的Tensor,三个参数分别的起始位置,终止位置和步长
很多时候我们需要创建指定的Tensor,而numpy就是一个很好的方式
torch.mul(A,B)
点乘,A*B,A和B既可以是Tensor也可以是标量
torch.pow(A,n)
A.shape
A[1:]
A[-1,-1]=100
所有的带_符号的函数都会对原数据进行修改
stack为拼接函数,函数的第一个参数为需要拼接的Tensor,第二个参数为细分到哪个维度
dim=0,C1=[A,B]
dim=1,C2=[[A[0],B[0]],[A[1],B[1]]]
dim=2,C3=[[[A[0][0],B[0][0]],[A[0][1],B[0][1]],[A[0][2],B[0][2]]],
[[A[1][0],B[1][0]],[A[1][1],B[1][1]],[A[1][2],B[1][2]]]]
dim=-1,C4=C3
CUDA是一种操作GPU的软件架构,Pytorch配合GPU环境这样模型的训练速度会非常的快
使用backward进行求导。这里主要介绍了求导的两种对象,标量Tensor和非标量Tensor的求导。两者的主要区别是非标量Tensor求导的主要区别是加了一个gradient的Tensor,其尺寸与自变量X的尺寸一致。在求完导后,需要与gradient进行点积,所以只是一般的求导的话,设置的参数全部为1。最后还有一种使用标量的求导方式解决非标量求导,了解了解就好了。
使用自动微分机制配套使用SGD随机梯度下降来求最小值
Pytorch中一共有5个不同的层次结构,分别为硬件层、内核层、低阶API、中阶API和高阶API(torchkeras)
Pytorch主要通过Dataset和DataLoader进行构建数据管道
一个可迭代的数据装载器。在训练的时候,每一个for循环迭代,就从DataLoader中获取一个batch_sieze大小的数据。
DataLoader的参数如下
顺带介绍一下Epoch、Iteration、Batchsize之间的关系
先看数据读取的主要流程
2.进入DataLoaderIter,判断单线程还是多线程
3.进入Sampler进行采样,获得一批一批的索引,这些索引告诉我们需要读取哪些数据、
4.进入DatasetFetcher,依据索引读取数据
5.Dataset告诉我们数据的地址
6.自定义的Dataset中会重写__getietm__方法,针对不同的数据来进行定制化的数据读取
7.到这里就获取的数据的Text和Label
8.进入collate_fn将之前获取的个体数据进行组合成batch
9.一个一个batch组成BatchData
再来看一个具体的代码
因为自定义的数据集只有39条,最后一个batch的数据量小于10,被舍弃掉了
而数据预处理主要是重写Dataset和DataLoader中的方法,因此总体代码如下所示
基于Pytorch已经产生了一些封装完备的工具,而缺点也很明显,数据处理不是很灵活,对于初学者来说,多写代码比较踏实,因此作者不太推荐使用这些方法
torch.nn是神经网路工具箱,该工具箱建立于Autograd(主要有自动求导和梯度反向传播功能),提供了网络搭建的模组,优化器等一系列功能。
搭建一个神经网络模型整个流程是怎么样的呢?
搭建网络流程
1数据读取
2定义模型
3定义损失函数和优化器
4模型训练
5获取训练结果
我们拿一个最简单的FNN网络来对经典数据集diabetes糖尿病数据集来进行分类预测。