2

是否可以使用来自 VGG-16 的预训练模型特征并传递到 Keras 中其他模型的 GlobalAveragePooling2D() 层?

VGG-16网络离线特征存储示例代码:

model = applications.VGG16(include_top=False, weights='imagenet')
bottleneck_features_train = model.predict(input)

顶级模型的示例代码:

model = Sequential()
model.add(GlobalAveragePooling2D()) # Here I want to use pre-trained feature from VGG-16 net as input.

我不能使用 Flatten() 层,因为我想预测具有多类的多标签。

4

1 回答 1

2

当然,你绝对可以。你有几个选择:

pooling kwarg

在 VGG16 构造函数中使用poolingkwarg,它将最后一个池化层替换为指定的类型。IE

model_base = keras.applications.vgg16.VGG16(include_top=False, input_shape=(*IMG_SIZE, 3), weights='imagenet', pooling="avg")

将图层添加到输出

您还可以向预训练模型添加更多层:

from keras.models import Model

model_base = keras.applications.vgg16.VGG16(include_top=False, input_shape=(*IMG_SIZE, 3), weights='imagenet')
output = model_base.output
output = GlobalAveragePooling2D()(output)
# Add any other layers you want to `output` here...
model = Model(model_base.input, output)
for layer in model_base.layers:
    layer.trainable = False

最后一行冻结了预训练的层,以便您保留预训练模型的特征并只训练新层。

我写了一篇博文,介绍了使用预训练模型的基础知识,并将它们扩展到处理各种图像分类问题;它还提供了一些可能提供更多上下文的工作代码示例的链接:http: //innolitics.com/10x/pretrained-models-with-keras/

于 2018-02-14T21:43:09.060 回答