Создание новой последовательной модели внутри цикла for (с использованием 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
=================================================================

Вы увидите, что идентификаторы слоев увеличились, чему я удивлен, поскольку я создаю новую последовательную модель для переменной модели, поэтому я ожидал такой же сводки, что и первый.

Когда я звоню 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)

Может ли кто-нибудь заметить мою «умышленную» ошибку?

Не могли бы вы также добавить код цикла for?

today 13.09.2018 21:36

Конечно, это добавлено сейчас

BigBadMe 13.09.2018 21:46
3
2
5 749
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я полагаю, это происходит из-за того, что Керас пытается создать разные модели на одном и том же графе тензорного потока. Поскольку ваши модели имеют другую архитектуру, это не удается.

Попробуйте импортировать тензорный поток:

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()

Другие вопросы по теме