Я использую Tensorflow для создания модели RNN (GRU), теперь модель обучена, и мне нужно развернуть ее с помощью Tensorflow Serving для службы прогнозирования.
Итак, я создаю функцию signature_def, как показано ниже, функция должна получать идентификаторы в качестве входных данных , длина которого не фиксирована (поэтому я установил форму как [None]), внутри функции идентификаторы в идентификаторах выбираются один за другим для передачи в ячейку GRU. Проблема в том, что с формой None я не могу понять, как перебирать все идентификаторы
def signature_def(self):
ids = tf.placeholder(tf.int32, [None], name='input')
state = [np.zeros([1, self.rnn_size], dtype=np.float32) for _ in range(self.layers)]
for i in range(<length_of_ids>):
id = [ids[i]]
inputs = tf.nn.embedding_lookup(self.embedding, id)
output, state = self.stacked_cell(inputs, tuple(state))
logits = tf.matmul(output, self.softmax_W, transpose_b=True) + self.softmax_b
outputs = self.final_activation(logits)
tensor_info_x = tf.saved_model.utils.build_tensor_info(ids)
tensor_info_y = tf.saved_model.utils.build_tensor_info(outputs)
return tf.saved_model.signature_def_utils.build_signature_def(
inputs={'ids': tensor_info_x},
outputs={'preds': tensor_info_y},
method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME)
Я когда-либо пробовал tf.map_fn, который сообщает об ошибке как «... / dropout / mul находится в цикле while». Я также попытался добавить еще один входной параметр для передачи длины идентификаторов, как показано ниже, но, похоже, параметр длины не может изменить цикл for, это по-прежнему значение по умолчанию 3:
def signature_def(self):
ids = tf.placeholder(tf.int32, [None], name='input')
length = tf.placeholder_with_default([3], [1], name='length')
state = [np.zeros([1, self.rnn_size], dtype=np.float32) for _ in range(self.layers)]
for i in range(length.eval()[0]):
id = [ids[i]]
inputs = tf.nn.embedding_lookup(self.embedding, id)
output, state = self.stacked_cell(inputs, tuple(state))
logits = tf.matmul(output, self.softmax_W, transpose_b=True) + self.softmax_b
outputs = self.final_activation(logits)
tensor_info_x = tf.saved_model.utils.build_tensor_info(ids)
tensor_info_l = tf.saved_model.utils.build_tensor_info(length)
tensor_info_y = tf.saved_model.utils.build_tensor_info(outputs)
return tf.saved_model.signature_def_utils.build_signature_def(
inputs={'ids': tensor_info_x, 'length': tensor_info_l},
outputs={'preds': tensor_info_y},
method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME)
Будем очень признательны за любые советы или рекомендации.
Спасибо!