Обслуживание Tensorflow: как перебирать заполнитель ввода

Я использую 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)

Будем очень признательны за любые советы или рекомендации.

Спасибо!


person Jason    schedule 03.05.2018    source источник


Ответы (1)


Возможно похожая ситуация, которую мне предстоит решить. См. Здесь: функция ввода, обслуживающая тензорный поток для скользящего окна по таймсериям данные. Код в этом вопросе выполняет итерацию по временной шкале ввода (скользящее окно) с использованием tf. while_loop. Однако возникает другая проблема, связанная с количеством примеров, не соответствующих входным данным для обслуживания. Я еще не нашел решения этой последующей проблемы.

person ditomax    schedule 03.05.2018