Questo post sembra indicare che ciò che voglio realizzare non è possibile. Tuttavia, non ne sono convinto - dato quello che ho già fatto, non vedo perché ciò che voglio fare non possa essere raggiunto ...
Ho due set di dati di immagini in cui uno ha immagini di forma (480, 720, 3) mentre l'altro ha immagini di forma (540, 960, 3).
Ho inizializzato un modello utilizzando il seguente codice:
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'])
Ora che ho addestrato questo modello sul set di dati precedente, vorrei rimuovere il livello del tensore di input e anteporre il modello con un nuovo tensore di input con una forma che corrisponda alle dimensioni dell'immagine di quest'ultimo set di dati.
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')
che produce questo errore:
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'
Nel post che ho collegato, maz afferma che esiste una mancata corrispondenza dimensionale che impedisce di modificare il livello di input di un modello - in questo caso, come posso mettere un livello di input (480, 720, 3) in primo piano del modello VGG16 che prevede (224, 224, 3) immagini?
Penso che un problema più probabile sia che l'output del mio ex modello si aspetti qualcosa di diverso da quello che sto dando in base a ciò che dice Fchollet in questo post . Sono sintatticamente confuso, ma credo che l'intero x = Layer()(x)
segmento stia costruendo il layer pezzo per pezzo a partire da input-> output e semplicemente lanciare un input diverso davanti lo sta distruggendo.
Non ho davvero idea però ...
Qualcuno può illuminarmi come realizzare ciò che sto cercando di fare o, se non è possibile, spiegarmi perché no?