Python Keras,为什么向模型中添加层这么慢?

Python Keras,为什么向模型中添加层这么慢?,python,neural-network,theano,keras,Python,Neural Network,Theano,Keras,我正在尝试在Keras中构建一个非常大的模型,有3个LSTM层,每个层有4096个隐藏单元。以前我在每层有1024个隐藏单位。该网络的编译时间是合理的。每一层大约需要1到2秒的时间。现在模型每层有4096个隐藏单元,每层的添加时间约为5分钟。不过,我觉得奇怪的是,在对model.add(LSTM…的三次调用期间,性能会变慢,而不是在model.compile(…)期间。我需要使用更大的网络,但这种等待时间有点难以忍受。这对培训来说并不是那么糟糕,因为这需要更长的时间,但我不想每次我想要生成测试输

我正在尝试在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'])
这是我的。Theanoc

[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
____________________________________________________________________________________________________

这很慢,因为您正试图分配一个至少需要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的ram+120 GB的交换空间。我的模型确实编译得很慢。是的,你是对的,这是我的错误。我更新了我的答案。我添加了我正在运行的当前模型的摘要。它有4层,尺寸1500。我记得3LSTM乘以1024个隐藏单位大约有1000-2000万个参数。我从来没有真正完成过4096模型的编译,因为它花费了太长的时间。那么,您的网络的具体参数是什么?输入和输出的大小要精确。