Отправка пакета смешанных данных возвращает только один прогноз - PullRequest
0 голосов
/ 23 сентября 2019

Я хотел бы отправить пакет смешанных данных по модели тензорного потока.Я использую API REST tensorflow serving, и он, кажется, не работает должным образом.

Мой запрос POST:

$ curl -XPOST -H 'Content-type:application.json' --data '{"instances": [
    {
        "distances": [0.015810276679841896,... ,0.011857707509881422],
        "settings": [50,1,250]
   },
   {
        "distances": [0.255810276679841896,... ,0.320857707509881422],
        "settings": [50,1,250]
   },
   ]}' http://localhost:8501/v1/models/mymodel:predict

, и он возвращает:

{
    "predictions": [0.999931693, 6.81120073e-05, 2.74769889e-07]
}

Я ожидаю что-то вроде (то есть столько ответов, сколько отправляю объекты):

{
    "predictions": [
                    [0.999931693, 6.81120073e-05, 2.74769889e-07],
                    [6.81120073e-05, 0.988888888, 2.74769889e-07]
                 ]
}

Здесь я построил модель, которая ожидает смешанные данные, то есть объект, содержащий два атрибута: distances и settings.Но я получаю только прогноз (массив из 3-х чисел), когда отправляю более одного объекта.


Примечание. Этот тип пакетного запроса работает, когда модель ожидает только один тип данных (например:массив чисел с плавающей точкой).

Пример:

curl -XPOST -H 'Content-type:application.json' --data '{"instances":[
    [0.015810276679841896,... ,0.011857707509881422],
    [0.015810276679841896,... ,0.011857707509881422],
    [0.015810276679841896,... ,0.011857707509881422]
   ]}' http://localhost:8501/v1/models/mymodel:predict

{
    "predictions": [
                    [0.999931693, 6.81120073e-05, 2.74769889e-07],
                    [6.81120073e-05, 0.988888888, 2.74769889e-07],
                    [6.81120073e-05, 0.988888888, 2.74769889e-07]
                 ]
}

Вот моя архитектура модели (с keras framework):

    sess = tf.Session()
    init_op = tf.initialize_all_variables()
    sess.run(init_op)
    K.set_session(sess)
    K.set_learning_phase(0)

    # defines two sets of inputs
    input_distances = Input(shape=(100, ))
    input_settings = Input(shape=(3, ))

    # distances is the first branch which handles arrays of distances
    distances = Dense(100,
                      activation='relu',
                      kernel_initializer='random_uniform')(input_distances)
    distances = Dense(50,
                      activation='relu',
                      kernel_initializer='random_uniform')(distances)
    distances = Model(inputs=input_distances, outputs=distances)

    # settings is the second branch which handles arrays of distances
    settings = Dense(3, activation='relu',
                     kernel_initializer='random_uniform')(input_settings)
    settings = Dense(6, activation='relu',
                     kernel_initializer='random_uniform')(settings)
    settings = Model(inputs=input_settings, outputs=settings)

    # combine the output of the two branches
    combined = concatenate([distances.output, settings.output])

    result = Dense(2, activation='relu')(combined)
    result = Dense(len(labels), activation='softmax')(result)

    model = Model(inputs=[distances.input, settings.input], outputs=result)

    opt = Adam(lr=1e-3, decay=1e-3 / 200)
    model.compile(optimizer=opt,
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...