Я пытаюсь преобразовать пример doc2vec из использования feed-dict в использование конвейера tf.data. Я изо всех сил, как реализовать генерацию последовательности окон.
Мне удалось реализовать все методы загрузки данных в text_helpers.py , но я не могу понять, как справиться с методом generate_batch_data
. Любые указатели будут с благодарностью.
Я пытался использовать tf.string.split, чтобы разбить предложение на слова, но затем я не могу получить форму результата, чтобы использовать его для задания диапазона, проходящего через ws
. (См. Ниже). Выдает ошибку. потому что это None
, а не целое число. Я предполагаю, что строки для append
переменной window_sequences
также не будут работать.
ОБНОВЛЕНИЕ: Добавлен мой код в репозиторий github.
https://github.com/waldren/doc2vec-datapipeline
ОБНОВЛЕНИЕ: Я думаю, что движусь в правильном направлении. Теперь у меня есть tf. while_loop
def generate_window_sequence(self, sentence_ix, sentence, label):
ws = tf.strings.split([sentence], sep=' ').values
offset = tf.constant(int(self.window_size/2))
i = tf.constant(int(self.window_size/2))
def while_condition (i, window_sequences, ws, offset):
return tf.less(i, tf.math.subtract(tf.size(ws), offset))
def body(i, window_sequences, ws, offset):
#TODO - move within offset if it is > 1
before = tf.math.subtract(i, offset)
after = tf.math.add(i, offset)
#window_sequences.append((tf.gather(ws, [before, i])))
#window_sequences.append((tf.gather(ws, [after, i])))
return i+1, window_sequences, ws, offset
window_sequences = []
window_sequences.append(("before1","test1"))
i, window_sequences, ws, offset = tf.while_loop(while_condition, body, [i, window_sequences, ws, offset])
return sentence_ix, window_sequences, label
Это будет "работать", но я не знаю, работает ли цикл несколько раз. Но как только я раскомментирую две строки в функции body
(начиная с window_sequence), я получаю ошибку ValueError: Number of inputs and outputs of body must match loop_vars: 5, 7
.