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一样简单,这两天找时间动手实践一个。