Tensorflow: Dataset.from_generate () ValueError: установка элемента массива с последовательностью - PullRequest
0 голосов
/ 27 августа 2018

Цель

Я хочу использовать тензор как часть ввода в методе dataset.from_generator.

Сообщение об ошибке

---------------------------------------------------------------------------
InvalidArgumentError                      Traceback (most recent call last)
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/client/session.py in _do_call(self, fn, *args)
   1321     try:
-> 1322       return fn(*args)
   1323     except errors.OpError as e:

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/client/session.py in _run_fn(feed_dict, fetch_list, target_list, options, run_metadata)
   1306       return self._call_tf_sessionrun(
-> 1307           options, feed_dict, fetch_list, target_list, run_metadata)
   1308 

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/client/session.py in _call_tf_sessionrun(self, options, feed_dict, fetch_list, target_list, run_metadata)
   1408           self._session, options, feed_dict, fetch_list, target_list,
-> 1409           run_metadata)
   1410     else:

InvalidArgumentError: ValueError: setting an array element with a sequence.
Traceback (most recent call last):

  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/ops/script_ops.py", line 157, in __call__
    ret = func(*args)

  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/data/ops/dataset_ops.py", line 391, in generator_py_func
    nest.flatten_up_to(output_types, values), flattened_types)

  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/data/ops/dataset_ops.py", line 390, in <listcomp>
    for ret, dtype in zip(

  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/ops/script_ops.py", line 124, in _convert
    result = np.asarray(value, dtype=dtype, order="C")

  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/numpy/core/numeric.py", line 492, in asarray
    return array(a, dtype, copy=False, order=order)

ValueError: setting an array element with a sequence.


     [[Node: PyFunc = PyFunc[Tin=[DT_INT64], Tout=[DT_FLOAT, DT_FLOAT], token="pyfunc_150"](arg0)]]
     [[Node: IteratorGetNext_22 = IteratorGetNext[output_shapes=[<unknown>, <unknown>], output_types=[DT_FLOAT, DT_FLOAT], _device="/job:localhost/replica:0/task:0/device:CPU:0"](OneShotIterator_22)]]

During handling of the above exception, another exception occurred:

Ошибка Воспроизвести

Если заменить определение b=tf.ones... на b = np.rand.., ошибка исчезнет.

import numpy as np
import tensorflow as tf

def _create_generator():
    for i in range(3):
        a = np.random.randn(3,2)
        b = tf.ones([1],tf.float32)
        #b= np.random.randn(1)
        result = {}
        result['a'] =  a
        result['b'] = b
        yield result


gen = _create_generator()

dataset = tf.data.Dataset().from_generator(_create_generator,
                        output_shapes={'a':None,'b':None},
                        output_types ={'a':tf.float32, 'b':tf.float32}).batch(1)
iterator = dataset.make_one_shot_iterator()
features = iterator.get_next()


init = tf.initialize_all_variables()
with tf.Session() as sess:
    sess.run(init)
    print(sess.run(features))

Почему я должен использовать тензор в качестве входных данных

Ну, это потому, что моей реальной программе нужно использовать вывод другого tf.data.Dataset как часть Input (данные хранятся в формате TFRecords).Так что это вызовет точно такую ​​же ошибку, как вы увидите после запуска этого фрагмента кода.Прямо сейчас у меня нет никакой идеи обойти и исправить эту проблему косвенно (без использования тензора в качестве ввода).

Почему мне нужно использовать Dataset.from_generator

Есть способ использовать estimator.predict () без загрузки графика каждый раз, когда вы вызываете его, то есть использовать генератор, чтобы оставить запись открытой, и он будет предполагать, что вы не сделали с «одиночным» предсказанием.Тогда Tensorflow не будет загружать график модели снова и снова.


Если вам нужна дополнительная информация о моей информации.дай мне знатьСпасибо!

Edit1:

Почему я должен использовать Dataset API

Объем данных огромен и изначально сохранен на hdfs.Таким образом, конвейер был обработан в Spark и сохранен в формате TFRecord.И насколько я знаю, я могу использовать только Dataset API для восстановления моих данных здесь (также с учетом производительности здесь).

1 Ответ

0 голосов
/ 27 августа 2018

Продолжая обсуждение из комментариев, Estimator.predict не делает ничего волшебного.По общему признанию есть некоторые причудливые вещи - в основном для параллельной работы между несколькими графическими процессорами - но вы всегда можете построить график вручную с помощью Estimator.model_fn:

estimator = get_estimator()           # however you generate it
features, labels = input_fn()         # whatever you would use with `predict`
mode = tf.estimator.ModeKeys.PREDICT  # or TRAIN/EVAL
# depending on your estimator, you may not need mode/config args
spec = estimator.model_fn(features, labels, mode, config=None)
# spec is a tf.estimator.EstimatorSpec - a named tuple
predictions = spec.predictions
# you might have to flatten the function inputs/outputs/Tout below
next_features = tf.py_func(
    next_features_fn, predictions, Tout={'a': tf.float32, 'b': tf.float32})
...