我试图理解 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.]
?我的假设/我的理解完全搞砸了吗?
回答我最近看到的这个旧帖子...
错误仅浮点和复数类型的张量可以需要梯度是因为nn.Linear模块仅接受浮点和复数张量作为输入。这是因为线性层的权重和偏差也是浮点或复张量。
要修复此错误,您需要在将 x 张量传递到 nn.Linear 层之前确保其为浮点或复数类型。您可以使用 torch.float() 或 torch.complex() 方法将张量转换为所需的 dtype。
因此,如果您的输入张量为非浮点型,请确保在前向传递中传递数据类型时转换数据类型:
x = layer(input.float())