gpt4 book ai didi

tensorflow - 即使批量大小较小,Keras fit_generator 也会使用大量内存

转载 作者:行者123 更新时间:2023-11-30 08:50:39 24 4
gpt4 key购买 nike

之前,由于内存限制,我在 for 循环中使用 model.fit() 手动训练模型,以在小批量数据上训练模型。问题是我无法通过history.history访问所有以前的历史记录,因为就像每次训练一个新模型时,以前的历史记录都没有存储在任何地方。

当我在 500 个批量大小上使用 model.fit() 时,大约 7 GB 的内存已满。我使用 keras 和 tensorflow-cpu 后端。但是当我使用生成器时,即使批量大小为 50,内存也无法容纳,并且会被交换到磁盘上。

我正在使用 224*224 图像执行分类,并且我正在尝试微调 vgg 脸部。我正在使用根据此链接实现的 vgg 脸部: VGG-Face

我正在使用 ResNet 和 SeNet 架构,如链接中所述。

我之前已经整理过我的数据。我已留出 %20 的数据进行测试。我的数据、图像地址和标签存储在列表中。我的训练数据的 %20 将用于验证。例如,如果批大小等于 50,train_data_generator 将从训练数据的前 %80 部分创建大小为 40 的批,而 vl_data_generator 将从训练数据的最后 %20 部分创建大小为 10 的批。我编写了一个类,并通过创建一个实例并调用 train 方法通过它,我进行训练。以下是我的代码的生成器和训练部分,不包括模型定义:

def prepare_input_data(self, batch_addresses):
image = []
for j in range(len(batch_addresses)):
img = cv2.imread(batch_addresses[j])
img = cv2.resize(img, (224, 224))
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

img = img - np.array([103.939, 116.779, 123.68])

image.append(img)

data = np.array(image)
data = data.astype('float32')
data /= 255

return data


def train_data_generator(self, addresses, labels, batch_size):
"""Train data generator"""
#Use first %80 of data for training.
addresses = addresses[: int(0.8 * len(addresses))]
labels = labels[: int(0.8 * len(labels))]
total_data = len(addresses)
while 1:
for i in range(total_data / batch_size):
batch_addresses = addresses[i * batch_size: (i + 1) * batch_size]
batch_labels = labels[i * batch_size: (i + 1) * batch_size]

data = self.prepare_input_data(batch_addresses)

batch_labels = np_utils.to_categorical(batch_labels, self.nb_class)

yield data, batch_labels

def val_data_generator(self, addresses, labels, batch_size):
"""Validation data generator"""
#Use the last %20 of data for validation
addresses = addresses[int(0.8 * len(addresses)):]
labels = labels[int(0.8 * len(labels)):]
total_data = len(addresses)
image = []
while 1:
for i in range(total_data / batch_size):
batch_addresses = addresses[i * batch_size: (i + 1) * batch_size]
batch_labels = labels[i * batch_size: (i + 1) * batch_size]

data = self.prepare_input_data(batch_addresses)

batch_labels = np_utils.to_categorical(batch_labels, self.nb_class)

yield data, batch_labels

def train(self, label_interested_in):
"""Trains the model"""
#Read training data from json file, and get addresses and labels
addresses, labels = self.create_address_and_label(label_interested_in)
batch_size = 50
train_batch_size = 40
val_batch_size = 10
steps = int(len(addresses) / batch_size) + 1
print(len(addresses), steps)
#Perform training
history = self.custom_vgg_model.fit_generator(
self.train_data_generator(addresses, labels, train_batch_size),
steps_per_epoch=steps, epochs=self.number_of_epochs,
verbose=1, validation_data=self.val_data_generator(addresses, labels, val_batch_size),
validation_steps=steps, initial_epoch=0)

为什么我看到如此高的内存使用率?是因为生成器在 keras 中的工作方式吗?我读到生成器预先准备批处理,以通过与训练并行运行来加速训练过程。还是我做错了什么?

作为一个附带问题,由于 fit_generator() 中没有 batch_size 参数,我是否正确假设数据基于生成器加载到模型中,并且在加载每个训练和验证批处理后执行梯度更新?

最佳答案

尝试workers=0

这不会调用任何多重处理,该多重处理旨在使用 k 个工作线程预先将队列填充到 max_queue_size 参数。这是做什么的;在 GPU 上进行训练的同时,在 CPU 上准备生成的数据队列,这样就不会浪费时间并避免瓶颈。

根据您的需要,workers=0 可以工作

欲了解更深入的查询,请参阅 keras fit_generator

关于tensorflow - 即使批量大小较小,Keras fit_generator 也会使用大量内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49169865/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com