Подтвердить что ты не робот

Как изменить форму переменной в TensorFlow?

TensorFlow tutorial говорит, что во время создания нам нужно указать форму тензоров. Эта форма автоматически становится формой тензора. В нем также говорится, что TensorFlow предоставляет расширенные механизмы для изменения переменных. Как я могу это сделать? Любой пример кода?

4b9b3361

Ответ 1

Взгляните на shape-and-shaping из документации TensorFlow. Он описывает различные преобразования формы.

Наиболее распространенной функцией является, вероятно, tf.reshape, которая аналогична эквиваленту numpy. Он позволяет вам указать любую форму, которую вы хотите, до тех пор, пока количество элементов останется прежним. В документации есть несколько примеров.

Ответ 2

Класс tf.Variable является рекомендуемым способом создания переменных, но он ограничивает вашу способность изменять форму переменной после ее.

Если вам нужно изменить форму переменной, вы можете сделать следующее (например, для 32-битного тензора с плавающей запятой):

var = tf.Variable(tf.placeholder(tf.float32))
# ...
new_value = ...  # Tensor or numpy array.
change_shape_op = tf.assign(var, new_value, validate_shape=False)
# ...
sess.run(change_shape_op)  # Changes the shape of `var` to new_value shape.

Обратите внимание, что эта функция не находится в документальном общедоступном API, поэтому она может быть изменена. Если вам действительно нужно использовать эту функцию, сообщите нам, и мы сможем исследовать способ ее продвижения вперед.

Ответ 3

Документация показывает методы перестройки. Это:

  • Изменение формы
  • сжатие (удаляет размеры размера 1 из формы тензора)
  • expand_dims (добавляет размеры размера 1)

а также набор методов для получения shape, size, rank вашего тензора. Вероятно, наиболее часто используется reshape, и вот пример кода с несколькими краевыми случаями (-1):

import tensorflow as tf

v1 = tf.Variable([
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]
])
v2 = tf.reshape(v1, [2, 6])
v3 = tf.reshape(v1, [2, 2, -1])
v4 = tf.reshape(v1, [-1])
# v5 = tf.reshape(v1, [2, 4, -1]) will fail, because you can not find such an integer for -1
v6 = tf.reshape(v1, [1, 4, 1, 3, 1])
v6_shape = tf.shape(v6)
v6_squeezed = tf.squeeze(v6)
v6_squeezed_shape = tf.shape(v6_squeezed)

init = tf.initialize_all_variables()

sess = tf.Session()
sess.run(init)
a, b, c, d, e, f, g = sess.run([v2, v3, v4, v6, v6_shape, v6_squeezed, v6_squeezed_shape])
# print all variables to see what is there
print e # shape of v6
print g # shape of v6_squeezed

Ответ 4

tf.Variable(tf.placeholder(tf.float32))

недействителен при тензорном потоке 1.2.1

в оболочке python:

import tensorflow as tf
tf.Variable(tf.placeholder(tf.float32))

Вы получите:

ValueError: initial_value must have a shape specified: Tensor("Placeholder:0", dtype=float32)

Обновление: если вы добавите validate_shape=False, ошибки не будет.

tf.Variable(tf.placeholder(tf.float32), validate_shape=False)

если tf.py_func соответствует вашему требованию:

def init():
    return numpy.random.rand(2,3)
a = tf.pyfun(init, [], tf.float32)

Вы можете создать переменную, которая имеет любую форму, передав свою собственную функцию init.

Другой способ:

var = tf.get_varible('my-name', initializer=init, shape=(1,1))

Вы можете передать tf.constant или любую функцию init, которая возвращает массив numpy. Предоставленная форма не будет проверена. Форма вывода - ваша реальная форма данных.