この投稿は、私が達成したいことが不可能であることを示しているようです。しかし、私はこれを確信していません-私がすでにやったことを考えると、私がやりたいことを達成できない理由がわかりません...
2つの画像データセットがあり、一方には形状(480、720、3)の画像があり、もう一方には形状(540、960、3)の画像があります。
次のコードを使用してモデルを初期化しました。
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'])
前のデータセットでこのモデルをトレーニングしたので、入力テンソルレイヤーをポップし、後者のデータセットの画像の寸法と一致する形状を持つ新しい入力テンソルをモデルに追加したいと思います。
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')
このエラーが発生します:
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'
私がリンクした投稿では、モデルの入力レイヤーの変更を妨げる次元の不一致があるとmazが述べています。 (224、224、3)画像を期待するVGG16モデルの
私がよりありそうな問題は、以前のモデルの出力が、この投稿でfcholletが言ったことに基づいて、私がそれを与えているものとは異なる何かを期待していることだと思います。私は構文的に混乱していますが、x = Layer()(x)
セグメント全体が入力から出力まで部分ごとにレイヤーを構築しており、単純に前に別の入力を投げることはそれを壊していると思います。
本当にわからないけど...
誰かが私がやろうとしていることを達成する方法を教えてもらえますか、それが不可能な場合は、なぜそうしないのか説明してください。