Pytorch是python的一个目前比较火热的深度学习框架,Pytorch提供在GPU上实现张量和动态神经网络。对于学习深度学习的同学来说,Pytorch你值得拥有。本文将介绍pytorch的核心张量与梯度,以及如何一步一步的使用GPU训练你的第一个深度神经网络。
张量
张量是数字,向量,矩阵或任何n维数组,类似于Numpy中的ndarray,张量是PyTorch中构建神经网络的基础。首先,我们创建一个只有一个数字的张量:
其中4.是4.0的简写,表示该数字类型为浮点数。我们可以通过dtype来查看元素的属性:
接下来我们创建更复杂的向量、数组和矩阵:
张量的维度大小是任意的,我们可以使用.shape来查看张量的维度。
张量运算梯度
下面我们通过一个例子来看一下张量的算术运算,首先我们创建三个张量:
可以看到在创建张量时我将w和b中的requires_grad设为True,而x没有设置,这个下面我们会用到。记住这是个重点!然后通过一个线性组合计算得到y,即:
这是一个简单的线性回归,注意这里我们就要用到上面设置的requires_grad,现在我们用y.backward()来求y对w、x和b的偏导数得:
正如结果所示,x没有设置requires_grad,所以求得的梯度为None;而w和b设置了requires_grad,则得到其梯度。
创建神经网络
再简单看了一下张量和梯度后,接下来我们就要开始今天真正的主题:使用Pytorch创建我们的第一个深度神经网络。还是机器学习的老套路,建立一个深度学习模型依然是那几步。首先导入库和数据:
这里我们使用pytorch自带的数据集datasets中的mnist数据。
导入数据后,我们需要划分训练集和测试集:
现在我们使用SubsetRandomSampler为每个数据子集创建数据加载器并随机对元素进行采样。
处理完数据,我们就要开始创建我们的模型,我们将创建一个包含32个隐藏层的模型。模型结构如下:
具体代码如下:
在处理图像数据时,随着数据量的增加和网络层次的加深我们需要使用GPU来加速训练。GPU包含数百个内核,这些内核可以在短时间内对浮点数执行快速的矩阵运算,从而使训练多层深度神经网络成为可能。你可以在Kaggle内核或Google Colab上免费使用GPU ,或者在Google Cloud Platform,Amazon Web Services或Paperspace等服务上租用GPU驱动的计算机。在使用GPU时,我们可以使用torch.cuda.is_available命令来查看是否有可使用的GPU设备。然后我们定义一个DeviceDataLoader类来包装我们现有的数据加载器并将数据移动到所选设备。
好的,我们终于可以开始训练模型了,可以过程应该是最爽的,在训练模型时,我们以交叉熵作为损失函数以及准确率作为评估指标。定义损失和模型训练的几个函数如下:
该evaluate函数计算验证集的总损失
fit()函数接收模型训练参数并启动模型训练
通过matplotlib对训练过程的准确率可视化来直观了解模型的效果。
总结与改进