Ten post wydaje się wskazywać, że to, co chcę osiągnąć, nie jest możliwe. Nie jestem jednak do tego przekonany - biorąc pod uwagę to, co już zrobiłem, nie rozumiem, dlaczego nie mogę osiągnąć tego, co chcę zrobić ...
Mam dwa zestawy danych obrazów, w których jeden ma obrazy kształtu (480, 720, 3), a drugi ma obrazy kształtu (540, 960, 3).
Zainicjowałem model przy użyciu następującego kodu:
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'])
Teraz, kiedy wyszkoliłem ten model na poprzednim zestawie danych, chciałbym usunąć warstwę tensora wejściowego i przygotować model z nowym tensorem wejściowym o kształcie pasującym do wymiarów obrazu tego drugiego zestawu danych.
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')
co powoduje ten błąd:
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'
W poście, który podłączyłem, maz stwierdza, że istnieje niedopasowanie wymiarów, które uniemożliwia zmianę warstwy wejściowej modelu - jeśli tak było, to w jaki sposób umieszczam warstwę wejściową (480, 720, 3) z przodu modelu VGG16, który oczekuje (224, 224, 3) obrazów?
Wydaje mi się, że bardziej prawdopodobnym problemem jest to, że wyniki mojego poprzedniego modelu oczekują czegoś innego niż to, co daję na podstawie tego, co fchollet mówi w tym poście . Jestem zagubiony pod względem składniowym, ale wierzę, że cały x = Layer()(x)
segment konstruuje warstwę kawałek po kawałku z input-> output i po prostu rzucanie innym wejściem z przodu go psuje.
Naprawdę nie mam pojęcia ...
Czy ktoś może mi oświecić, jak osiągnąć to, co próbuję zrobić, a jeśli nie jest to możliwe, wytłumacz mi, dlaczego nie?