Keras:predict_generator的输出是什么?

时间:2017-04-17 22:21:27

标签: python python-3.x numpy keras

Keras文档称它返回“Numpy一系列预测”。 在496个带有4个类的图像示例中使用它,我得到一个4维数组 (496,4,4,512)。其他2个维度是什么? 最后,我希望有一个X(示例)数组和一个Y(标签)数组。

img_width, img_height = 150, 150
top_model_weights_path = 'bottleneck_fc_model.h5'
train_data_dir = 'data/train'
validation_data_dir = 'data/validation'
nb_train_samples = 496
nb_validation_samples = 213
epochs = 50
batch_size = 16
number_of_classes = 3
datagen = ImageDataGenerator(rescale=1. / 255)

# build the VGG16 network (exclude last layer)
model = applications.VGG16(include_top=False, weights='imagenet')

# generate training data from image files
train_generator = datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='categorical',
    shuffle=False)

# predict bottleneck features on training data
bottleneck_features_train = model.predict_generator(
    train_generator, nb_train_samples // batch_size)
print(bottleneck_features_train.shape)

train_data = np.load(open('bottleneck_features_train.npy', 'rb'))
print(train_data.shape)

1 个答案:

答案 0 :(得分:2)

您正在做的是从您提供给模型的图像中提取瓶颈功能。 您获得的形状(496,4,4,512)是( n_samples,feature_height,feature_width,feature:channels ) 你通过

取出了模型的密集层
include_top=False

以图形方式解释,您通过此模型传递样本

VGG16 Model

没有最后4层。 (你有不同的高度和宽度,因为你的凝视图像是150x150而不是224x224,就像标准VGG16 一样)

您获得的不是类的预测,而是图像重要特征的合成表示。

要获得您似乎需要的东西,您可以像这样修改代码

model = applications.VGG16(include_top=False, weights='imagenet')
for layer in model.layers:
    layer.trainable = False
model = Dense(512, activation='relu')(model) #512 is a parameter you can tweak, the higher, the more complex the model
model = Dense(number_of_classes, activation='softmax')(model)

现在你可以在你用来训练模型的样本上调用model.fit(X,Y),将​​它作为X的496个样本图像,并将Y作为你准备的基本事实标签。

培训结束后,您可以使用model.predict预测所需的课程。