Не может быть имен для ввода и вывода в keras model.fit - PullRequest
0 голосов
/ 20 апреля 2020

Вкратце: почему эта строка работает -

model.fit(x_train, y_train, epochs=30, batch_size=40, verbose=2)

А эта строка не

model.fit({"word_input": x_train, "main_output": y_train}, epochs=30, batch_size=40, verbose=2)

Дальнейшее объяснение

Я пытаюсь реализовать LSTM с керасом. Я написал следующий код

word_input = Input(shape=(mxlen,), dtype="int32", name="word_input")
x1 = Embedding(len(vocab), 100, input_length=mxlen, weights=[embeddings], trainable=False)(word_input)
x1 = LSTM(100)(x1)

y = Dense(6, activation="softmax", name="main_output")(x1)

model = Model(inputs=[word_input], outputs=[y])
adam = optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, amsgrad=False)
model.compile(optimizer=adam,loss="categorical_crossentropy",metrics=["categorical_accuracy"]) # have to look into it
model.fit({"word_input": x_train, "main_output": y_train}, epochs=30, batch_size=40, verbose=2)

В последней строке я получаю сообщение об ошибке: « ValueError: Градиенты не указаны для любой переменной ». Но точный код работает, когда я изменяю последнюю строку на эту

model.fit(x_train, y_train, epochs=30, batch_size=40, verbose=2)

Причина, по которой я хочу иметь имена или метки для ввода и вывода в model.fit, заключается в том, что я хочу иметь несколько входов. Мне пришла в голову идея иметь метки из следующей строки кода

model.fit(
        {'main_input': X_train, 'pos_input': X_train_pos, 
         'aux_input': X_train_meta, 'dep_input': X_train_dep},
        {'main_output': Y_train}, epochs = num_epochs, batch_size = batch_size,
        validation_data = (
            {'main_input': X_val, 'pos_input': X_val_pos, 
             'aux_input': X_val_meta, 'dep_input' : X_val_dep},
            {'main_output': Y_val}
        ), callbacks=[csv_logger,checkpoint])

Полный скриншот ошибки приведен ниже

enter image description here

Любая помощь приветствуется. Заранее спасибо.

1 Ответ

1 голос
/ 20 апреля 2020

Решение

Похоже, что это open-github-проблема для тензорного потока, в настоящее время в разработке, а named-output еще не реализовано с использованием dict.

Документация для Model.fit() показывает, что в настоящее время вход x может быть именованным входом при использовании dict, однако вывод y пока не принимает dict.

fit(
    x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None,
    validation_split=0.0, validation_data=None, shuffle=True, class_weight=None,
    sample_weight=None, initial_epoch=0, steps_per_epoch=None,
    validation_steps=None, validation_freq=1, max_queue_size=10, workers=1,
    use_multiprocessing=False, **kwargs
)

Где,

INPUT , x = либо numpy массив / список массивов, либо тензор, либо диктант, либо генератор .

Диктофон, отображающий имена входов в соответствующий массив / тензоры, если модель имеет именованные входы.

OUTPUT , y = либо массив numpy или тензор, либо не заданный, когда x является генератором.


Для справки

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...