python - 在 for 循环中创建一个新的顺序模型(使用 Keras)

标签 python neural-network keras

我想尝试使用不同的超参数训练我的模型,因此我设置了一系列嵌套的 for 循环来遍历它们。

model = None
batch_generator = None

for sequence_length in all_sequence_length:
    for label_periods in all_label_periods:
        for num_layers in all_num_layers:
            for num_units in all_num_units:
                loadFiles()
                createmodel()
                trainmodel()

第一次迭代创建这样的模型:

Layer (type)                 Output Shape              Param #
=================================================================
cu_dnnlstm_1 (CuDNNLSTM)     (None, 100, 75)           45300
_________________________________________________________________
dropout_1 (Dropout)          (None, 100, 75)           0
_________________________________________________________________
cu_dnnlstm_2 (CuDNNLSTM)     (None, 100, 75)           45600
_________________________________________________________________
dropout_2 (Dropout)          (None, 100, 75)           0
_________________________________________________________________
cu_dnnlstm_3 (CuDNNLSTM)     (None, 100, 75)           45600
_________________________________________________________________
dropout_3 (Dropout)          (None, 100, 75)           0
_________________________________________________________________
cu_dnnlstm_4 (CuDNNLSTM)     (None, 100, 75)           45600
_________________________________________________________________
dropout_4 (Dropout)          (None, 100, 75)           0
_________________________________________________________________
cu_dnnlstm_5 (CuDNNLSTM)     (None, 100, 75)           45600
_________________________________________________________________
dropout_5 (Dropout)          (None, 100, 75)           0
_________________________________________________________________
dense_1 (Dense)              (None, 3)                 228
=================================================================

然后我调用 model.fit_generator() 来训练模型并且执行良好。然后在下一个循环迭代中再次创建模型,摘要如下所示:

Layer (type)                 Output Shape              Param #
=================================================================
cu_dnnlstm_6 (CuDNNLSTM)     (None, 100, 75)           45300
_________________________________________________________________
dropout_6 (Dropout)          (None, 100, 75)           0
_________________________________________________________________
cu_dnnlstm_7 (CuDNNLSTM)     (None, 100, 75)           45600
_________________________________________________________________
dropout_7 (Dropout)          (None, 100, 75)           0
_________________________________________________________________
cu_dnnlstm_8 (CuDNNLSTM)     (None, 100, 75)           45600
_________________________________________________________________
dropout_8 (Dropout)          (None, 100, 75)           0
_________________________________________________________________
cu_dnnlstm_9 (CuDNNLSTM)     (None, 100, 75)           45600
_________________________________________________________________
dropout_9 (Dropout)          (None, 100, 75)           0
_________________________________________________________________
cu_dnnlstm_10 (CuDNNLSTM)     (None, 100, 75)           45600
_________________________________________________________________
dropout_10 (Dropout)          (None, 100, 75)           0
_________________________________________________________________
dense_2 (Dense)              (None, 3)                 228
=================================================================

您会看到层 ID 增加了,这让我感到惊讶,因为我为模型变量创建了一个新的顺序模型,所以我期望得到与第一个相同的摘要。

当我调用 model.fit_generator() 时出现此错误:

InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'cu_dnnlstm_1_input' with dtype float and shape [?,100,74]

您会看到它期待 cu_dnnlstm_1_input 的输入,这是第一次迭代模型的输入,而不是第二次模型的 cu_dnnlstm_6 的输入。我创建模型的代码是在一个函数中完成的:

def createmodel():

    global model

    model = Sequential()
    model.add( CuDNNLSTM(units=num_units, return_sequences=True, input_shape=(sequence_length, features_size) ) )

    for _ in range(num_layers):
        model.add( Dropout(dropout_rate) )
        model.add( CuDNNLSTM(units=num_units, return_sequences=True) )

    model.add( Dropout(dropout_rate) )
    model.add( CuDNNLSTM(units=num_units, return_sequences=False) )

    model.add( Dropout(dropout_rate) )
    model.add( Dense(labels_size) )

    model.compile(loss='mean_absolute_error', optimizer='adam')

    model.summary()

模型是用这个函数训练的:

def trainmodel():

    global model

    model.fit_generator(generator=batch_generator,
        epochs=num_epochs,
        steps_per_epoch=num_steps_per_epoch,
        validation_data=validation_data_tuple,
        callbacks=callbacks)

谁能发现我的“故意”错误?

最佳答案

我想这是因为 Keras 试图在同一个 tensorflow 图上创建不同的模型。由于您的模型具有不同的架构,因此无法做到这一点。

尝试导入tensorflow:

import tensorflow as tf

并以这种方式修改你的循环:

for sequence_length in all_sequence_length:
    for label_periods in all_label_periods:
        for num_layers in all_num_layers:
            for num_units in all_num_units:
                graph = tf.Graph()
                with tf.Session(graph=graph):
                    loadFiles()
                    createmodel()
                    trainmodel()

关于python - 在 for 循环中创建一个新的顺序模型(使用 Keras),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52320059/

相关文章:

python - python 集合组合方法中的惊人顺序

python - jinja + form + unicode 控制字符 + xml/docx 集成

python - 从图像中减去均值

machine-learning - 我可以得到 theano 中共享变量的形状信息吗?

keras - 如何从 keras 中的 Conv2D 正确获取层权重?

Python,在字典中查找与规则匹配的组件

python - 创建一个修改了一个元素的新元组

python - MNIST 数据反规范化不会给我返回相同的结果

python - Actor 评论家政策损失为零(没有改善)

python - keras中如何将cifar10输入inceptionv3