pytorch 如何在不进行就地操作的情况下单独规范化批处理中的每个Tensor?

hgqdbh6s  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(106)

我有一系列的图像,其中每个像素应该在范围[0,1]内。我想知道我正在对这些图像运行一个深度学习模型,我想知道如何对批量中的每个图像进行归一化,使图像在变换后始终处于[0,1]范围内。
这就是我正在努力做的

for idx in range(x.shape[0]):
    x[idx] = x[idx] - x[idx].min()
    x[idx] = x[idx] / x[idx].max()

然而,这给我留下了这个错误:

Exception has occurred: RuntimeError
one of the variables needed for gradient computation has been modified by an inplace operation: [torch.FloatTensor [2, 128, 128]], which is output 0 of AsStridedBackward0, is at version 10; expected version 9 instead. Hint: the backtrace further above shows the operation that failed to compute its gradient. The variable in question was changed in there or anywhere later. Good luck!

这有什么解决办法?
其他一些需要考虑的事情:我不能使用批处理规范化,因为批处理中的每个图像都必须单独进行规范化。我不能使用层归一化,因为这是一个卷积网络,我不知道图像的大小提前。我不能使用示例规范化,因为我有多个通道,通道之间的相对大小很重要。

jhkqcmku

jhkqcmku1#

我发现可以通过如下定义一个新的Tensor来避免原地操作

mins = torch.zeros((x.shape[0], *(1,)*len(x.shape[1:])))
maxs = torch.zeros((x.shape[0], *(1,)*len(x.shape[1:])))
for i in range(x.shape[0]):
    mins[i] = x[i].min()
    maxs[i] = x[i].max()
x = (x - mins) / (maxs - mins)

相关问题