pytorch报错----------- ***ValueError: some of the strides of a given numpy array are negative.
最近遇到的一个pytorch报错:
然后报错了,这个几行代码就是从一个图片中读入数据,把bgr模式图片矩阵转换为rgb模式,这里采用的是改变矩阵索引,索引倒排 [..., ::-1] 。
看了这个报错有些懵,因为确实没想明白这么简单的操作都会报错。
后来查了查有些搞明白了,就是pytorch框架通过numpy的array对象生成tensor时要求传入的numpy的array对象是内存连续的。
如上述:
img = cv2.imread(r"timg.jpg") 得到一个内存连续的array 对象,但是
img = cv2.imread(r"timg.jpg")[...,::-1]
这时将得到的连续的array对象的最后一维索引倒排了,
这样的话倒排索引得到的array对象如果按照倒排后的索引来看就是内存不连续的,
这样传入pytorch中就会报错了。
这里的解决方法就是传入一个内存连续的array对象。
方法1.
import numpy as np import torch # 对彩色图片RGB 进行像素点的kmeans聚类 import cv2 img = cv2.imread(r"timg.jpg")[..., ::-1] img2 = np.ascontiguousarray(img) data = torch.from_numpy(img2).float() img[...]=0 print(img) print(img2)
可以看到 调用
np.ascontiguousarray
我们得到的一个新的内存连续的array, 新旧array不共享内存。
方法2. 同理
import numpy as np import torch # 对彩色图片RGB 进行像素点的kmeans聚类 import cv2 img = cv2.imread(r"timg.jpg")[..., ::-1].copy() data = torch.from_numpy(img).float()
直接对倒排索引的array对象进行 copy 操作,这样得到不共享内存的新的array对象, 新生成的array对象自然是内存连续的。
----------------------------------------------------------------------
为什么 pytorch 要求传入的numpy的array对象必须是内存连续的呢?
可以看:
https://blog.csdn.net/zz2230633069/article/details/93170271
https://zhuanlan.zhihu.com/p/59767914
https://www.cnblogs.com/peixu/articles/13455350.html
大致意思就是说内存连续的array或tensor对象在进行矩阵运算时速度更快。
-------------------------------------------------------------
参考:
https://blog.csdn.net/e01528/article/details/86067489
https://blog.csdn.net/qq_36891953/article/details/95482539
https://blog.csdn.net/u011622208/article/details/89707828
posted on 2020-10-02 15:11 Angry_Panda 阅读(3818) 评论(1) 编辑 收藏 举报