тензоры взяты из разных графиков

Я новичок в тензорном потоке. Попытка создать конвейер ввода из tfrecords. Ниже приведен фрагмент моего кода для создания пакетов и подачи в мой estimator:

def generate_input_fn(image,label,batch_size=BATCH_SIZE):
    logging.info('creating batches...')    
    dataset = tf.data.Dataset.from_tensors((image, label)) #<-- dataset is 'TensorDataset'
    dataset = dataset.repeat().batch(batch_size)
    iterator=dataset.make_initializable_iterator()
    iterator.initializer
    return iterator.get_next()

Строка iterator=dataset.make_initializable_iterator():

ValueError: Tensor ("count: 0", shape = (), dtype = int64, device = / device: CPU: 0) должен быть из того же графика, что и Tensor ("TensorDataset: 0", shape = (), dtype = вариант).

Думаю, я случайно использую тензоры из разных графиков, но понятия не имею, как и в какой строке кода. Я понятия не имею, какой тензор равен count: 0, а какой - TensorDataset: 0.

Может ли кто-нибудь помочь мне отладить это.

Журнал ошибок:

      File "task.py", line 189, in main
    estimator.train(input_fn=lambda:generate_input_fn(image=image_data, label=label_data),steps=3,hooks=[logging_hook])
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/estimator/estimator.py", line 352, in train
    loss = self._train_model(input_fn, hooks, saving_listeners)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/estimator/estimator.py", line 809, in _train_model
    input_fn, model_fn_lib.ModeKeys.TRAIN))
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/estimator/estimator.py", line 668, in _get_features_and_labels_from_input_fn
    result = self._call_input_fn(input_fn, mode)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/estimator/estimator.py", line 760, in _call_input_fn
    return input_fn(**kwargs)
  File "task.py", line 189, in <lambda>
    estimator.train(input_fn=lambda:generate_input_fn(image=image_data, label=label_data),steps=3,hooks=[logging_hook])
  File "task.py", line 152, in generate_input_fn
    iterator=dataset.make_initializable_iterator()
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/data/ops/dataset_ops.py", line 107, in make_initializable_iterator
    initializer = gen_dataset_ops.make_iterator(self._as_variant_tensor(),
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/data/ops/dataset_ops.py", line 1399, in _as_variant_tensor
    self._input_dataset._as_variant_tensor(),  # pylint: disable=protected-access
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/data/ops/dataset_ops.py", line 1156, in _as_variant_tensor
    sparse.as_dense_types(self.output_types, self.output_classes)))
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_dataset_ops.py", line 1696, in repeat_dataset
    output_types=output_types, output_shapes=output_shapes, name=name)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/op_def_library.py", line 350, in _apply_op_helper
    g = ops._get_graph_from_inputs(_Flatten(keywords.values()))
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 5284, in _get_graph_from_inputs
    _assert_same_graph(original_graph_element, graph_element)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 5220, in _assert_same_graph
    original_item))
ValueError: Tensor("count:0", shape=(), dtype=int64, device=/device:CPU:0) must be from the same graph as Tensor("TensorDataset:0", shape=(), dtype=variant).

Если я изменю функцию на:

image_placeholder=tf.placeholder(image.dtype,shape=image.shape)
label_placeholder=tf.placeholder(label.dtype,shape=label.shape)
dataset = tf.data.Dataset.from_tensors((image_placeholder, label_placeholder))

то есть добавить заполнитель, тогда я получу результат:

INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Graph was finalized.
2018-03-18 01:56:55.902917: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
Killed

person Pratik Kumar    schedule 17.03.2018    source источник
comment
Не уверен на 100%, но возможно ли, что image и label, которые вы передаете в качестве входных данных в generate_input_fn, являются тензорами? В этом случае они не будут принадлежать к тому же графику, что и остальные, и вызовут ошибку.   -  person Olivier Moindrot    schedule 18.03.2018
comment
@OlivierMoindrot, это тензоры. Какие-нибудь решения?   -  person Pratik Kumar    schedule 18.03.2018
comment
Вы должны поместить создание всего графика в функцию   -  person Olivier Moindrot    schedule 18.03.2018
comment
могли бы вы привести пример?   -  person Pratik Kumar    schedule 18.03.2018


Ответы (1)


Когда вы вызываете estimator.train(input_fn), будет создан новый график с графиком, определенным в model_fn оценщика, и графиком, определенным в input_fn.

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


Простое решение - убедиться, что каждый определяемый вами тензор находится внутри input_fn или model_fn.

Например:

def generate_input_fn(batch_size):
    # Create the images and labels tensors here
    images = tf.placeholder(tf.float32, [None, 224, 224, 3])
    labels = tf.placeholder(tf.int64, [None])

    dataset = tf.data.Dataset.from_tensors((images, labels))
    dataset = dataset.repeat()
    dataset = dataset.batch(batch_size)
    dataset = dataset.prefetch(1)
    iterator = dataset.make_initializable_iterator()

    return iterator.get_next()
person Olivier Moindrot    schedule 18.03.2018
comment
Как упоминалось в моем вопросе, я добавил placeholders (без какой-либо логики, просто интуитивно), и он запустился, но я не знал, почему это сработало. Теперь я знаю. - person Pratik Kumar; 18.03.2018
comment
Отличный ответ! Использовать график в TensorFlow действительно сложно. Интересно, зачем они сделали такой дизайн. Все будет намного лучше, если в каждом процессе будет разрешен только ОДИН график по умолчанию. - person soloice; 09.10.2018
comment
TensorFlow 2.0 должен иметь другое представление о графике, которое будет более интуитивно понятным и ближе к pytorch. - person Olivier Moindrot; 09.10.2018
comment
@OlivierMoindrot, как это вообще работает? Как на самом деле помещаются данные, если вы используете только заполнители? - person ledawg; 01.03.2020