Bu yazı yapmak istediğim şeyin mümkün olmadığını gösteriyor. Ancak, buna ikna olmadım - zaten yaptığım göz önüne alındığında, yapmak istediğim şeyin neden elde edilemediğini anlamıyorum ...
Birinin şekil görüntülerinin (480, 720, 3), diğerinin ise şekil görüntülerinin (540, 960, 3) olduğu iki görüntü veri kümem var.
Aşağıdaki kodu kullanarak bir model başlattım:
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'])
Şimdi bu modeli eski veri kümesinde eğittiğime göre, giriş tensörü katmanını patlatmak ve modeli, ikinci veri kümesinin görüntü boyutlarıyla eşleşen bir şekle sahip yeni bir giriş tensörü ile doldurmak istiyorum.
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')
Bu da bu hatayı verir:
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'
Bağladığım yazıda, maz, bir modelin giriş katmanını değiştirmeyi önleyen bir boyut uyuşmazlığı olduğunu söylüyor - eğer durum buysa, önüne (480, 720, 3) bir giriş katmanını nasıl koyduğumu (224, 224, 3) görüntü bekleyen VGG16 modelinin?
Ben daha olası bir sorun benim eski modelin çıkış ben fchollet içinde söylediklerine dayanarak veriyorum olandan farklı bir şey bekliyor olduğunu düşünüyorum bu yazı . Sözdizimsel olarak kafam karıştı, ama tüm x = Layer()(x)
segmentin katmanı giriş-> çıktıdan parça parça oluşturduğuna ve sadece önden farklı bir girişi attığına inanıyorum .
Gerçekten hiçbir fikrim yok ...
Birisi lütfen yapmaya çalıştığım şeyi nasıl başaracağımı aydınlatabilir mi, yoksa mümkün değilse bana neden olmadığını açıklayabilir mi?