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  阅读(3674)  评论(1编辑  收藏  举报

导航