我尝试对prediction
和target
数组进行随机子采样,以进行损失计算。
idx = torch.randperm(target.shape[0])
target = target.index_select(0, idx[0, sample_size]
但是我收到此错误消息。
index_select(): argument 'index' (position 2) must be Variable, not torch.LongTensor
有谁知道如何解决这个问题?
修改 我走近了一步。看来torch.randperm没有返回一个火炬变量,因此必须显式转换输出:
idx = torch.randperm(target.shape[0])
idx = Variable(idx).cuda()
target = target.index_select(0, idx[0, sample_size]
现在唯一的问题是反向传播失败了。似乎随机子采样的操作导致尺寸问题。 然而,在计算损失时,维度似乎没有问题:
loss = F.nll_loss(prediction, target.view(-1)) # prediction shape is [Nx12] and target shape is N
不幸的是,在调用loss.backward()
时,我收到以下错误消息:
RuntimeError: The expanded size of the tensor (12) must match the existing size (217456) at non-singleton dimension 1