Как создать статическую случайную константу в Tensorflow? - PullRequest
1 голос
/ 24 июня 2019

Я хочу создать постоянный тензор в Tensorflow, который будет инициализирован с помощью указанного механизма, например, random_uniform, random_normal.

Я знаю, что могу генерировать массив случайных пустышек в соответствии с этими механизмами, например, random_uniform, random_normal и т. Д .; Затем мы передаем полученный массив Numpy в качестве аргумента значения в tf.constant.

Однако вопрос в том, что мы должны придать форму при использовании простой версии случайного механизма. Однако я не хочу предварительно указывать форму, и я надеюсь, что форма будет эластичной, так же, как мы пишем код Tensorflow shape = tf.shape(some_previous_tensor)

Way1 Я пытался: Нет необходимости предварительно указывать конкретную форму константы на этапе построения графика. Однако сгенерированный тензор является случайным, а не статическим. Этого я не ожидал.

var = tf.random.normal(
    [2,2], mean=0.0, stddev=0.5, dtype=tf.float32, 
)

with tf.Session() as sess:
    print('var:', sess.run(var))
    print('var:', sess.run(var))

Output:
 var: [[ 0.21260215  0.13721827]
 [ 0.7704196  -0.48304045]]

var: [[-0.63397115 -0.0956466 ]
 [ 0.0761982   0.54037064]]

Way2 Я пытался: я могу получить статическую константу, но необходимо указать размер в np.random.normal, чего я не ожидал.

var_np = np.random.normal(0,0.5, size=(2,2))
var = tf.constant(value=var_np)

with tf.Session() as sess:
    print('var:', sess.run(var))
    print('var:', sess.run(var))

Output:
var: [[-0.73357953 -0.10277695]
 [ 0.57406473  0.32157612]]
var: [[-0.73357953 -0.10277695]
 [ 0.57406473  0.32157612]]

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Вы можете использовать tf.Variable / tf.get_variable с trainable=False и validate_shape=False.Вы можете использовать значение в зависимости от заполнителя для фигуры в качестве начального значения.Затем, когда вы инициализируете переменную (используя атрибут initializer или что-то более распространенное, например tf.global_variables_initializer), вам просто нужно задать форму для инициализации.После инициализации значение переменной будет оставаться одинаковым для всего сеанса, если только оно не будет инициализировано снова или ему не присвоено другое значение.

import tensorflow as tf

shape = tf.placeholder(tf.int32, [None])
var_init = tf.random.normal(
    shape, mean=0.0, stddev=0.5, dtype=tf.float32, 
)
var = tf.Variable(var_init, validate_shape=False, trainable=False, name='Var')
with tf.Session() as sess:
    tf.random.set_random_seed(0)
    sess.run(var.initializer, feed_dict={shape: [2, 3]})
    print('var:', sess.run(var), sep='\n')
    print('var:', sess.run(var), sep='\n')

Вывод:

var:
[[-0.4055751   0.7597851  -0.04810145]
 [ 0.92776746 -0.3747548  -0.03715562]]
var:
[[-0.4055751   0.7597851  -0.04810145]
 [ 0.92776746 -0.3747548  -0.03715562]]
0 голосов
/ 24 июня 2019

Просто запустите tf.shape(t) для тензора t, в форме которого вы хотите, чтобы ваш статический случайный тензор был.Введите выходное значение в качестве аргумента size в np.random.normal, и все готово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...