API набора данных Tensorflow - .from_tensor_slices () / .from_tensor () - не может создать тензорный протокол, содержимое которого превышает 2 ГБ

Поэтому я хочу использовать Dataset API для пакетной обработки моего большого набора данных (~ 8 ГБ), поскольку я страдаю от больших простоев при использовании моего графического процессора, поскольку я передаю данные из python в Tensorflow с помощью feed_dict.

Когда я следую инструкциям, упомянутым здесь:

https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/5_DataManagement/tensorflow_dataset_api.py

При запуске моего простого кода:

one_hot_dataset = np.load("one_hot_dataset.npy")
dataset = tf.data.Dataset.from_tensor_slices(one_hot_dataset)

Я получаю сообщение об ошибке с TensorFlow 1.8 и Python 3.5:

Traceback (most recent call last):

  File "<ipython-input-17-412a606c772f>", line 1, in <module>
    dataset = tf.data.Dataset.from_tensor_slices((one_hot_dataset))

  File "/anaconda2/envs/tf/lib/python3.5/site-packages/tensorflow/python/data/ops/dataset_ops.py", line 235, in from_tensor_slices
    return TensorSliceDataset(tensors)

  File "/anaconda2/envs/tf/lib/python3.5/site-packages/tensorflow/python/data/ops/dataset_ops.py", line 1030, in __init__
    for i, t in enumerate(nest.flatten(tensors))

  File "/anaconda2/envs/tf/lib/python3.5/site-packages/tensorflow/python/data/ops/dataset_ops.py", line 1030, in <listcomp>
    for i, t in enumerate(nest.flatten(tensors))

  File "/anaconda2/envs/tf/lib/python3.5/site-packages/tensorflow/python/framework/ops.py", line 1014, in convert_to_tensor
    as_ref=False)

  File "/anaconda2/envs/tf/lib/python3.5/site-packages/tensorflow/python/framework/ops.py", line 1104, in internal_convert_to_tensor
    ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)

  File "/anaconda2/envs/tf/lib/python3.5/site-packages/tensorflow/python/framework/constant_op.py", line 235, in _constant_tensor_conversion_function
    return constant(v, dtype=dtype, name=name)

  File "/anaconda2/envs/tf/lib/python3.5/site-packages/tensorflow/python/framework/constant_op.py", line 214, in constant
    value, dtype=dtype, shape=shape, verify_shape=verify_shape))

  File "/anaconda2/envs/tf/lib/python3.5/site-packages/tensorflow/python/framework/tensor_util.py", line 496, in make_tensor_proto
    "Cannot create a tensor proto whose content is larger than 2GB.")

ValueError: Cannot create a tensor proto whose content is larger than 2GB.

Как я могу это решить? Я думаю, что причина очевидна, но что думали разработчики tf, ограничив входные данные до 2 ГБ?!? Я действительно не могу понять этого рационального и каков обходной путь при работе с большими наборами данных?

Я довольно много искал в Google, но не смог найти ни одного похожего сообщения об ошибке. Когда я использую FITFH набора данных numpy, вышеуказанные шаги работают без каких-либо проблем.

Мне как-то нужно сказать TensorFlow, что я действительно буду загружать пакет данных за пакетом и, вероятно, хочу предварительно загрузить несколько пакетов, чтобы мой графический процессор был занят. Но кажется, что он пытается загрузить сразу весь набор данных numpy. Итак, в чем преимущество использования API набора данных, поскольку я могу воспроизвести эту ошибку, просто пытаясь загрузить свой набор данных numpy как tf.constant в граф TensorFlow, который, очевидно, не подходит, и я получаю ошибки OOM.

Приветствуются советы и подсказки по устранению неполадок!


person SolingerMuc    schedule 30.06.2018    source источник
comment
Я не знаю, может ли это помочь, но если вы хотите иметь кортеж с одним элементом, вы должны использовать (X,). (X) не будет создавать кортеж, это просто бесполезная пара ()   -  person Mohammad Jafar Mashhadi    schedule 14.04.2020


Ответы (1)


Эта проблема рассматривается в tf.data руководстве пользователя (https://www.tensorflow.org/guide/datasets) в разделе «Использование массивов NumPy».

По сути, создайте dataset.make_initializable_iterator() итератор и загрузите данные во время выполнения.

Если по какой-то причине это не сработает, вы можете записать свои данные в файлы или создать набор данных из генератора Python (https://www.tensorflow.org/api_docs/python/tf/data/Dataset#from_generator), где вы можете поместить произвольный код Python, включая нарезку вашего массива numpy и получение кусочек.

person iga    schedule 19.11.2018