Модель TensorFlow с пользовательской процедурой прогнозирования в GCP - PullRequest
1 голос
/ 26 апреля 2020

Я использую платформу AI для развертывания модели тензорного потока на основе LSTM в GCP. Я обучил и протестировал модель на локальной машине. Модель выглядит следующим образом:

lookback = 16
lstm_input = Input(shape=(1, look_back), name='lstm_input')
x = LSTM(250, name='lstm_0')(lstm_input)
...
x = Dense(1, name='dense_3')(x)

Модель предназначена для прогнозирования одного значения за раз на основе предыдущих 16 значений. Но на практике мне нужно 16 значений в качестве прогноза. Я сделал это возможным локально, добавив прогнозируемое значение в конце исходных значений, а затем снова выполнил прогнозирование, пока у меня не будет 16 значений следующим образом:

def predict(num_prediction, model):
    prediction_list = list(total_data.iloc[-look_back-1:])

    for _ in range(num_prediction):
        x = np.array(prediction_list[-look_back:])
        x = x.reshape((1, 1, look_back)) #(152, 1, 15)
        out = model.predict(x)
        prediction_list.append(out)
    prediction_list = prediction_list[look_back-1:]

    return prediction_list

Плюс я также нормализовал данные локально и получил среднее значение и стандартные значения на борту во время обучения и прогнозирования. Я экспортировал их в файл json и загрузил его в GCP вместе с файлом моей модели (.pb)

Так что все работает локально. Но я не могу сделать это на GCP, поскольку я не уверен, как денормализовать, используя мои собственные параметры и делать подобные рекурсивные предсказания. Я пытаюсь использовать специальную процедуру прогнозирования для выполнения этой задачи, но даже простые прогнозы не работают, когда модель развернута там как прогноз. Поскольку я отлично отформатировал свой ввод, руководствуясь здесь :

{"instances":[ [[[-1.11942447, -1.22374662, -0.46512613,  2.32171842,
          0.93306964,  0.71291355,  1.74912453,  1.2969071 ,
          0.18740628,  1.20175769,  1.08269237,  0.29160862,
          0.84450949,  2.34316635,  1.11384735,  0.65933734]]] ]}

, но при прогнозировании он выдает следующую ошибку:

{
  "error": "Prediction failed: Error during model execution: <_MultiThreadedRendezvous of RPC that terminated with:\n\tstatus = StatusCode.INVALID_ARGUMENT\n\tdetails = \"transpose expects a vector of size 4. But input(1) is a vector of size 3\n\t [[{{node model_4/lstm_0/transpose}}]]\"\n\tdebug_error_string = \"{\"created\":\"@1587901568.938325490\",\"description\":\"Error received from peer ipv4:127.0.0.1:8081\",\"file\":\"src/core/lib/surface/call.cc\",\"file_line\":1056,\"grpc_message\":\"transpose expects a vector of size 4. But input(1) is a vector of size 3\\n\\t [[{{node model_4/lstm_0/transpose}}]]\",\"grpc_status\":3}\"\n>"
}

Так что это было проблема формы, и мне, возможно, придется увеличить размеры, но добавление другой пары скобок только усугубит ситуацию со следующей ошибкой:

{
  "error": "Prediction failed: Error during model execution: <_MultiThreadedRendezvous of RPC that terminated with:\n\tstatus = StatusCode.INVALID_ARGUMENT\n\tdetails = \"transpose expects a vector of size 5. But input(1) is a vector of size 3\n\t [[{{node model_4/lstm_0/transpose}}]]\"\n\tdebug_error_string = \"{\"created\":\"@1588177916.982978933\",\"description\":\"Error received from peer ipv4:127.0.0.1:8081\",\"file\":\"src/core/lib/surface/call.cc\",\"file_line\":1056,\"grpc_message\":\"transpose expects a vector of size 5. But input(1) is a vector of size 3\\n\\t [[{{node model_4/lstm_0/transpose}}]]\",\"grpc_status\":3}\"\n>"
} 

ОБНОВЛЕНИЕ 1: Возможность получить прогноз для одного значения теперь, дав ему только 3 скобки. Это сработало. Но все еще борется с рекурсивными предсказаниями и денормализацией

...