nn.Linear 给出“只有浮点和复杂数据类型的张量才需要梯度”

问题描述 投票:0回答:1

我试图理解 hon

nn.Embedding
在输入是一个热向量的情况下可以用作
nn.Linear

考虑一下,输入是

[0,0,0,1,0,0]
,它是对应于索引 3 的一个热向量。因此,我首先创建了这两个:

_in = torch.tensor([0,0,0,1,0,0]).long() # used later
_index = torch.LongTensor([3])

然后我尝试了

nn.Embedding

customEmb = torch.tensor([[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4],[5,5,5,5],[6,6,6,6]]).float()
emb = nn.Embedding(d_vocabSize, emb_size) # 6x4
emb.weight = torch.nn.Parameter(customEmb)
print(emb.weight)

print('\n----- embedding(input) ------')
hidden = emb(_index)
print(hidden)

正确输出(在嵌入中选择第三行

[4., 4., 4., 4.]
):

----- hiddent layer / embedding -----
Parameter containing:
tensor([[1., 1., 1., 1.],
        [2., 2., 2., 2.],
        [3., 3., 3., 3.],
        [4., 4., 4., 4.],
        [5., 5., 5., 5.],
        [6., 6., 6., 6.]], requires_grad=True)

----- embedding(input) ------
tensor([[4., 4., 4., 4.]], grad_fn=<EmbeddingBackward0>)

我尝试了类似的

nn.Linear

print('\n----- hiddent layer / embedding -----')
customEmb = torch.tensor([[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4],[5,5,5,5],[6,6,6,6]]).long()
emb = nn.Linear(d_vocabSize, emb_size) # 6x4
emb.weight = torch.nn.Parameter(customEmb.T)
print(emb.weight)

print('\n----- embedding(input) ------')
hidden = emb(_in) 
print(hidden)

对于上面的代码,它给出了以下错误:

----- hiddent layer / embedding -----
RuntimeError
# ...
---> 16 emb.weight = torch.nn.Parameter(customEmb.T)
# ... 
RuntimeError: Only Tensors of floating point and complex dtype can require gradients

所以我尝试为

.float()
调用
.long()
而不是
customEmb
,但出现以下错误:

----- hiddent layer / embedding -----
Parameter containing:
tensor([[1., 2., 3., 4., 5., 6.],
        [1., 2., 3., 4., 5., 6.],
        [1., 2., 3., 4., 5., 6.],
        [1., 2., 3., 4., 5., 6.]], requires_grad=True)

----- embedding(input) ------
RuntimeError
# ...
---> 21 hidden = emb(_in) 
# ... 
RuntimeError: expected scalar type Long but found Float

问。我在这里缺少什么?

PS

我期待

nn.Linear
返回类似:

[[0.,0.,0.,0.],
 [0.,0.,0.,0.],
 [0.,0.,0.,0.],
 [4.,4.,4.,4.],     
 [0.,0.,0.,0.],
 [0.,0.,0.,0.],
]

问。 有些不相关的问题:我的上述期望是否错误?

更新

我尝试将

_in
customEmb
转换为浮动,错误消失了:

_in = torch.tensor([0,0,0,1,0,0]).float()
customEmb = torch.tensor([[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4],[5,5,5,5],[6,6,6,6]]).float()
emb = nn.Linear(d_vocabSize, emb_size) # 6x4
emb.weight = torch.nn.Parameter(customEmb.T)
hidden = emb(_in) 
print(hidden)

打印出来:

tensor([3.6693, 4.3959, 3.9726, 4.3447], grad_fn=<AddBackward0>)

Q2. 现在我猜为什么不是

[4.,4.,4.,4.]
?我的假设/我的理解完全搞砸了吗?

python numpy pytorch
1个回答
0
投票

回答我最近看到的这个旧帖子...

错误仅浮点和复数类型的张量可以需要梯度是因为nn.Linear模块仅接受浮点和复数张量作为输入。这是因为线性层的权重和偏差也是浮点或复张量。

要修复此错误,您需要在将 x 张量传递到 nn.Linear 层之前确保其为浮点或复数类型。您可以使用 torch.float()torch.complex() 方法将张量转换为所需的 dtype。

因此,如果您的输入张量为非浮点型,请确保在前向传递中传递数据类型时转换数据类型:

x = layer(input.float())
© www.soinside.com 2019 - 2024. All rights reserved.