Цель
Я хочу использовать тензор как часть ввода в методе 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 для восстановления моих данных здесь (также с учетом производительности здесь).