Цей пост, схоже, вказує на те, що те, що я хочу досягти, неможливо. Однак я не переконаний у цьому - враховуючи те, що я вже зробив, я не бачу, чому того, що я хочу зробити, не можна досягти ...
У мене є два набори даних зображень, де один має зображення форми (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)
сегмент будує шар за шматочком з вводу-> виведення і просто кидаючи інший вхід спереду, це порушує його.
Я справді не маю уявлення, хоча ...
Може хтось, будь ласка, просвітить мене, як досягти того, що я намагаюся зробити, або, якщо це неможливо, пояснити мені, чому ні?