在训练 Pytorch 网络时遇到错误
At least one stride in the given numpy array is negative, and tensors with negative strides are not currently supported.
, 本文记录原因与解决方案。
问题复现
- 在numpy 图像数据转为 torch.tensor 之前使用 numpy 执行内部形变的操作,常见的有:
- 通道转换
代码语言:javascript复制image = image[:,:,::-1]
代码语言:txt复制- 图像翻转
代码语言:javascript复制image = np.fliplr(image)
# or
image = np.flipud(image)
- 此类操作之后经过 Pytorch 的 Dataloader,读取tensor 时会报错
ValueError: At least one stride in the given numpy array is negative, and tensors with negative strides are not currently supported. (You can probably work around this by making a copy of your array with array.copy().)
问题原因
- 输入网络的 Tensor 需要是内存连续的
- 但是 numpy 上述变换后为了速度考虑不会改变数据内存,这就导致拿到的数据在内存中不连续,导致错误
解决方案
- 可以按照报错中建议的方式
image = image.copy()
- 也可以正经解决 numpy 内存连续的问题
image = np.ascontiguousarray(image)
参考资料
- https://cloud.tencent.com/developer/article/2066974