Как выполнить прогнозирование с помощью обученной модели в Керасе - PullRequest
0 голосов
/ 31 октября 2019

Я новичок в Керасе. После изучения обучения по онлайн-учебнику я попытался подготовить модель для своего пользовательского набора данных, и ниже приведен мой код. Как мне выполнить классификацию по изображению?

Вот тренировочный код:

def build_finetune_model(base_model, dropout, fc_layers, num_classes):
    for layer in base_model.layers:
        layer.trainable = False

    x = base_model.output
    x = Flatten()(x)
    for fc in fc_layers:
        # New FC layer, random init
        x = Dense(fc, activation='relu')(x) 
        x = Dropout(dropout)(x)

    # New softmax layer
    predictions = Dense(num_classes, activation='softmax')(x) 
    finetune_model = Model(inputs=base_model.input, outputs=predictions)
    return finetune_model

train_datagen =  ImageDataGenerator(preprocessing_function=preprocess_input)
train_generator = train_datagen.flow_from_directory(TRAIN_DIR, 
                                                    target_size=(HEIGHT, WIDTH), 
                                                    batch_size=BATCH_SIZE)
base_model = MobileNetV2(weights='imagenet', include_top=False, input_shape=(HEIGHT, WIDTH, 3))

root=TRAIN_DIR
class_list = [ item for item in os.listdir(root) if os.path.isdir(os.path.join(root, item)) ]
print (class_list)

FC_LAYERS = [1024, 1024]
dropout = 0.5

finetune_model = build_finetune_model(base_model, dropout=dropout, fc_layers=FC_LAYERS, num_classes=len(class_list))
adam = Adam(lr=0.00001)
finetune_model.compile(adam, loss='categorical_crossentropy', metrics=['accuracy'])
filepath="./checkpoints/" + "MobileNetV2_{epoch:02d}_{acc:.2f}" +"_model_weights.h5"
checkpoint = ModelCheckpoint(filepath, monitor=["acc"], verbose=1, mode='max', save_weights_only=True)
callbacks_list = [checkpoint]

history = finetune_model.fit_generator(train_generator, epochs=NUM_EPOCHS, workers=8, 
                                       steps_per_epoch=steps_per_epoch, 
                                       shuffle=True, callbacks=callbacks_list)

А вот мой классификационный код, который возвращает только массив чисел с плавающей запятой!

if __name__ == '__main__':
    model = load_model('ResNet50_model_weights.h5')

    img_path = 'test.jpg'
    img = image.load_img(img_path, target_size=(300, 300))
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    print('Input image shape:', x.shape)

    results = model.predict(x)
    print('Predicted:', results)

1 Ответ

2 голосов
/ 31 октября 2019

Последний уровень вашей модели - softmax, что означает, что он выводит вероятности для каждого класса от 0 до 1. Чтобы определить, к какому классу прогнозируется входное изображение, возьмите argmax результатов. argmax возвращает индекс максимального элемента в массиве.

predicted_class_label = np.argmax(results)
print("network predicted input image is class {}".format(predicted_class_label))
...