Модель кодировщика-декодера Keras RuntimeError: вы должны скомпилировать свою модель перед ее использованием

Я пытаюсь воспроизвести результаты модели подписей к изображениям, но получаю эту ошибку. Код для двух моделей следующий:

image_model = Sequential()
image_model.add(Dense(EMBEDDING_DIM, input_dim=4096, activation='relu'))
image_model.add(RepeatVector(self.max_length))

lang_model = Sequential()
lang_model.add(Embedding(self.vocab_size, 256, input_length=self.max_length))
lang_model.add(LSTM(256, return_sequences=True))
lang_model.add(TimeDistributed(Dense(EMBEDDING_DIM)))

model = Sequential()
model.add(Concatenate([image_model, lang_model]))
model.add(LSTM(1000, return_sequences=False))
model.add(Dense(self.vocab_size))
model.add(Activation('softmax'))

print ("Model created!")
model.compile(loss='categorical_crossentropy', 
optimizer='rmsprop', metrics=['accuracy'])

Затем модель вызывается следующим кодом:

sd = SceneDesc.scenedesc()
model = sd.create_model()
batch_size = 512
model.fit_generator(sd.data_process(batch_size=batch_size), 
    steps_per_epoch=sd.no_samples/batch_size, epochs=epoch, verbose=2, 
    callbacks=None)

Однако, когда вызывается fit_generator, возникает эта конкретная ошибка. Что-то не так с конкатенацией моделей?


person meme mimis    schedule 19.09.2018    source источник


Ответы (2)


В keras есть концепция компиляции вашей модели.

По сути, это настраивает функцию потерь и устанавливает оптимизатор для модели, которую вы хотите обучить.

Например, model.compile(loss='mse',optimizer='Adam') настроит вашу модель на использование функции потерь mse и на использование функции < алгоритм оптимизации href="https://en.wikipedia.org/wiki/Stochastic_gradient_descent#Adam" rel="nofollow noreferrer">Adam. То, что вы используете вместо них, будет сильно зависеть от типа проблемы.

Причина, по которой ваш код выдает ошибку, заключается в том, что модель не может обучаться, поскольку вы не настроили функцию потерь и оптимизатор с использованием метода compile. Просто вызовите model.compile() с выбранной вами функцией потерь и оптимизатором, и тогда вы сможете обучить свою модель.

person a.deshpande012    schedule 20.09.2018
comment
Извините, я не скопировал команду компиляции модели, но я использовал ее, но она не компилирует модель. - person meme mimis; 20.09.2018
comment
@mememimis, да, это очень странно. Вы уверены, что он правильно компилируется? В противном случае я не вижу причин для того, чтобы выдавать эту ошибку. Какая версия кераса? Можете ли вы опубликовать полный код? - person a.deshpande012; 22.09.2018

Вам нужно вызвать метод model.compile(loss, optimizer), прежде чем вы сможете его подогнать.

person CAta.RAy    schedule 19.09.2018
comment
Спасибо, я просто не вставил туда весь код. Я отредактировал свой пост. - person meme mimis; 20.09.2018