在关于reshape()函数的numpy手册中,它说
>>> a = np.zeros((10, 2))
# A transpose make the array non-contiguous
>>> b = a.T
# Taking a view makes it possible to modify the shape without modifying the
# initial object.
>>> c = b.view()
>>> c.shape = (20)
AttributeError: incompatible shape for a non-contiguous array
Run Code Online (Sandbox Code Playgroud)
我的问题是:
c.shape = (20)抛出错误incompatible shape for a non-contiguous array?感谢您的回答!
我在github上看到了这个LSTM语言模型的例子(链接).它一般来说对我来说非常清楚.但是我仍然在努力理解调用的内容contiguous(),这在代码中会多次发生.
例如,在代码输入的第74/75行中,创建LSTM的目标序列.数据(存储在其中ids)是二维的,其中第一维是批量大小.
for i in range(0, ids.size(1) - seq_length, seq_length):
# Get batch inputs and targets
inputs = Variable(ids[:, i:i+seq_length])
targets = Variable(ids[:, (i+1):(i+1)+seq_length].contiguous())
Run Code Online (Sandbox Code Playgroud)
举个简单的例子,当使用批量大小为1和seq_length10时inputs,targets看起来像这样:
inputs Variable containing:
0 1 2 3 4 5 6 7 8 9
[torch.LongTensor of size 1x10]
targets Variable containing:
1 2 3 4 5 6 7 8 9 10
[torch.LongTensor of size 1x10]
Run Code Online (Sandbox Code Playgroud)
所以一般来说我的问题是,contiguous()我需要什么以及为什么需要它?
此外,我不明白为什么该方法被调用目标序列而不是输入序列,因为两个变量都包含相同的数据.
怎么可能targets是inputs不连续的,仍然是连续的? …
例如,我有1维向量的维度(5).我想将其重塑为2D矩阵(1,5).
这是我如何用numpy做的
>>> import numpy as np
>>> a = np.array([1,2,3,4,5])
>>> a.shape
(5,)
>>> a = np.reshape(a, (1,5))
>>> a.shape
(1, 5)
>>> a
array([[1, 2, 3, 4, 5]])
>>>
Run Code Online (Sandbox Code Playgroud)
但是我怎么能用Pytorch Tensor(和Variable)做到这一点.我不想切换回numpy并再次切换到Torch变量,因为它会丢失反向传播信息.
这就是我在Pytorch中所拥有的
>>> import torch
>>> from torch.autograd import Variable
>>> a = torch.Tensor([1,2,3,4,5])
>>> a
1
2
3
4
5
[torch.FloatTensor of size 5]
>>> a.size()
(5L,)
>>> a_var = variable(a)
>>> a_var = Variable(a)
>>> a_var.size()
(5L,)
.....do some calculation in forward function
>>> a_var.size()
(5L,) …Run Code Online (Sandbox Code Playgroud) 双方.flatten()并.view(-1)压平PyTorch张量。有什么不同?
.flatten()复制张量的数据?.view(-1)更快吗?.flatten()没有不工作的情况?根据这个SO和这个PyTorch讨论,PyTorch的view功能仅适用于连续内存,而reshape不能。在第二个链接中,作者甚至声称:
[
view] 将在非连续张量上引发错误。
但是张量什么时候有非连续内存呢?
Given a tensor of multiple dimensions, how do I flatten it so that it has a single dimension?
Eg:
>>> t = torch.rand([2, 3, 5])
>>> t.shape
torch.Size([2, 3, 5])
Run Code Online (Sandbox Code Playgroud)
How do I flatten it to have shape:
torch.Size([30])
Run Code Online (Sandbox Code Playgroud) 我正在开发一个注意力模型,在运行最终模型之前,我正在遍历代码的张量形状。我有一个需要重整张量的操作。张量是形状的torch.Size([[30, 8, 9, 64]]) 地方30是batch_size,8是(这是不相关的我的问题)注意头的数量9是在一句话的数量,64这个词的一些中间嵌入表示。torch.size([30, 9, 512])在进一步处理之前,我必须将张量重塑为的大小。因此,我在网上查找一些参考资料,他们做了以下工作,x.transpose(1, 2).contiguous().view(30, -1, 512)
而我认为这应该可行x.transpose(1, 2).reshape(30, -1, 512)。
在第一种情况下是grad_fnis <ViewBackward>,而在我的情况下是<UnsafeViewBackward>。这两个操作不一样吗?这会导致训练错误吗?