Пользовательские процедуры прогнозирования на платформе Google AI с несколькими входами, как читать json входы - PullRequest
0 голосов
/ 05 апреля 2020

При создании пользовательской процедуры прогнозирования с моделью Keras (Tensorflow 2.1) у меня возникают проблемы с выяснением того, в какую форму поступают входные данные json, и как их читать в классе предикторов для нескольких входных данных. Все примеры пользовательских процедур прогнозирования в документации используют простые плоские списки с одним вводом. Например, если мы отправим наши входные данные в виде:

{"instances": [
    {
    "event_type_input": [1, 2, 20],
    "event_dwelltime_input": [1.368, 0.017, 0.0],
    "rf_input": [1.2, -2.8]},
    {
    "event_type_input": [14, 40, 20],
    "event_dwelltime_input": [1.758, 13.392, 0.0],
    "rf_input": [1.29, -2.87]}
]}

Как мы должны принять входящий json в нашем классе предикторов?

class MyPredictor(object):
  def __init__(self, model):
    self.model = model

  def predict(self, instances, **kwargs):
    inputs = np.array(instances) 
    # The above example from the docs is wrong for multiple inputs
    # What should our inputs be to get the inputs in the right shape 
    # for our keras model?

    outputs = self.model.predict(inputs)
    return outputs.tolist()

Наши json входные данные для платформы Google ai представляют собой список словарей. Однако для модели keras наши входные данные должны иметь различную форму, например:

inputs = {
    "event_type_input": np.array([[1, 2, 20], [14, 40, 20]]),
    "event_dwelltime_input": np.array([[1.368, 0.017, 0.0], [1.758, 13.392, 0.0]])
    "rf_input": np.array([[1.2, -2.8], [1.29, -2.87]]}
model.predict(inputs)

Прав ли я в том, что в таком случае нужно просто изменить форму экземпляров? Единственная путаница заключается в том, что при использовании структуры tenorflow (вместо пользовательской процедуры прогнозирования) она обрабатывает прогнозирование на входном штрафе json, и я подумал, что все, что делает инфраструктура tenorflow, вызывает метод .predict для экземпляров ( если только не происходит какое-то скрытое преобразование данных. Я не мог найти источник, чтобы выяснить, что именно происходит)

Основной вопрос: как мы должны написать наш класс предиктора, чтобы принимать в экземпляры, в которых мы можем запустить метод model.predict?

1 Ответ

0 голосов
/ 05 апреля 2020

Я бы предложил создать новую модель Keras и экспортировать ее.

Создайте отдельный входной слой для каждого из трех входов в новую модель (имя входного файла будет именем в вашем * 1005). * структура). Затем в этой модели измените входные данные и позаимствуйте веса / структуру из вашей обученной модели и экспортируйте новую модель. Как то так:

trained_model = keras.models.load_model(...) # trained model
input1 = keras.Input(..., name='event_type_input')
input2 = keras.Input(..., name='event_dwelltime_input')
input3 = keras.Input(..., name='rf_input')
export_inputs = keras.concatenate([input1, input2, input3])
reshaped_inputs = keras.layers.Lambda(...) # reshape to what the first hidden layer of your trained model expects

layer1 = trained_model.get_layer(index=1)(reshaped_inputs)
layer2 = trained_model.get_layer(index=2)(layer1) # etc. ...
...

exportModel = keras.Model(export_inputs, export_output) 
exportModel.save(...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...