【问题标题】:CUDA|RAM runs out of memory using Keras model.fit_generatorCUDA|RAM 使用 Keras model.fit_generator 耗尽内存
【发布时间】:2020-03-27 03:53:53
【问题描述】:

我有一个形状为 (300,226,226,3) 的视频数据输入,通道最后配置,我的输出是 (300,1) 存储为 numpy 数组格式。因为我不想一次加载所有数据,因为它大约是 120GB。我的代码很简单:

import os
import sys
from random import shuffle

import numpy as np
import tensorflow as tf
from keras.layers import (BatchNormalization, Dense, Flatten, Input,
                          MaxPooling3D, TimeDistributed)
from keras.layers.convolutional import Conv3D
from keras.layers.convolutional_recurrent import ConvLSTM2D
from keras.layers.normalization import BatchNormalization
from keras.models import Model, Sequential
from keras.utils import plot_model
from model import My_ConvLSTM_Model
import numpy as np
from random import shuffle
import pandas as pd
import os


def generate_arrays(available_ids):
    datar = pd.read_csv("C:/Users/muzaf/Documents/GitHub/Data_mining/data.csv")
    while True:
        for i in available_ids:
            name_ext = str(datar.iat[i, 0])
            name = os.path.basename((os.path.splitext(name_ext))[0])
            scene = np.load('D:/Webcam/Input/{}.npy'.format(name))
            category = np.load('output/{}.npy'.format(name))
            yield (np.array([scene]), category[0])


available_ids = [i for i in range(1, 20)]

shuffle(available_ids)

final_train_id = int(len(available_ids)*0.8)
train_ids = available_ids[:final_train_id]
val_ids = available_ids[final_train_id:]
frames = 300
pixels_x = 226
pixels_y = 226
channels = 3

seq = Sequential()
seq.add(ConvLSTM2D(filters=20, kernel_size=(3, 3),
                   input_shape=(None, pixels_x, pixels_y, channels),
                   padding='same', data_format='channels_last', return_sequences=True))
seq.add(BatchNormalization())
seq.add(MaxPooling3D(pool_size=(2, 2, 1), strides=None,
                          padding='valid', data_format='channels_last'))
seq.add(TimeDistributed(Flatten()))
seq.add(TimeDistributed(Dense(32,)))
seq.add(TimeDistributed(Dense(1, activation='relu')))
seq.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])
print (seq.summary())
history = seq.fit_generator(
    generate_arrays(train_ids), steps_per_epoch=len(train_ids),
    validation_data=generate_arrays(val_ids),
    validation_steps=len(val_ids),
    epochs=100, verbose=1, shuffle=False, initial_epoch=0)

我一运行它,我的 GPU(GTX 1060:6GB)内存就满了,我的 RAM 也满了。我在这里做错了吗?

【问题讨论】:

    标签: tensorflow machine-learning keras deep-learning gpu


    【解决方案1】:

    尝试减少steps_per_epoch 和validation_steps。将所有数据放在一个中会爆炸你的记忆。这就像定义批量大小。

    steps_per_epoch:在声明一个 epoch 完成并开始下一个 epoch 之前从生成器产生的步骤总数(样本批次)。它通常应该等于数据集的样本数除以批量大小。序列可选:如果未指定,将使用 len(generator) 作为步骤数。

    validation_steps:仅当 validation_data 是生成器时才相关。在停止之前从生成器产生的步骤总数(样本批次)。序列可选:如果未指定,将使用 len(validation_data) 作为步数。

    【讨论】:

    • 我已将它们减少到一个并更改了 max_queue_size = 1。另外,我有两个具有 12 GB 内存的 GTX1080Ti,您认为我应该将其减少到一半还是更低?
    • 请您发布您的 seq.summary() 输出
    【解决方案2】:

    深度学习中的批量大小是指在一次迭代中使用的训练示例数。 您已经给出了 300 这么大的批量大小。只需将批量减少到 8、16、32 的较小数量,这通常是深度学习实验中的一种做法。提供大批量通常会导致 GPU 内存不足,因为没有那么多内存可用于处理大批量图像。

    可能导致内存不足的另一个原因可能是后台运行的其他进程的存在。只需执行nvidia-smi 并查看GPU 中是否有任何进程在运行。如果是,则检查内存可用性。

    希望这会对您有所帮助。

    【讨论】:

    • 但它是一个顺序数据,我的训练应该一次在整个视频上进行。另外我有两个 GTX1080Ti 和 12 GB 内存,你认为我应该把它减半还是减半?
    • 我认为你应该阅读深度学习中的时代、迭代和所有内容。无论您是否要在整个视频上进行训练,减少批量大小都无关紧要。不管你给batch-size 16还是3000,整个视频图像都会被覆盖在一个epoch中。
    【解决方案3】:

    首先,确保没有其他浏览器应用程序正在运行,例如 Chrome、firefox 等。稍后,打开 GPU-monitor 工具以查看其内存利用率以调整批量大小参数。如果仍然不起作用,请尝试减小训练数据的大小。

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 2013-07-22
      • 2013-07-13
      • 2021-02-24
      • 2021-09-19
      • 1970-01-01
      • 2015-08-23
      相关资源
      最近更新 更多