繁体   English   中英

如何在不导入 RAM 的情况下使用 numpy 文件?

[英]How to use numpy file without importing into RAM?

我想将 Google Drive 中的 numpy 文件 (.npy) 用于 Google Colab,而不将其导入 RAM。

我正在研究图像分类并将我的图像数据放入 Google Drive 中的四个 numpy 文件中。 文件的总大小大于 14 GB。 而 Google Colab 仅提供 12 GB RAM 供使用。 有没有一种方法可以通过一次仅将单个批次加载到 ram 中来训练 model 并将其从 ram 中删除(可能类似于 flow_from_directory)来使用它?

使用 flow_from_directory 的问题是,即使我在 Colab 目录中有图像,即使是一块 VGG16 也非常慢。

我正在使用来自 Kaggle 的 Cats vs Dogs Classifier 数据集。

! kaggle competitions download -c 'dogs-vs-cats'

我将图像数据转换为 numpy 数组,并将其保存在 4 个文件中:

X_train - float32 - 10.62GB - (18941, 224, 224, 3)

X_test - float32 - 3.4GB - (6059, 224, 224, 3)

Y_train - float64 - 148KB - (18941)

Y_test - float64 - 47KB - (6059)

当我运行以下代码时,session 崩溃并显示“您的 session 在使用所有可用 RAM 后崩溃。” 错误。

import numpy as np
X_train = np.load('Cat_Dog_Classifier/X_train.npy')
Y_train = np.load('Cat_Dog_Classifier/Y_train.npy')
X_test = np.load('Cat_Dog_Classifier/X_test.npy')
Y_test = np.load('Cat_Dog_Classifier/Y_test.npy')

有什么方法可以使用这 4 个文件而不将其加载到 RAM 中?

您可以通过将文件作为内存映射数组打开来做到这一点。

例如:

import sys
import numpy as np

# Create a npy file
x = np.random.rand(1000, 1000)
np.save('mydata.npy', x)

# Load as a normal array
y = np.load('mydata.npy')
sys.getsizeof(y)
# 8000112

# Load as a memory-mapped array
y = np.load('mydata.npy', mmap_mode='r')
sys.getsizeof(y)
# 136

第二个阵列的作用类似于普通阵列,但由磁盘而不是 RAM 支持。 请注意,这将导致 arrays 上的操作比普通的 RAM 支持的 arrays 慢得多; 通常使用 mem-mapping 来方便地访问数组的某些部分,而无需将整个数组加载到 RAM 中。

文件的总大小为 14 GB,这确实大于您所说的可用的 12 GB。 但是,您也从 memory 中的数据创建了这些文件,就像您的问题的早期版本一样,这表明有足够的 memory 来保存所有数据:

save('drive/My Drive/ML/Cats_vs_Dogs_Classifier/X_train.npy', X_train)
save('drive/My Drive/ML/Cats_vs_Dogs_Classifier/Y_train.npy', Y_train)
save('drive/My Drive/ML/Cats_vs_Dogs_Classifier/X_test.npy', X_test)
save('drive/My Drive/ML/Cats_vs_Dogs_Classifier/Y_test.npy', Y_test)

However, if you attempt to load the X_train file again in the same Python session (I assume you're using Jupyter Notebook), you'll temporarily need another 10.6 GB of memory before the 10.6 GB occupied by the previous X_train is released.

您可以选择以下策略:

  • 在加载数据之前启动一个新的 Python 进程(或内核)。
  • 在继续之前显式释放 memory:
     del X_train, Y_train, X_test, Y_test
  • 将生成数据的代码放在 function 中。 当 function 返回时,在 function 中创建的所有局部变量将被自动删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM