Esta publicación parece indicar que lo que quiero lograr no es posible. Sin embargo, no estoy convencido de esto: dado lo que ya he hecho, no veo por qué no puedo lograr lo que quiero hacer ...
Tengo dos conjuntos de datos de imágenes donde uno tiene imágenes de forma (480, 720, 3) mientras que el otro tiene imágenes de forma (540, 960, 3).
Inicialicé un modelo usando el siguiente código:
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'])
Ahora que he entrenado este modelo en el conjunto de datos anterior, me gustaría quitar la capa del tensor de entrada y anteponer el modelo con un nuevo tensor de entrada con una forma que coincida con las dimensiones de la imagen del último conjunto de datos.
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')
que produce este error:
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'
En la publicación que vinculé, maz afirma que hay un desajuste de dimensión que impide cambiar la capa de entrada de un modelo; si este fuera el caso, entonces, ¿cómo es que puse una capa de entrada (480, 720, 3) al frente del modelo VGG16 que espera imágenes (224, 224, 3)?
Creo que un problema más probable es que el resultado de mi modelo anterior espera algo diferente de lo que le doy en función de lo que dice fchollet en esta publicación . Estoy sintácticamente confundido, pero creo que todo el x = Layer()(x)
segmento está construyendo la capa pieza por pieza a partir de input-> output y simplemente arrojando una entrada diferente al frente lo está rompiendo.
Aunque realmente no tengo idea ...
¿Puede alguien aclararme cómo lograr lo que estoy tratando de hacer o, si no es posible, explicarme por qué no?