我有一个形状为(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也已满。我在这里做错了吗?
答案 0 :(得分:0)
尝试减少steps_per_epoch和validation_steps。将所有数据放入其中会消耗您的内存。就像定义批处理大小一样。
steps_per_epoch :在声明一个纪元完成并开始下一个纪元之前,要从生成器产生的总步数(批次)。它通常应等于数据集的样本数除以批次大小。序列的可选:如果未指定,它将使用len(generator)作为许多步骤。
validation_steps :仅当validation_data是生成器时才相关。停止之前从发生器产生的总步数(样本批次)。序列的可选:如果未指定,将使用len(validation_data)作为许多步骤。
答案 1 :(得分:0)
深度学习中的批量大小是指一次迭代中使用的训练示例的数量。 您提供了300个如此大的批处理大小。只需将批处理数量减少为较小的8,16,32,这通常是深度学习实验中的一种做法。大量分配通常会导致GPU内存不足,因为大量内存将无法用于处理大量图像。
导致内存不足情况的另一个原因可能是由于在后台运行的其他进程的存在。只需执行nvidia-smi
,然后查看GPU中是否正在运行任何进程。如果是,则检查内存可用性。
希望这会对您有所帮助。
答案 2 :(得分:0)
首先,确保没有其他浏览器应用程序正在运行,例如Chrome,firefox等。稍后,打开GPU监控器工具以查看其内存利用率以调整批处理大小参数。如果仍然无法使用,请尝试减少训练数据的大小。