Tensorflow передает несколько параметров через конвейер input_fn

Я пишу высокоуровневое приложение тензорного потока точно так же, как этот минст-оценщик - это сборка, за исключением того, что я создаю простую RNN, которая предсказывает последовательности. Я новичок в тензорном потоке, поэтому я пытаюсь разобраться в проблеме, которая может быть на самом деле простой для людей, которые раньше работали с высокоуровневым api тензорного потока.

Вот фрагмент моего кода, чтобы дать представление:

def main(argv=None):
    """Run the training experiment."""
    ....
    # Setup the Estimator
    model_estimator = build_estimator(config, params)
    # Setup and start training and validation
    train_spec = tf.estimator.TrainSpec(
        input_fn=lambda: get_train_inputs(128),
        max_steps=2000)
    ...
    tf.estimator.train_and_evaluate(model_estimator, train_spec, eval_spec)

def build_estimator(config, params):
    return tf.estimator.Estimator(
        model_fn=model_fn,
        config=config,
        params=params,
    )

def model_fn(features, mode, params):
    #Input data
    _inputs = tf.placeholder(tf.int32, shape=[batch_size, times_steps])
    _labels = tf.placeholder(tf.float32, shape=[batch_size, num_classes])
    # Sequence lengths for dynamic allocation
    _seqlens = tf.placeholder(tf.int32, shape=[batch_size])
    ...
    return tf.estimator.EstimatorSpec(
        mode=mode,
        predictions=predictions,
        loss=loss,
        train_op=train_op,
        eval_metric_ops=eval_metric_ops
    )

Вот моя входная функция pipleine:

# Get train inputs function
def get_train_inputs(batch_size):
    def train_inputs(batch_size):
            # Build dataset iterator
            x_batch, y_batch, seqlen_batch = sequence_generator.get_sentence_batch(
                batch_size, sequence_generator.train_x, sequence_generator.train_y, sequence_generator.train_seqlens)
            features={'_inputs': x_batch, '_labels': y_batch, '_seqlens': seqlen_batch}
            return features
    return train_inputs(batch_size)

Из-за размера моего кода я вставил сюда только соответствующие фрагменты кода. Проблема здесь в том, что во время:

train_spec = tf.estimator.TrainSpec(
    input_fn=lambda: get_train_inputs(128),
    max_steps=2000)

get_train_inputs(128) подает features словарь в заполнитель _inputs model_fn, поэтому _labels и _seqlens остаются пустыми и выдают ошибку во время выполнения, если для этих заполнителей не указаны значения. model_fn принимает только два параметра функции: features и labels. Как ввести в модель все три параметра _inputs, _labels и _seqlens?

Любые предложения будут высоко оценены.

ПРИМЕЧАНИЕ. Причина ввода третьего параметра _seqlens заключается в том, что я использую tf.nn.dynamic_rnn в моем model_fn, который требует длины последовательности, тогда как метки используются в tf.nn.softmax_cross_entropy_with_logits в моей функции softmax.


person sshussain270    schedule 10.07.2018    source источник


Ответы (2)


Вы не должны использовать заполнители с tf.Estimator. Вам следует изучить tf.data API (см. Здесь). Ваша функция ввода должна возвращать get_next op одноразового итератора. Приносим извинения, если вы уже делаете это, но из вашего кода не ясно, что именно возвращает ваша функция ввода.
Предполагая, что вы настроили это, чтобы вернуть dict, как в вашем примере, вы сможете просто использовать _inputs = features["_inputs"] и т. д. в функции вашей модели.

person xdurch0    schedule 10.07.2018

  • В дополнение к ответу @ xdurch0 используйте tf.feature_column для описания функций FeatureColumns набора данных, которые передаются в качестве входных данных в Оценщик model_fn для обучения и оценки.
  • Внутри model_fn используйте метод tf.feature_column.input_layer () `, чтобы вернуть плотный тензор в качестве входного слоя на основе указанного FeatureColumn.

    Вы можете увидеть примеры работы с FeatureColumns здесь.

person Ekaba Bisong    schedule 13.07.2018