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

Поэтому я хочу использовать Dataset API для пакетирования моего большого набора данных (~ 8 ГБ), так как я страдаю от больших простоев при использовании моего GPU, когда я передаю данные из 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 ГБ?!? Я действительно не могу понять это рационально, и какой обходной путь при работе с большими наборами данных?

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

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

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

1 Ответ

0 голосов
/ 20 ноября 2018

Эта проблема устранена в руководстве пользователя 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 и получение среза).

...