Ce message semble indiquer que ce que je veux accomplir n'est pas possible. Cependant, je ne suis pas convaincu de cela - compte tenu de ce que j'ai déjà fait, je ne vois pas pourquoi ce que je veux faire ne peut pas être réalisé ...
J'ai deux jeux de données d'images où l'un a des images de forme (480, 720, 3) tandis que l'autre a des images de forme (540, 960, 3).
J'ai initialisé un modèle en utilisant le code suivant:
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'])
Maintenant que j'ai formé ce modèle sur l'ancien jeu de données, j'aimerais supprimer la couche de tenseur d'entrée et ajouter le modèle avec un nouveau tenseur d'entrée avec une forme qui correspond aux dimensions de l'image de ce dernier jeu de données.
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')
ce qui donne cette erreur:
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'
Dans le message que j'ai lié, maz indique qu'il existe une incompatibilité de dimension qui empêche de changer la couche d'entrée d'un modèle - si tel était le cas, comment se fait-il que je mette une couche d'entrée (480, 720, 3) devant du modèle VGG16 qui attend (224, 224, 3) des images?
Je pense qu'un problème plus probable est que la sortie de mon ancien modèle attend quelque chose de différent de ce que je lui donne en fonction de ce que fchollet dit dans ce post . Je suis confus syntaxiquement, mais je crois que le x = Layer()(x)
segment entier construit le calque morceau par morceau à partir de l'entrée-> sortie et simplement jeter une entrée différente devant le casse.
Je n'en ai vraiment aucune idée cependant ...
Quelqu'un peut-il m'éclairer sur la façon d'accomplir ce que j'essaie de faire ou, si ce n'est pas possible, m'expliquer pourquoi?