当前位置:   article > 正文

pytorch中那些初学者容易混淆的函数_torch matmul 与linear

torch matmul 与linear

一   torch.nn.Parameter 和 torch.autograd.Variable

1.Parameter 是torch.autograd.Variable的一个子类,也可以理解为一种类型转换函数,其可将一个固定不可训练的tensor转换成可以训练的类型parameter,并将这个parameter绑定到这个module里面;

2.一般来说,pytorch 的Parameter是一个tensor,但是跟通常意义上的tensor有区别:通常意义上的tensor 仅仅是数据,而Parameter所对应的tensor 除了包含数据之外,还包含一个属性:requires_grad(=True/False)

3.parameter.data 可得到tensor数据 ;parameter.requires_grad 默认为True, BP过程中会求导

4.Parameter一般是在Modules中作为权重和偏置,自动加入参数列表,可以进行保存恢复。和Variable具有相同的运算。

5.实际用法:

self.v = torch.nn.Parameter(torch.FloatTensor(hidden_size))

在注意力机制中,权值V是不断学习且优化的,所以应是parameter类型,不直接使用tensor类替换。

 

二  nn.Embedding

引入词嵌入可以直接调用torch.nn.Embedding(m, n) ,其中m 表示单词的总数目,n 表示词嵌入的维度,这里举例它的两种用法:

1.随机初始化

  1. import torch
  2. import torch.utils.data as Data
  3. import torch.nn as nn
  4. import torch.nn.functional as F
  5. from torch.autograd import Variable
  6. word_to_id = {'hello':0, 'world':1}
  7. embeds = nn.Embedding(2, 10)
  8. hello_idx = torch.LongTensor([word_to_id['hello']])
  9. # hello_idx = Variable(hello_idx)
  10. hello_embed = embeds(hello_idx)
  11. print(hello_embed)
  12. if __name__ == '__main__':
  13. pass

2.代入自己训练的词向量

  1. from torchtext.vocab import Vectors
  2. #1.引入自己的词向量路径
  3. vector = Vectors(name='./vector_cache/sgns.weibo.word')
  4. #2.根据词向量建立词表
  5. text_field.build_vocab(train, dev, test, vectors=vector)
  6. #3.获得word embedding
  7. word_embedding = text_field.vocab.vectors
  8. ####在模型中使用word embedding
  9. class textClassification(nn.Module):
  10. def __init__(self, args):
  11. super(textClassification,self).__init__()
  12. V = args.embed_num#单词数
  13. D = args.embed_dim#词向量维度
  14. self.embed = nn.Embedding(V, D)
  15. #将前面得到的word embedding代入
  16. self.embed.weight = nn.Parameter(args.word_embedding, requires_grad=False)
  17. ...
  18. def forward(self, x):
  19. x = self.embed(x) # (batch,seq_len,embed_size)
  20. ....

 

三  modulelist 和 Sequential

1.ModuleList是将子Module作为一个List来保存的,可以通过下标进行访问,类似于Python中的List,但是该类需要手动实现forward函数

2.Sequential内部自动实现了forward函数,可以在forward函数里直接调用定义的Sequentila结构体。

 

四  contiguous , transpose, permute 以及 view

这里涉及pytorch底层的设计原理,理解比较复杂,这里参考contiguous的理解中的内容。

1.pytorch中

narrow(),view(),expand(),transpose(),permute()

这几个操作不改变tensor的内容,只是重新定义下标与元素的对应关系;即这种操作不改变数据也不进行数据拷贝,变的是元数据

例如:在使用transpose()进行转置操作时,pytorch并不会创建新的、转置后的tensor,而是修改了tensor中的一些属性(也就是元数据),使得此时的offset和stride是与转置tensor相对应的。转置的tensor和原tensor的内存是共享的!

我们看一下下面的代码:

  1. x = torch.randn(3, 2)
  2. y = x.transpose(x, 0, 1)
  3. x[0, 0] = 233
  4. print(y[0, 0])
  5. # print 233

我们可以看到,改变了y的元素的值的同时,x的元素的值也发生了变化。

也就是说,经过上述操作后得到的tensor,它内部数据的布局方式和从头开始创建一个这样的常规的tensor的布局方式是不一样的!于是…这就有contiguous()的用武之地了。

在上面的例子中,x是contiguous的,但y不是(因为内部数据不是通常的布局方式)。注意不要被contiguous的字面意思“连续的”误解,tensor中数据还是在内存中一块区域里,只是布局的问题!

当调用contiguous()时,会强制拷贝一份tensor,让它的布局和从头创建的一模一样。

当我们遇到提示

RuntimeError: input is not contiguous

只需要加上contiguous()就可以了。

2.为什么torch.view等方法操作需要连续的Tensor呢?

可以参考PyTorch中的contiguous

 

五  nn.Linear 和 pytorch中的bmm,mm,matmul

1.torch.nn.Linear(in_features,out_features,bias = True ):

对传入数据应用线性变换:y = A x+ b

参数:

in_features - 每个输入样本的大小

out_features - 每个输出样本的大小

bias - 如果设置为False,则图层不会学习附加偏差。默认值:True

2. pytorch中的bmm,mm,matmul的区别

mm只能进行矩阵乘法,也就是输入的两个tensor维度只能是(n×m)(m×p)


bmm是两个三维张量相乘, 两个输入tensor维度是 (b×n×m)(b×m×p),第一维b代表batch size,输出为(b×n×p)


matmul可以进行张量乘法, 输入可以是高维.
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/653107
推荐阅读
相关标签
  

闽ICP备14008679号