陌路茶色/

pytorch学习笔记

长期更新

基础知识

Tensor,Variable,Parameter

如下所示:
torch.FloatTensor
torch.autograd.variable.Variable
torch.nn.parameter.Parameter (Variable的子类)

如果在网络的训练过程中需要更新,就要定义为Parameter,  类似为W(权重)和b(偏置)也都是Parameter
parameter是Variable的子类,Parameters与modules一起使用时会有一些特殊的属性,其会被自动加到Module的parameters()迭代器中,Variable赋值给modules不会产生这样的效果

Tensor转Variable

x=torch.randn((2,2))
var_x=autograd.Variable(x)

Tensor有数据元素,有shape,没有梯度,不能反向传播

Variable的结构如下所示:
屏幕快照 2020-01-15 下午5.22.11.png

parameter
参考https://www.jianshu.com/p/d8b77cc02410
parameter可以将tensor转为为可训练的类型parameter并将这个parameter绑定到module的net.paramter()中,成为模型的一部分【tensor也可以被反向传播更新,区别在于parameter作为模型的一部分】

nn与nn.functional的区别

一个是包装好的类,一个是可以直接使用的函数
参考:https://www.zhihu.com/question/66782101

type

torch.Tensor是一种包含单一数据类型元素的多维矩阵。

>>> torch.FloatTensor([[1, 2, 3], [4, 5, 6]])
1 2 3
4 5 6
[torch.FloatTensor of size 2x3]

>>> torch.tensor([[1., -1.], [1., -1.]])
tensor([[ 1.0000, -1.0000],
        [ 1.0000, -1.0000]])

>>> torch.tensor(np.array([[1, 2, 3], [4, 5, 6]]))
tensor([[ 1,  2,  3],
        [ 4,  5,  6]])

Variable

autograd.Variable 是包的中央类, 它包裹着Tensor, 支持几乎所有Tensor的操作,并附加额外的属性, 在进行操作以后, 通过调用.backward()来计算梯度, 通过.data来访问原始raw data (tensor), 并将变量梯度累加到.grad
参考Pytorch入坑二:autograd 及Variable

容器

nn.ModuleList
其中装载list形式的子模块,如下所示:

self.linears = nn.ModuleList([nn.Linear(10, 10) for i in range(10)])

可以把任意 nn.Module 的子类 (比如 nn.Conv2d, nn.Linear 之类的) 加到这个 list 里面,方法和 Python 自带的 list 一样,无非是 extend,append 等操作。但不同于一般的 list,加入到 nn.ModuleList 里面的 module 是会自动注册到整个网络上的,同时 module 的 parameters 也会自动添加到整个网络中。通过打印网络参数来得到网络中的一些信息以查看其和list的区别

for param in net.parameters():
    print(type(param.data), param.size())

具体见PyTorch 中的 ModuleList 和 Sequential: 区别和使用场景

初始化

使用函数init:

conv1 = torch.nn.Conv2d(...)
torch.nn.init.xavier_uniform(conv1.weight)

使用weight.data:

conv1.weight.data.fill_(0.01)
self.u_embeddings.weight.data.uniform_(-initrange, initrange)

参考How to initialize weights in PyTorch?

属性

squeeze

如果指定维度,那么该维度为1时,该维度消失;如果不指定维度,那么只要维度为1,则对应的维度消失。

unsqueeze

给指定维度添加一个维度为1的维度。

contiguous

contiguous:view只能用在contiguous的variable上。如果在view之前用了transpose, permute等,需要用contiguous()来返回一个contiguous copy。
一种可能的解释是:
有些tensor并不是占用一整块内存,而是由不同的数据块组成,而tensor的view()操作依赖于内存是整块的,这时只需要执行contiguous()这个函数,把tensor变成在内存中连续分布的形式。
判断是否contiguous用torch.Tensor.is_contiguous()函数。
在pytorch的最新版本0.4版本中,增加了torch.reshape(), 这与 numpy.reshape 的功能类似。它大致相当于 tensor.contiguous().view()
参考:pytorch中的contiguous

函数

nn.Embedding

其中有一个padding_idx参数,如果提供,则遇到此下标用零填充,注意不提供则会被训练
nn.Embedding.from_pretrained中参数freeze=True表示该embedding在训练过程中不会被更新

nn.Conv2d

有一个参数是dilation,这个参数设置扩张卷积,参考https://www.cnblogs.com/wanghui-garcia/p/10775367.html

zero_grad()

model.zero_grad()和optimizer.zero_grad()两种方式都是将模型中的参数的梯度设置为0

留下一条评论

暂无评论