我想在 keras 中使用预训练的 imagenet VGG16 模型,并在顶部添加我自己的小型卷积网络。我只对功能感兴趣,对预测不感兴趣
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
from keras.applications.vgg16 import VGG16
from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input
import numpy as np
import os
from keras.models import Model
from keras.models import Sequential
from keras.layers import Convolution2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
从目录加载图像(该目录包含 4 个图像)
IF = '/home/ubu/files/png/'
files = os.listdir(IF)
imgs = [img_to_array(load_img(IF + p, target_size=[224,224])) for p in files]
im = np.array(imgs)
加载基础模型,预处理输入并获取特征
base_model = VGG16(weights='imagenet', include_top=False)
x = preprocess_input(aa)
features = base_model.predict(x)
这有效,我在预训练的 VGG 上获得了图像的特征。
我现在想微调模型并添加一些卷积层。
我读https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html and https://keras.io/applications/ https://keras.io/applications/但无法将它们完全结合在一起。
在顶部添加我的模型:
x = base_model.output
x = Convolution2D(32, 3, 3)(x)
x = Activation('relu')(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Convolution2D(32, 3, 3)(x)
x = Activation('relu')(x)
feat = MaxPooling2D(pool_size=(2, 2))(x)
构建完整的模型
model_complete = Model(input=base_model.input, output=feat)
阻止基础层被学习
for layer in base_model.layers:
layer.trainable = False
新模型
model_complete.compile(optimizer='rmsprop',
loss='binary_crossentropy')
现在拟合新模型,模型是 4 张图像,[1,0,1,0] 是类标签。
但这显然是错误的:
model_complete.fit_generator((x, [1,0,1,0]), samples_per_epoch=100, nb_epoch=2)
ValueError: output of generator should be a tuple (x, y, sample_weight) or (x, y). Found: None
这是怎么做到的?
如果我只想替换最后一个卷积块(VGG16 中的 conv block5)而不是添加某些内容,我该怎么做?
我如何只训练瓶颈特征?
特征输出features
形状为 (4, 512, 7, 7)。有四个图像,那么另外的维度里有什么呢?我如何将其减少为 (1,x) 数组?