0

好的,所以代码就像这样 X1 是加载的高光谱图像,尺寸为(512x512x91)我想做的基本上是裁剪 64x64x91 大小的矩阵,变化的步幅为 2。这给了我总共 49952 个图像,每个 64x64x91 大小但是当我运行 for 循环时,我得到了内存错误。我的系统有 8 GB 内存。

data_images_0=np.zeros((49952,256,256,91))
k=0
for i in range(0,512-64,2):
    r=64
    print(k)
    for j in range (0,512-64,2):   
        #print(k)
        data_images_0[k,:,:,:]=X1[i:i+r,j:j+r,:]
        k=k+1

我有一个作为 Mat 文件加载的高光谱图像,尺寸为 (512x512x91)。我想使用这个图像的块作为我的 CNN 的输入,例如使用 64x64x91 的裁剪。问题是,一旦我从原始图像创建作物,我就无法加载数据,因为一次加载所有作物会给我带来内存错误。我可以做些什么来分批加载我裁剪的数据,这样我就不会收到这样的内存错误。我应该将我的数据转换为其他格式还是以其他方式处理问题?

4

3 回答 3

2

您正在寻找该matfile功能。它允许您访问硬盘上的阵列,然后只加载其中的一部分。

假设你的图片被命名pic,那么你可以做类似的事情

data = matfile("filename.mat");
part = data.pic(1:64,1:64,:);

%Do something

那么只有(1:64,1:64,:)变量的一部分pic将被加载到part.

与往常一样,应该注意的是,在硬盘上工作并不是很快,应该避免。另一方面,如果您的变量太大而无法放入内存中,则没有其他方法可以解决(除了购买更多内存)。

于 2018-11-06T13:27:02.183 回答
0

我认为您可能想要使用该matfile功能,它基本上打开一个 .mat 文件,而不会将其全部内容拉入 RAM。你基本上从你的 .mat 文件中读取一个标题,其中包含有关存储元素的信息,如大小、数据类型等。想象一下您的 .mat 文件hyperspectralimg.mat包含矩阵myImage。您必须像这样进行:

filename = 'hyperspectralimg.mat';
img = matfile(filename);

A = doStuff2MyImg(img.myImage(1:64,1:64,:)); % Do stuff to your imageparts

img.myImage(1:64,1:64,:) = A; %Return changes to your file

这是一个简短的示例,如果您以前没有使用matfile过它,您可以如何使用它。如果您已经使用过它并且它不起作用,请告诉我们,作为一般建议,上传有关您的问题的代码片段和数据示例,它会有所帮助。

关于标签的快速评论:如果您关心的是matlab,那么不要标记python和类似的东西。

于 2018-11-06T13:37:34.493 回答
0

您可以使用 numpy 内存映射。这相当于 MatLAB 的 matfile。

https://numpy.org/doc/stable/reference/generated/numpy.memmap.html

于 2020-06-26T11:35:53.927 回答