tensorflow - 使用 fit_generator 批量训练模型
问题描述
我的模型有 100 000 个图像训练样本,如何修改下面的代码以批量训练它?使用 model.fit_generator 我必须在生成器函数中指定它:
def data_generator(descriptions, features, n_step, max_sequence):
# loop until we finish training
while 1:
# loop over photo identifiers in the dataset
for i in range(0, len(descriptions), n_step):
Ximages, XSeq, y = list(), list(),list()
for j in range(i, min(len(descriptions), i+n_step)):
image = features[j]
# retrieve text input
desc = descriptions[j]
# generate input-output pairs
in_img, in_seq, out_word = preprocess_data([desc], [image], max_sequence)
for k in range(len(in_img)):
Ximages.append(in_img[k])
XSeq.append(in_seq[k])
y.append(out_word[k])
# yield this batch of samples to the model
yield [[array(Ximages), array(XSeq)], array(y)]
我的model.fit_generator
代码:
model.fit_generator(data_generator(texts, train_features, 1, 150),
steps_per_epoch=1500, epochs=50, callbacks=callbacks_list, verbose=1)
任何帮助都会很棒,我正在训练云 16GB V100 Tesla
编辑:我的图像标题模型为 DSL(250 个标记)中的每个标记创建一个训练样本。使用包含 50 张图像(相当于 12500 个训练样本)和批量大小为 1 的数据集,我得到了 OOM。大约有 32 个(相当于 8000 个样本和 1 的批量大小,它训练得很好。)我的问题是我可以更好地优化我的代码,还是我唯一的选择是使用多个 GPU?
使固定:
Steps_per_epoch 必须等于 ceil(num_samples / batch_size),所以如果数据集有 1500 个样本,steps_per_epoch 应该等于 1500。我还将 LSTM 滑动窗口从 48 减少到 24
steps_per_epoch:整数。在声明一个时期完成并开始下一个时期之前从生成器产生的步骤总数(样本批次)。它通常应该等于 ceil(num_samples / batch_size)。序列可选:如果未指定,将使用 len(generator) 作为多个步骤。
解决方案
生成器已经返回批次。
每一个yield
都是一批。完全取决于您以您想要的方式设计带有批次的生成器。
在您的代码中,批量大小为n_step
.
推荐阅读
- php - Laravel:根据输入字段验证最小值和最大值
- neo4j - 有 Neo4j 图形存储文档吗?
- python - 嵌入命令不会发送,所有其他嵌入都会发送
- function - 如何创建返回 DATETIME2 的确定性函数?
- python - 如何重命名文件以匹配父文件夹的名称并使用python添加增量编号?
- dart - 单击后退按钮后如何修复 ListView 上的重复错误?
- intellij-idea - SVN 在两个不同的更改列表中处理一个文件
- javascript - Buddypress jq.cookie 不是函数
- asp.net - 创建新项目时如何更改 dotnet new 模板的名称?
- c++ - 在另一个类 C++ 中使用对象的重载 istream