Существует ли эквивалент tf.gather () для наборов данных TF? - PullRequest
0 голосов
/ 17 января 2019

В настоящее время я пытаюсь использовать предварительно вычисленные вложения слов, загруженные из файла h5py. Вложения предварительно вычисляются для каждого примера в наборе данных, поэтому я пытаюсь получить вложения по их примеру / идентификатору последовательности. Тем не менее, вложения достаточно велики, поэтому я столкнулся с проблемой, когда я не могу просто запустить tf.gather () непосредственно для встраиваний, чтобы получить те, которые мне нужны, после того как я получу их из файла, так как TF победил ' t генерирует тензор больше 2 ГБ В результате я пытаюсь использовать следующий код:

  # precompute_ds is just the tensor of word embeddings
  precompute_ds = h5py.File(kwargs['precompute_path'], 'r')['precomputed']
  precompute_place = tf.placeholder(precompute_ds.dtype, 
                                    shape=precompute_ds.shape)
  word_emb = tf.gather(precompute_place, sequence_ids)
  with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    sess.run(word_emb, feed_dict={precompute_place: precompute_ds})

return word_emb

Однако, поскольку precompute_ds - это набор данных h5py, я не уверен, как инициализировать для него итератор и получить следующую ошибку:

FailedPreconditionError (see above for traceback): GetNext() failed
because the iterator has not been initialized. Ensure that you have run
the initializer operation for this iterator before getting the next element.
     [[{{node IteratorGetNext}} = IteratorGetNext[output_shapes=
[[?], [?], [?]], output_types=[DT_INT64, DT_INT64, DT_INT64], 
_device="/job:localhost/replica:0/task:0/device:CPU:0"](IteratorV2)]]

Итак, я также попытался использовать следующий код, следуя этому примеру на веб-сайте TF:

  precompute_ds = h5py.File(kwargs['precompute_path'], 'r')['precomputed']
  precompute_place = tf.placeholder(precompute_ds.dtype, 
                                    shape=precompute_ds.shape)
  ds = tf.data.Dataset.from_tensor_slices(precompute_place)
  word_emb = tf.gather(ds, sequence_ids)
  it = ds.make_initializable_iterator()
  with tf.Session() as sess:
    sess.run(it.initializer, feed_dict={precompute_place: precompute_ds})

return word_emb

Однако есть две проблемы: во-первых, я уверен, что даже если tf.gather сработает с наборами данных TF, это не будет правильно заполнять word_emb. Теперь я думаю о том, что я мог бы правильно заполнить ds, используя второй метод, но тогда я не знаю, как получить именно то, что я хочу для этой конкретной партии. Есть какие-нибудь предложения для любого из этих двух подходов, чтобы заставить это работать?

Спасибо!

...