使用保存的瓶颈值转移学习(使用完整模型推断)

时间:2018-05-12 01:46:58

标签: python neural-network keras deep-learning

我使用最新的Keras和tensorflow后端。

如果我使用较小版本的模型来训练瓶颈值,我不太确定将推理的完整模型组合在一起的正确方法。

# Save  bottleneck values

from keras.applications.xception import Xception
base_model = Xception(weights='imagenet', include_top=False)
prediction =  base_model.predict(x)
** SAVE bottleneck data***

现在让我们说我的完整模型看起来像这样:

base_model = Xception(weights='imagenet', include_top=False)
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation='relu')(x)
predictions = Dense(classes, activation='softmax')(x)
model = Model(input=base_model.input, output=predictions)

但为了加快培训速度,我想通过加载瓶颈值来绕过早期的层;所以我创建了一个较小的模型(仅包括新的图层)。然后我训练并保存模型。

bottleneck_input = Input(shape = bottleneck_shape)
x = GlobalAveragePooling2D() (bottleneck_input)
x = Dense(1024, activation='relu')(x)
predictions = Dense(classes, activation='softmax')(x)
model = Model(input= bottleneck_input, output=predictions)
save_full_model() #save model

在训练这个较小的模型后,我想对整个模型进行推理。所以我需要将基础模型和较小的模型放在一起。不确定这样做的最佳方法是什么。

base_model = Xception(weights='imagenet', include_top=False)
#x = base_model.output

loaded_model = load_model() # load bottleneck model

#now to combine both models (something like this?)
Model(inputs = base_model.inputs, outputs = loaded_model.outputs)

将推理模型组合在一起的正确方法是什么? 我不知道是否有办法使用我的全模型进行培训,只是从瓶颈层开始进行培训和输入层进行推理。 (请注意,这与冻结图层不同,冻结图层只会冻结权重(权重不会被更新),但仍会计算每个数据点。)

1 个答案:

答案 0 :(得分:1)

每个模型都是一个具有额外属性的图层,例如损失函数等。因此,您可以像功能API中的图层一样使用它们。在你的情况下它可能看起来像:

input = Input(...)
base_model = Xception(weights='imagenet', include_top=False)
# Apply model to input like layer
base_output = base_model(input)
loaded_model = load_model()
# Now the bottleneck model
out = loaded_model(base_output)
final_model = Model(input, out) # New computation graph