Pytorch入门注意知识点

前言

我早期用的是tensorflow的底层框架,不仅定义一个卷积层都需要六行代码,而且需要图(graph), 会话(session) , 命名空间(name_scope), 占位符(Place_holder)等概念,然后我改用了tensorflow的slim模块,虽然简洁了很多,但是目前官方(Google)已经停止维护,社会资源也相对匮乏。所以我决定转入Pytorch大军。Pytorch计算是使用的动态图,每一次前向传播都会创建一幅新的计算图,而tensorflow计算是使用的静态图,静态图一旦创建就不能修改,而且静态图定义是一套特殊语法,连while这种语句都不太方便使用,比如想重复10次训练神经网络得到一个平均准确率值,每次重复都需要清除之前的静态图等。

另外,分享两句关于tensorflow和pytorch之前流传的话语: (1) 使用tensorflow可以容易找到很多别人之前的代码,使用pytorch能轻松实现自己的想法。(2)学术研究用pytorch,工业部署用tensorflow。

入门注意知识点

(1)pytorch中有很好的封装模块,如构建神经网络的时候 nn.Module 和 nn.functional, 对于这两个模块,陈云老师建议是如果模型有可以学习的参数,最好使用nn.Module,否则两者都可以使用,陈云老师的偏好貌似是用functional。

举例:激活函数和池化层等属于没有可以学习的参数网络层,则可以使用functional;对于卷积层、全连接层这类有需要学习参数的网络层,则最好使用nn.Module。另外,dropout虽然无参数,但是训练和测试的时候不一样,所以推荐nn.Module。

nn.Module利用的是autograd技术,其主要工作是实现前向传播。只需要定义前向传播,autograd会自动实现反向传播

(2)pytorch中,处理图片必须一个batch一个batch的操作,所以我们要准备的数据的格式是 [batch_size, n_channels, hight, width]

如果想要单独测试一个图像的时候需要增加维度:input=to_tensor(XXX).unsqueeze(0)

(3)在多个GPU上并行计算,DataParallel并行的方式是将输入的一个batch的数据均分为多份,分别送到对应的GPU中进行计算,然后将各个GPU得到的梯度相加。与Module相关的所有数据也会以浅复制的方法复制多份。

代码:new_net = nn.DataParallel (net, device_ids=[0. 1])         out_put = new_net (input)

(4)nn.Seqential。这类似于keras中的序贯模型,当一个模型较简单的时候,我们可以使用torch.nn.Sequential类来实现简单的顺序连接模型。这个模型也是继承自Module类的。Sequential除了本身可以用来定义模型之外,它还可以包装层,把几个层包装起来像一个块一样。

(5)Pytorch中实现自定义的数据集需要继承Dataset类。Dataset有一个ImageFolder,是假设所有的文件按文件夹保存,每个文件夹下存储同一个类别的图片,文件夹名为类名。另外常用还有dataload函数。

(6)Pytorch中单独提供了一个sampler模块,用来对数据进行采样。常用的有随机采样器RandomSampler,当dataload函数中的shuffle参数为True时,系统会自动调用这个采样器,实现打乱数据。另一个很有用的采样方法:随机权重采样, WeightedRandomSampler,它会根据每个样本的权重选取数据,在样本比例不均衡的问题中,可用它进行重采样。

(7)torchvision是一个非常常用的视觉工具包,主要分为三个部分,(1)models,提供深度学习中的经典网络结构和预训练好的模型。(2)dataset,提供常用的数据集加载。(3)transforms,提供常用的数据预处理操作,如ToTensor:将Image对象转化为Tensor,会自动将图像的像素值归一化到 [0,1]。Normalize:标准化,即减均值,除以标准差。

你可能感兴趣的:(深度学习,深度学习,pytorch)