Этот пост, кажется, указывает на то, что то, чего я хочу достичь, невозможно. Однако я не уверен в этом - учитывая то, что я уже сделал, я не понимаю, почему то, что я хочу сделать, не может быть достигнуто ...
У меня есть два набора данных изображений, где у одного есть изображения формы (480, 720, 3), а у другого - изображения формы (540, 960, 3).
Я инициализировал модель, используя следующий код:
input = Input(shape=(480, 720, 3), name='image_input')
initial_model = VGG16(weights='imagenet', include_top=False)
for layer in initial_model.layers:
layer.trainable = False
x = Flatten()(initial_model(input))
x = Dense(1000, activation='relu')(x)
x = BatchNormalization()(x)
x = Dropout(0.5)(x)
x = Dense(1000, activation='relu')(x)
x = BatchNormalization()(x)
x = Dropout(0.5)(x)
x = Dense(14, activation='linear')(x)
model = Model(inputs=input, outputs=x)
model.compile(loss='mse', optimizer='adam', metrics=['mae'])
Теперь, когда я натренировал эту модель на предыдущем наборе данных, я хотел бы отключить слой входного тензора и добавить в модель новый входной тензор с формой, которая соответствует размерам изображения последнего набора данных.
model = load_model('path/to/my/trained/model.h5')
old_input = model.pop(0)
new_input = Input(shape=(540, 960, 3), name='image_input')
x = model(new_input)
m = Model(inputs=new_input, outputs=x)
m.save('transfer_model.h5')
что приводит к этой ошибке:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/aicg2/.local/lib/python2.7/site-packages/keras/engine/topology.py", line 2506, in save
save_model(self, filepath, overwrite, include_optimizer)
File "/home/aicg2/.local/lib/python2.7/site-packages/keras/models.py", line 106, in save_model
'config': model.get_config()
File "/home/aicg2/.local/lib/python2.7/site-packages/keras/engine/topology.py", line 2322, in get_config
layer_config = layer.get_config()
File "/home/aicg2/.local/lib/python2.7/site-packages/keras/engine/topology.py", line 2370, in get_config
new_node_index = node_conversion_map[node_key]
KeyError: u'image_input_ib-0'
В сообщении, которое я связал, maz утверждает, что существует несоответствие размеров, которое не позволяет изменить входной слой модели - если это так, то как мне поместить (480, 720, 3) входной слой перед модели VGG16, которая ожидает (224, 224, 3) изображения?
Я думаю, что более вероятная проблема заключается в том, что результаты моей бывшей модели ожидают чего-то другого, чем то, что я даю, основываясь на том, что fchollet говорит в этом посте . Я синтаксически запутался, но я полагаю, что весь x = Layer()(x)
сегмент строит слой слой за куском из input-> output, и просто выбрасывая другой вход вперед, это ломает его.
Я действительно понятия не имею, хотя ...
Может кто-нибудь объяснить мне, как выполнить то, что я пытаюсь сделать, или, если это невозможно, объяснить, почему нет?