pytorch note 09.09

Pytorch note 09.09

求导机制

每个变量的requires_grad 表明这个变量是否需要计算导数,在创建变量的时候进行设定

z = Variable(torch.randn(5, 5), requires_grad=True)

这个参数可以让我们动态的调整每个变量是否需要梯度和是否更新。

volatile 是干什么的暂时没有看懂,先留个坑。

torch

pytorch的基本包torch ,提供了Tensor的数据结构和基本函数,数学操作与numpy相似,本来记录了很多的但觉得官方文档都有,现查就可以了,就不在此赘述了。

经过我尝试,pytorch支持基本运算符,同时可以使用变量自身的运算函数,torch 所带的运算函数也适用,都能达到相同的效果。

总的来说,torch 的主要作用在于一些细节操作和宏观判断,比如对张量的判断以及一些适用于所有张量的操作。

torch.Tensor

Data tyoe CPU tensor GPU tensor
32-bit floating point torch.FloatTensor torch.cuda.FloatTensor
64-bit floating point torch.DoubleTensor torch.cuda.DoubleTensor
16-bit floating point N/A torch.cuda.HalfTensor
8-bit integer (unsigned) torch.ByteTensor torch.cuda.ByteTensor
8-bit integer (signed) torch.CharTensor torch.cuda.CharTensor
16-bit integer (signed) torch.ShortTensor torch.cuda.ShortTensor
32-bit integer (signed) torch.IntTensor torch.cuda.IntTensor
64-bit integer (signed) torch.LongTensor torch.cuda.LongTensor

张量主要有以上这些数据类型,默认torch.FloatTensor ,可以从list 或者numpy 来转换。

直接用torch.Tensor() 创建的是全零的张量,但是在数值上会又很小很小的数字。

支持python或者说是numpy自有格式的切片索引以及修改。

会修改张量本身值的函数会在函数名后带一个下划线,如torch.FloatTensor.abs_()

每一个张量都会有一个torch.storage 来保存值。

torch.Storage

torch.Storage 是一个单一数据类型的一维数组,与张量一一对应。

但我并没有太理解这个类是干嘛用的,为什么需要一个单独的类来存储呢?

torch.nn

torch.nn.Paramter()

Variable的子类 ,用于模块参数module paramter

torch.nn.Module

所有网络的基础类,构建自己的模型时务必继承这个类。

卷积层

一维、二维的卷积与解卷积。

池化层

各种池化层。

Non-Linear Activations

非线性激活函数,如ReLU等等

Normalization layers

pytorch提供了简便的BN函数。

Dropout layers

torch.nn.Dropout(p=0.5, inplace=False) Dropout层

Linear layers

torch.nn.Linear(in_features, out_features, bias=True) 线性相加层。

Sparse layers

torch.nn.Embedding(num_embeddings, embedding_dim, padding_idx=None, max_norm=None, norm_type=2, scale_grad_by_freq=False, sparse=False) Embedding层。

Distance functions

torch.nn.PairwiseDistance(p=2, eps=1e-06)范数距离

Loss functions

损失函数,

torch.nn.functional

用到的所有函数这里都有,为了方便我们可以直接选择用层

torch.autograd

提供了类和函数用来对任意标量函数进行求导。要想使用自动求导,只需要对已有的代码进行微小的改变,用Variable 类包含张量即可。

torch.optim

优化算法,先构造对象,然后用对象调用step() 函数进行单次优化。

不同优化函数的参数不同。

torchvision

包含了目前流行的数据集,模型结构和常用的图片转换工具。

Summary

简单总结一下流程,首先需要定义一个网络,继承torhc.nn.Module ,如果采用层类来建模,则可以不用定义具体的Variable ,同时只需要定义好forward() 函数表明如何得到最后的值即可。

然后创建该模型实例,选择一个损失函数criterion 和优化器optimizer ,然后进行迭代训练。每一步中读取训练数据,先调用optimizer.zero_grad() 初始化,清空优化器的缓存,然后得到输出,用损失函数计算loss = criterion(outputs, labels) ,然后调用loss.backward() 更新梯度,用优化器进行单步训练optimizer.step()

pytorch保存训练好的模型也十分简单,有两种选择

  • torch.save(model_object, 'model.pkl') 来保存模型,model = torch.load('model.pkl') 加载模型

  • torch.save(net.state_dict(), 'model.pkl') 保存模型,其中net 是你定义的网络模型实例,后面是保存文件。加载模型使用net.load_state_dict(torch.load('model.pkl'))

总体感觉pytorch真的是十分容易上手,易用程度堪比keras,同时定义细节时候又如同numpy一样简单,这两天找时间动手实践一个。