这篇文章似乎表明我想要完成的事情是不可能的。但是,我不相信这一点-鉴于我已经完成的工作,我不明白为什么我想做的事情无法实现...
我有两个图像数据集,其中一个具有形状图像(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 指出存在尺寸不匹配,阻止更改模型的输入层 - 如果是这种情况,那么我如何在前面放置一个 (480, 720, 3) 输入层期望 (224, 224, 3) 图像的 VGG16 模型?
我认为一个更可能的问题是,我以前的模型的输出预期与我根据 fchollet 在这篇文章中所说的内容给出的不同。我在语法上很困惑,但我相信整个x = Layer()(x)
部分是从输入->输出逐层构建的,只是在前面抛出一个不同的输入就会破坏它。
虽然我真的不知道...
有人可以启发我如何完成我正在尝试做的事情,或者,如果不可能,请向我解释为什么不这样做?