Введите целое число с заполнителем в тензор потока? - PullRequest
0 голосов
/ 09 октября 2019

Я хочу передать batch_size целое число в качестве заполнителя в Tensorflow. Но это не действует как целое число. Рассмотрим следующий пример:

import tensorflow as tf


max_length = 5
batch_size = 3

batch_size_placeholder = tf.placeholder(dtype=tf.int32)

mask_0 = tf.one_hot(indices=[0]*batch_size_placeholder, depth=max_length, on_value=0., off_value=1.)
mask_1 = tf.one_hot(indices=[0]*batch_size, depth=max_length, on_value=0., off_value=1.)

# new session
with tf.Session() as sess:
    feed = {batch_size_placeholder : 3}

    batch, mask0, mask1 = sess.run([
                     batch_size_placeholder, mask_0, mask_1
    ], feed_dict=feed)

Когда я печатаю значения batch, mask0 и mask1, я получаю следующее:

print(batch)
>>> array(3, dtype=int32)

print(mask0)
>>> array([[0., 1., 1., 1., 1.]], dtype=float32)

print(mask1)
>>> array([[0., 1., 1., 1., 1.],
           [0., 1., 1., 1., 1.],
           [0., 1., 1., 1., 1.]], dtype=float32)

Действительно, я думал mask0 и mask1 должны быть одинаковыми, но, похоже, Tensorflow не рассматривает batch_size_placeholder как целое число. Я полагаю, что это будет тензор, но в любом случае я могу использовать его как целое число в своих вычислениях?

В любом случае я могу решить эту проблему? Просто к вашему сведению, я использовал tf.one_hot в качестве примера, я хочу запустить тренировку / проверку во время обучения в моем коде, где мне понадобится много других вычислений с различными значениями для batch_size в обучении и на этапах проверки.

Любая помощь будет оценена.

1 Ответ

1 голос
/ 10 октября 2019

При использовании чистого Python [0]*3 будет [0,0,0]. Однако batch_size_placeholder является заполнителем, во время выполнения графа это будет тензор. [0]*tensor будет рассматриваться как тензорное умножение. В вашем случае это будет 1-й тензор с нулевым значением. Чтобы правильно использовать batch_size_placeholder, вы должны создать тензор такой же длины, как и batch_size_placeholder.

mask_0 = tf.one_hot(tf.zeros(batch_size_placeholder, dtype=tf.int32), depth=max_length, on_value=0., off_value=1.)

Он будет иметь тот же результат, что и mask_1.

Простой пример, показывающий разницу.

batch_size_placeholder = tf.placeholder(dtype=tf.int32)

a = [0]*batch_size_placeholder
b = tf.zeros(batch_size_placeholder, dtype=tf.int32)
with tf.Session() as sess:
    print(sess.run([a, b], feed_dict={batch_size_placeholder : 3}))

# [array([0], dtype=int32), array([0, 0, 0], dtype=int32)]
...