重新加权神经网络的输入
Re-weight the input to a neural network
例如,我将一组图像输入 CNN。这些图像的默认权重是 1。如何重新加权其中一些图像,使它们具有不同的权重? 'DataLoader'在pytorch中可以实现这个目标吗?
我了解到另外两种可能性:
- 定义自定义损失函数,根据需要为每个样本提供权重。
- 在训练集中重复样本,这将导致更频繁的样本在最终损失中具有更高的权重。
有没有其他方法可以实现?如有任何建议,我们将不胜感激。
我可以想到两种方法来实现这一点。
在反向传播梯度时显式传递权重。
在你计算完损失后,当你要反向传播时,你可以将一个 Tensor
传递给 backward()
并且所有后续的梯度将由相应的元素缩放,即做一些事情喜欢
loss = torch.pow(out-target,2)
loss.backward(my_weights) # is a Tensor of same dimension as loss
但是,如果您想在一个批次中分配单独的权重,则不能使用 nn.module
中的自定义损失函数,它会汇总一个批次中所有样本的损失。
使用torch.utils.data.sampler.WeightedRandomSampler
如果你使用 PyTorch 的 data.utils
无论如何,这比乘以你的训练集更简单。但是它没有分配确切的权重,因为它是随机的。但是,如果您对训练集进行足够次数的迭代,它可能就足够接近了。
例如,我将一组图像输入 CNN。这些图像的默认权重是 1。如何重新加权其中一些图像,使它们具有不同的权重? 'DataLoader'在pytorch中可以实现这个目标吗?
我了解到另外两种可能性:
- 定义自定义损失函数,根据需要为每个样本提供权重。
- 在训练集中重复样本,这将导致更频繁的样本在最终损失中具有更高的权重。
有没有其他方法可以实现?如有任何建议,我们将不胜感激。
我可以想到两种方法来实现这一点。
在反向传播梯度时显式传递权重。
在你计算完损失后,当你要反向传播时,你可以将一个
Tensor
传递给backward()
并且所有后续的梯度将由相应的元素缩放,即做一些事情喜欢loss = torch.pow(out-target,2) loss.backward(my_weights) # is a Tensor of same dimension as loss
但是,如果您想在一个批次中分配单独的权重,则不能使用 nn.module
中的自定义损失函数,它会汇总一个批次中所有样本的损失。
使用
torch.utils.data.sampler.WeightedRandomSampler
如果你使用 PyTorch 的
data.utils
无论如何,这比乘以你的训练集更简单。但是它没有分配确切的权重,因为它是随机的。但是,如果您对训练集进行足够次数的迭代,它可能就足够接近了。