代码之家  ›  专栏  ›  技术社区  ›  BigBadMe

在for循环中创建新的序列模型(使用Keras)

  •  1
  • BigBadMe  · 技术社区  · 8 年前

    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增加了,这让我很惊讶,因此我希望得到与第一个相同的摘要。

    当我打电话的时候 型号.fit\u发电机() 我得到这个错误:

    InvalidArgumentError(回溯见上文):必须输入一个值 对于占位符张量'cu\u dnnlstm\u 1\u input',带有数据类型float和shape

    cu_dnnlstm_1_input ,这是第一个迭代模型上的输入,而不是第二个模型上的cu\ U dnnlstm\ U 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)
    

    1 回复  |  直到 8 年前
        1
  •  3
  •   A cup of tea    8 年前

    我想这是因为Keras试图在同一张张量流图上创建不同的模型。由于您的模型有不同的体系结构,它无法做到这一点。

    尝试导入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()