Я хотел бы отправить пакет смешанных данных по модели тензорного потока.Я использую 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'])