Я использую платформу 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 скобки. Это сработало. Но все еще борется с рекурсивными предсказаниями и денормализацией