Мультиплеерная модель TensorFlow + Keras с выводом - PullRequest
1 голос
/ 26 мая 2019

Я пытаюсь выполнить классификацию изображений, используя модель Xception Keras, смоделированную по этому коду .Однако я хочу использовать несколько графических процессоров для параллельной классификации изображений с помощью этой функции .Я верю, что это возможно, и у меня есть оригинальный код, работающий без поддержки нескольких GPU, однако я не могу заставить функцию multi_gpu_model работать так, как я ожидал.Я следую этому примеру для примера с несколькими графическими процессорами.Это мой код (это бэкэнд приложения Flask), он создает модель, делает прогноз на примере ndarray при создании класса, а затем ожидает закодированное в base 64 изображение в функции классификации:

import os
from keras.preprocessing import image as preprocess_image
from keras.applications import Xception
from keras.applications.inception_v3 import preprocess_input, decode_predictions
from keras.utils import multi_gpu_model
import numpy as np
import tensorflow as tf
import PIL.Image
from numpy import array


class ModelManager:

    def __init__(self, model_path):
        self.model_name = 'ImageNet'
        self.model_version = '1.0'
        self.batch_size = 32
        height = 224
        width = 224
        num_classes = 1000
        # self.model = tf.keras.models.load_model(os.path.join(model_path, 'ImageNetXception.h5'))
        with tf.device('/cpu:0'):
            model = Xception(weights=None,
                             input_shape=(height, width, 3),
                             classes=num_classes, include_top=True)
            # Replicates the model on 8 GPUs.
        # This assumes that your machine has 8 available GPUs.
        self.parallel_model = multi_gpu_model(model, gpus=8)
        self.parallel_model.compile(loss='categorical_crossentropy',
                                    optimizer='rmsprop')

        print("Loaded Xception model.")
        x = np.empty((1, 224, 224, 3))
        self.parallel_model.predict(x, batch_size=self.batch_size)
        self.graph = tf.get_default_graph()
        self.graph.finalize()

    def classify(self, ids, images):
        results = []
        all_images = np.empty((0, 224, 224, 3))
        # all_images = []
        for image_id, image in zip(ids, images):
            # This does the same as keras.preprocessing.image.load_img
            image = image.convert('RGB')
            image = image.resize((224, 224), PIL.Image.NEAREST)

            x = preprocess_image.img_to_array(image)
            x = np.expand_dims(x, axis=0)
            x = preprocess_input(x)
            all_images = np.append(all_images, x, axis=0)
        # all_images.append(x)
        # a = array(all_images)
        # print(type(a))
        # print(a[0])

        with self.graph.as_default():
            preds = self.parallel_model.predict(all_images, batch_size=288)
        #print(type(preds))

        top3 = decode_predictions(preds, top=3)[0]
        print(top3)
        output = [((t[1],) + t[2:]) for t in top3]

        predictions = [
            {'label': label, 'probability': probability * 100.0}
            for label, probability in output
        ]

        results.append({
            'id': 1,
            'predictions': predictions
        })
        print(len(results))
        return results

Части, в которых я не уверен, - это то, что передать функцию предсказания.В настоящее время я создаю ndarray изображений, которые я хочу классифицировать после их предварительной обработки, а затем передаю их в функцию предикторов.Функция возвращает, но переменная preds не содержит то, что я ожидаю.Я пытался перебрать объект preds, но с ошибками decode_predictions, когда я пропускаю один элемент, но отвечаю одним предсказанием, когда я передаю весь pred ndarray.В примере кода они не используют функцию decode_predictions, поэтому я не уверен, как использовать ее с ответом из parallel_model.predict.Спасибо за любую помощь или ресурсы, спасибо.

1 Ответ

0 голосов
/ 26 мая 2019

на следующем сайте показано, как это сделать правильно ссылка

...