Я работаю над моделью подписи к изображению. Во время обучения модели я получаю ошибку компиляции. Я пробовал много решений, но не могу решить проблему. Кроме того, мой код был в старой версии Keras. Я использую Keras 2.2.4: пожалуйста, посмотрите ниже код, написанный в старой версии Keras:
import numpy as np
import pandas as pd
from keras.models import Sequential, Model
from keras.layers import LSTM, Embedding, TimeDistributed, Dense, RepeatVector, Activation
from keras.layers.merge import Concatenate
from keras.preprocessing import image, sequence
import pickle as pickle
def create_model(self, ret_model = False):
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(Merge([image_model, lang_model], mode='concat'))
model.add(LSTM(1000,return_sequences=False))
model.add(Dense(self.vocab_size))
model.add(Activation('softmax'))
print ("Model created!")
if(ret_model==True):
return model
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
return model
Я изменил код так, как это. Библиотеки такие же, как я показал в первом коде. Пожалуйста, смотрите ниже измененный код:
def create_model(self, ret_model = False):
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(Merge([image_model, lang_model], mode='concat'))
model.add(Concatenate([image_model, lang_model])) #changed the above commented line to this
model.add(LSTM(1000, return_sequences=False))
model.add(Dense(self.vocab_size))
model.add(Activation('softmax'))
print ("Model created!")
if(ret_model==True):
return model
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
return model
Когда я использую этот измененный код и обучаю свою модель, я получаю ошибку во время выполнения, которая говорит, что я должен скомпилировать свой код. Хотя я компилирую свой код. Пожалуйста, посмотрите на ошибку ниже:
Using TensorFlow backend.
413439
WARNING:tensorflow:From C:\Users\UserName\Anaconda3\lib\site-
packages\tensorflow\python\framework\op_def_library.py:263: colocate_with (from
tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
Instructions for updating:
Colocations handled automatically by placer.
Model created!
Traceback (most recent call last):
File "D:\Image-caption\Image-Captioning-master\train.py", line 14, in <module>
train(int(sys.argv[1]))
File "D:\Image-caption\Image-Captioning-master\train.py", line 9, in train
model.fit_generator(sd.data_process(batch_size=batch_size),
steps_per_epoch=sd.no_samples/batch_size, epochs=epoch, verbose=2, callbacks=None)
File "C:\Users\UserName\Anaconda3\lib\site-packages\keras\legacy\interfaces.py", line 91, in
wrapper
return func(*args, **kwargs)
File "C:\Users\UserName\Anaconda3\lib\site-packages\keras\engine\training.py", line 1418, in
fit_generator
initial_epoch=initial_epoch)
File "C:\Users\UserName\Anaconda3\lib\site-packages\keras\engine\training_generator.py", line 40,
in fit_generator
model._make_train_function()
File "C:\Users\UserName\Anaconda3\lib\site-packages\keras\engine\training.py", line 496, in
_make_train_function
raise RuntimeError('You must compile your model before using it.')
RuntimeError: You must compile your model before using it.
Это мой код файла train.py:
import SceneDesc
import sys
def train(epoch):
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)
model.save('Output/Model.h5', overwrite=True)
model.save_weights('Output/Weights.h5',overwrite=True)
if __name__=="__main__":
train(int(sys.argv[1]))
Я новичок и на этапе обучения. Я пытаюсь решить эту проблему в течение достаточно долгого времени, но не могу решить проблему. Я также предоставил ссылку на мои файлы в dpaste. Вот ссылка: https://dpaste.de/t2yU и https://dpaste.de/cVGP ... Хотя это только два файла. Я старался изо всех сил, чтобы задать четкий вопрос. Я надеюсь получить положительный ответ. :) Любая помощь будет оценена.