【问题标题】:How to use numpy file without importing into RAM?如何在不导入 RAM 的情况下使用 numpy 文件?
【发布时间】:2020-10-11 09:26:35
【问题描述】:

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

我正在研究图像分类并将我的图像数据放入 Google Drive 中的四个 numpy 文件中。文件的总大小大于 14 GB。而 Google Colab 仅提供 12 GB RAM 供使用。有没有一种方法可以通过一次仅将单个批次加载到 ram 中来训练模型并将其从 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)

当我运行以下代码时,会话崩溃并显示“您的会话在使用所有可用 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个文件?

【问题讨论】:

标签: python numpy google-colaboratory


【解决方案1】:

您可以通过将文件打开为memory-mapped array 来做到这一点。

例如:

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 支持。请注意,这将导致对阵列的操作比普通的 RAM 支持的阵列慢得多;通常使用 mem-mapping 来方便地访问数组的各个部分,而无需将整个数组加载到 RAM 中。

【讨论】:

  • 如果我的文件夹中有图片,这比使用 flow_from_directory 快还是慢?
【解决方案2】:

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

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)

但是,如果您尝试在同一个 Python 会话中再次加载 X_train 文件(我假设您使用的是 Jupyter Notebook),则在之前占用的 10.6 GB 内存之前,您暂时需要另外 10.6 GB 内存X_train 已发布。

您可以选择以下策略:

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

【讨论】:

  • 我正在使用 X_train 训练神经网络,因此即使在函数内部运行,我也不会获得 10.6GB 的可用 RAM 内存。
  • 您的问题表明您在加载数据时遇到错误。
猜你喜欢
  • 2019-12-04
  • 1970-01-01
  • 2019-07-09
  • 2020-10-19
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多