摘抄自《深度学习之Pytorch》。python
PyTorch里面处理的最基本的操做对象就是Tensor,表示的是一个多维矩阵,好比零维矩阵就是一个点,一维就是向量,二维就是通常的矩阵,多维就至关于一个多维数组,这和numpy是对应,并且PyTorch的Tensor能够和numpy的ndarray相互转换,惟一不一样的是PyTorch能够在GPU上运行,而numpy的ndarray只能在CPU上运行。算法
经常使用的不一样数据类型的Tensor有32位浮点型torch.FloatTensor、64位浮点型torch.DoubleTensor、16位整型torch.ShortTensor、32位整型torch.IntTensor和64位浮点型torch.LongTensor。torch.Tensor默认的是torch.FloatTensor数据类型。数组
Variable,变量,这个概念在numpy中是没有,是神经网络计算图里特有的一个概念,就是Variable提供了自动求导的功能。网络
Variable和Tensor本质上没有区别,不过Variable会被放入一个计算图中,而后进行前向传播、反向传播、自动求导。多线程
首先Variable是在torch.autograd.Variable中,要将tensor变成Variable也很是简单,好比想让一个tensor a变成Variable,只需Variable(a)便可。机器学习
Variable有三个比较重要的组成属性:data,grad和grad_fn。经过data能够取出Variable里面的tensor数值;grad_fn表示的是获得这个Variable的操做,好比经过加减仍是乘除获得的;grad是这个Variable的反向传播梯度。函数
在处理任何机器学习问题以前都须要数据读取,并进行预处理。PyTorch提供了不少工具使得数据的读取和预处理变得很容易。工具
torch.utils.data.Dataset是表明这一数据的抽象类。你能够本身定义你的数据类,继承和重写这个抽象类,很是简单,只须要定义__len__和__getitem__这个两个函数:学习
class myDataset(Dataset): def __init__(self,csv_file,txt_file,root_dir,other_file): self.csv_data = pd.read_csv(csv_file) with open(txt_file,'r') as f: data_list = f.readlines() self.txt_data = data_list self.root_dir = root_dir def __len__(self): return len(self.csv_data) def __gettime__(self,idx): data = (self.csv_data[idx],self.txt_data[idx]) return data
经过上面的方式,能够定义咱们须要的数据类,能够同迭代的方式来获取每个数据,但这样很难实现缺batch,shuffle或者是多线程去读取数据,因此PyTorch中提供了一个简单的办法来作这个事情,经过torch.utils.data.DataLoader来定义一个新的迭代器,以下:优化
dataiter = DataLoader(myDataset,batch_size=32,shuffle=True,collate_fn=defaulf_collate)
其中的参数都很清楚,只有collate_fn是标识如何去样本的,咱们能够定义本身的函数来准确地实现想要的功能,默认的函数在通常状况下都是可使用的。
在PyTorch里面编写神经网络,全部的层结构和损失函数都来自于torch.nn,全部的模型构建都是从这个基类nn.Module继承的,因而有了下面的这个模板。
class net_name(nn.Module): def __init__(self,other_arguments): super(net_name,self).__init__() self.conv1 = nn.Conv2d(in_channels,out_channels,kernel_size) # other network layer def forward(self,x): x = self.conv1(x) return x
这样就创建一个计算图,而且这个结构能够复用屡次,每次调用就至关于用该计算图定义的相同参数作一次前向传播,得益于PyTorch的自动求导功能,因此咱们不须要本身编写反向传播。
定义完模型以后,咱们须要经过nn这个包来定义损失函数。常见的损失函数都已经定义在了nn中,好比均方偏差、多分类的交叉熵以及二分类的交叉熵等等,调用这些已经定义好的的损失函数也很简单:
criterion = nn.CrossEntropyLoss()] loss = criterion(output,target)
这样就能求得咱们的输出和真实目标之间的损失函数了。
在机器学习或者深度学习中,咱们须要经过修改参数使得损失函数最小化(或最大化),优化算法就是一种调整模型参数更新的策略。
优化算法分为两大类:
这种算法使用各个参数的梯度值来更新参数,最经常使用的一阶优化算法是梯度降低。所谓的梯度就是导数的多变量表达式,函数的梯度造成了一个向量场,同时也是一个方向,这个方向上方向导数最大,且等于梯度。梯度降低的功能是经过寻找最小值,控制方差,更新模型参数,最终使模型收敛,网络的参数更新公式以下:
$\theta = \theta - \eta \times\frac{\sigma J(\theta)}{\sigma_\theta}$
其中$\eta$是学习率,$\frac{\sigma J(\theta)}{\sigma_\theta}$是函数的梯度。这是深度学习里最经常使用的优化方法。
二阶优化算法是用来二阶导数(也叫作Hessian方法)来最小化或最大化损失函数,主要基于牛顿法,但因为二阶导数的计算成本很高,因此这种方法并无普遍使用。torch.optim是一个实现各类优化算法的包,大多数常见的算法都能到直接经过这个包来调用,好比随机梯度降低,以及添加动量的随机梯度降低,自适应学习率等。在调用的时候须要优话传入的参数,这些参数都必须是Variable,而后传入一些基本的设定,好比学习率和动量等。
在PyTorch中使用torch.save来保存模型的结构和参数,有两种保存方式:
能够按以下方式保存:save的第一个参数是保存对象,第二个参数是保存路径及名称:
torch.save(model,'./model.pth') torch.save(model.state_dict(),'./model_state.pth')
加载模型有两种对应于保存模型的方式: