В настоящее время я пытаюсь использовать предварительно вычисленные вложения слов, загруженные из файла 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
, используя второй метод, но тогда я не знаю, как получить именно то, что я хочу для этой конкретной партии. Есть какие-нибудь предложения для любого из этих двух подходов, чтобы заставить это работать?
Спасибо!