【问题标题】:Keras, why is adding layers to a model so slow?Keras,为什么向模型添加层这么慢?
【发布时间】:2016-05-17 14:07:10
【问题描述】:

我正在尝试在 Keras 中构建一个非常大的模型,其中包含 3 个 LSTM 层,每个层有 4096 个隐藏单元。以前我每层有 1024 个隐藏单元。该网络的编译时间是合理的。每层将在大约 1 到 2 秒内添加。现在该模型每层有 4096 个隐藏单元,每层的添加时间约为 5 分钟。我认为奇怪的是,性能缓慢发生在对model.add(LSTM...) 的三个调用期间,而不是在model.compile(...) 期间。我需要使用更大的网络,但是这个等待时间有点难以忍受。这对培训来说并不是那么糟糕,因为这将花费更长的时间,但我不想每次我想生成测试输出时都坐下来。为什么添加需要这么长时间? add 不只是定义层,所有时间都应该花在编译功能上吗?还有什么我可以做的吗?

print('Building Model')
model = Sequential()
model.add(LSTM(lstm_size, batch_input_shape = (batch_size, 1, len(bytes_set)), stateful = True, return_sequences = True, consume_less = consume_less))
model.add(Dropout(0.5))
print('Added LSTM_1')
model.add(LSTM(lstm_size, stateful = True, return_sequences = True, consume_less = consume_less))
model.add(Dropout(0.5))
print('Added LSTM_2')
model.add(LSTM(lstm_size, stateful = True, return_sequences = False, consume_less = consume_less))
model.add(Dropout(0.5))
print('Added LSTM_3')
model.add(Dense(len(bytes_set), activation = 'softmax'))

print('Compiling Model')
model.compile(optimizer = SGD(lr = 0.3, momentum = 0.9, decay = 1e-5, nesterov = True),
              loss = 'categorical_crossentropy', 
              metrics = ['accuracy'])

这是我的 .theanorc

[global]
floatX = float32
mode = FAST_RUN
device = gpu
exception_verbosity = high

[nvcc]
fastmath = 1

这是我要求的模型摘要。不幸的是,过去几个小时我一直在运行这个新版本,所以我不想做任何新的改变。该模型有 4 个 LSTM 层,每个层大小为 1500。

Layer (type)                       Output Shape        Param #     Connected to                     
====================================================================================================
lstm_1 (LSTM)                      (64, 1, 1500)       9774000     lstm_input_1[0][0]               
____________________________________________________________________________________________________
dropout_1 (Dropout)                (64, 1, 1500)       0           lstm_1[0][0]                     
____________________________________________________________________________________________________
lstm_2 (LSTM)                      (64, 1, 1500)       18006000    dropout_1[0][0]                  
____________________________________________________________________________________________________
dropout_2 (Dropout)                (64, 1, 1500)       0           lstm_2[0][0]                     
____________________________________________________________________________________________________
lstm_3 (LSTM)                      (64, 1, 1500)       18006000    dropout_2[0][0]                  
____________________________________________________________________________________________________
dropout_3 (Dropout)                (64, 1, 1500)       0           lstm_3[0][0]                     
____________________________________________________________________________________________________
lstm_4 (LSTM)                      (64, 1500)          18006000    dropout_3[0][0]                  
____________________________________________________________________________________________________
dropout_4 (Dropout)                (64, 1500)          0           lstm_4[0][0]                     
____________________________________________________________________________________________________
dense_1 (Dense)                    (64, 128)           192128      dropout_4[0][0]                  
====================================================================================================
Total params: 63984128
____________________________________________________________________________________________________

【问题讨论】:

    标签: python neural-network theano keras


    【解决方案1】:

    这很慢,因为您正在尝试分配一个至少需要 0.5GB 内存的矩阵。 4096 个单位 * 4097 个重量已经是一个巨大的数字。 LSTM 具有与输入、输出和遗忘门相关的额外内部权重。正如你所看到的,这总和是一个巨大的数字。

    更新 我用手机写了答案,我写的是 TB 而不是 GB。您可以通过添加以下内容轻松检查模型的大小:

    print model.summary()
    

    在这两种情况下(1024 和 4096)。请在评论中分享您的结果,因为我很感兴趣 :)

    【讨论】:

    • 您确定 0.5 TB 的数字吗? 4096 * 4096 * 4 = 78MB(4 表示 32 位浮点数)此外,如果它占用接近 0.5 TB 的空间,则模型根本无法编译,因为我只有 16 GB 的内存 + 120 GB 的交换空间。我的模型确实编译它只是非常慢。
    • 是的,你是对的——这是我的错误。我更新了我的答案。
    • 我添加了我正在运行的当前模型的摘要。它有 4 层,大小为 1500。我记得 3 个 LSTM x 1024 个隐藏单元大约有 10 到 2000 万个参数。我实际上从未完成编译 4096 模型,因为它花费的时间太长。
    • 那么您的网络的具体参数是什么?输入和输出的大小要准确。
    猜你喜欢
    • 2023-04-04
    • 2021-07-27
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    相关资源
    最近更新 更多