Керас: Что выводит предикат_генератор?
В документации 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 ответ
То, что вы делаете, это извлекает узкие места из изображений, которые вы подаете на модель. Форма (496, 4, 4, 512), которую вы получаете: (n_samples, feature_height, feature_width, feature: channel) Вы удалили плотные слои модели, передав
include_top=False
Чтобы объяснить графически, вы прошли образцы через эту модель
без последних 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, чтобы предсказать, какие классы вам нужны.