[英]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.
您可以选择以下策略:
del X_train, Y_train, X_test, Y_test
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.