【问题标题】:Training and saving very large models in Keras在 Keras 中训练和保存非常大的模型
【发布时间】:2017-10-11 20:59:17
【问题描述】:

我正在 Keras 中构建一个带有注意力的 LSTM 模型,用于多标签分类,但有数千个可能的输出标签,每个标签都有自己的 sigmoid 预测层和独特的注意力 MLP 层。这么大的模型能训练和保存吗?我收到以下 h5py RuntimeError: Unable to create attribute (Object header message is too large)。

【问题讨论】:

  • 需要分批生成数据,分批训练。为了保存模型,只保存最佳权重,而不是整个模型
  • 你尝试了什么?
  • 我尝试使用 train_on_batch() 批量训练并使用 model.to_json() 和 model.save_weights() 保存模型,但它无法保存完整模型的权重。只保存最佳权重是什么意思?
  • 您的问题是关于大型模型,对吗?即,具有数十万个连接的模型?批量训练只对大型数据集有帮助,对大型模型没有帮助。我也遇到了同样的问题,训练一个具有极宽层(每层 100,000 多个节点)的多层 LSTM 网络。你找到解决办法了吗?
  • 是的,我问的是大型模型,而不是大型数据集,但遗憾的是还没有找到解决方案。请让我知道你发现了什么!我的下一个想法是将模型分成数千个不同的模型,每个模型都有自己的注意力机制,但我们可能没有足够的数据来分别训练每个模型,这就是为什么我还没有尝试过。

标签: python deep-learning keras


【解决方案1】:

您可能已经了解 HDF5 的标头限制。查看here 了解更多信息。

所以我遇到了同样的问题,我用一个小技巧解决了它。在保存之前将图层的名称更改为一些小字符串。我是这样做的:

for i, m in enumerate(model.layers):
    m.name = 'n' + str(i)

它起作用了(不要让'n'混淆你。我只是希望我的图层名称以字符开头,而不是数字)。请注意,图层名称应该是唯一的,而 str(i) 解决了这个问题。如果稍后加载模型后需要图层名称,可以为它们创建字典并将字典保存在文本文件中。加载模型后,从文本文件中读取字典并使用它将当前层名称映射到原始层名称。 例如,像这样创建字典:

dic = {}
for i, m in enumerate(model.layers):
    dic['n' + str(i)] = m.name
    m.name = 'n' + str(i)

然后像这样使用它:

for m in model.layers:
    m.name = dic[m.name]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 2019-10-23
    • 2020-12-27
    • 2019-05-25
    • 2018-10-16
    • 2018-08-03
    • 2020-07-16
    相关资源
    最近更新 更多