Переформатируйте тензор в Tensorflow - PullRequest
0 голосов
/ 20 июня 2020

У меня есть тензор данных, который является выводом net в Tensorflow, однако я хочу переформатировать его в пакет большего размера, состоящий из элементов исходного тензора. Это было не очень ясно, поэтому предположим, что вывод моего net - это тензор с формой (10, 1000, 1) - (batch_size, length, features), и я хочу переформатировать его так, чтобы теперь у меня ( 500, 10, 1), которые представляют собой 500 векторов длины десять из исходного набора данных.

Я знаком с numpy, поэтому я просто собирался использовать его, но вы можете использовать только numpy с EagerTensors. Я не уверен, что это дополнительная проблема, но я пытаюсь использовать сеть GAN, поэтому код выглядит следующим образом:

with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:
    generated = generator(noise, training=True)
    generated = reformat(generated)
    fake_output = discriminator(generated, training=True)
    real_output = discriminator(real, training=True)
    gen_loss = generator_loss(fake_output)
    disc_loss = discriminator_loss(real_output, fake_output)

gradients_of_generator = gen_tape.gradient(gen_loss, generator.trainable_variables)
gradients_of_discriminator = disc_tape.gradient(disc_loss, discriminator.trainable_variables)

generator_optimizer.apply_gradients(zip(gradients_of_generator, generator.trainable_variables))
discriminator_optimizer.apply_gradients(...)

Я упоминаю об этом, поскольку не уверен, что переформатирование данных в этом контексте приведет к беспорядку до обучения.

1 Ответ

0 голосов
/ 20 июня 2020

А как насчет tf.reshape()? Должен работать как с активными тензорами, так и с тензорами на основе графиков. Немного неясно, почему общее количество элементов в вашем переформатированном тензоре меньше исходного, но если это то, что вы действительно хотите, я предлагаю использовать комбинацию tf.reshape() и создать список случайных индексов, которые вы затем используете для произвольно выбирайте из исходного тензора, чтобы получить желаемое количество элементов. index и исходный начальный индекс по длине. Назовем их b и s соответственно. Таким образом, вы создаете случайные списки b и s длиной 500, а затем используете их для индексации вашего тензора. Если B и S - списки длиной 500 для каждого из них, ваша операция индексирования может выглядеть примерно как new_tensor = old_tensor[B,S,:]. - DerekG 31 минута a go

Индексирование (я полагаю) поддерживает вычисление графиков, потому что градиент - это просто константа для выбранных индексов. Я не уверен на 100%, что это позволит выполнять вычисления на основе графов без необходимости восстанавливать график на основе случайных индексов, но если это так, я не думаю, что есть способ сделать случайную подвыборку без необходимости для возврата c

...