Google Colab 在尝试 tf.image.resize 数据集时耗尽 RAM(12GB)

Google Colab runs out of RAM(12GB) when trying to tf.image.resize dataset

new_img = []
images = list(df['pixels'])
  
 
for image in images:
  image = image.split()
  new_img.append(image)

new_img = np.array(new_img)
new_img = new_img.astype('float32')/255
new_img = new_img.reshape(df.shape[0], 48, 48, 1)
new_img = tf.image.resize(new_img(297,297))

在上面的代码(最后一行)中,我试图调整整个数据集的大小(35000 个元素)。 但是 Google Colab 耗尽了所有 RAM。 请问还有其他方法可以解决这个问题吗?

提前致谢。

Is there any other way to approach this problem, please?

使用更少的内存。我并不是想表现得居高临下,但问题是您使用了过多的 RAM,除了减少使用之外别无他法。每次为 Python 中的变量赋值时,它都必须分配内存来存储该值。如果您在不释放内存的情况下连续执行此操作,您将 运行 陷入此问题。

至于您应该如何解决这个特定问题,请考虑需要将哪些数据加载到内存中以使您的代码正常工作,并避免加载不需要的数据。例如,看起来您有一个 DataFrame df,您在其中存储原始数据,一个列表 images,您在其中存储该数据的一个子集,以及一个列表, new_img,您存储已处理数据的位置。您实际上是在一遍又一遍地复制这些数据而不释放任何数据。相反,您应该避免复制数据(例如,您不需要将 DataFrame 数据复制到 images 列表中;只需在 DataFrame 中直接迭代它)并释放您不再使用的数据(例如,如果在创建new_img列表后不需要DataFrame中预处理的pixels数据,则使用del语句删除DataFrame/Series。

您也可以完全避免预处理这些数据(即根据需要处理),或者分批处理,或者缩减数据以使用更少的内存等。有很多方法可以避免这些问题。

尝试使用 tf.data.Dataset 反复进行。图片只会在遍历数据集时调整大小,一次一批。所以它不会在内存中创建新的数据集。

new_img = np.array(new_img)

ds = tf.data.Dataset.from_tensor_slices(new_img).\
    map(lambda x: tf.resize(x/255, (297, 297)))

print(next(iter(ds)))