matrix - tutorial - tf get_variable
¿Cómo puedo cambiar la forma de una variable en TensorFlow? (4)
La documentación muestra métodos para remodelar. Son:
- remodelar
- squeeze (elimina las dimensiones del tamaño 1 de la forma de un tensor)
- expand_dims (agrega dimensiones de tamaño 1)
así como un montón de métodos para obtener la shape
, el size
y el rank
de tu tensor. Probablemente el más utilizado sea la reshape
y aquí hay un ejemplo de código con un par de casos extremos (-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
El tutorial de TensorFlow dice que en el momento de la creación necesitamos especificar la forma de los tensores. Esa forma se convierte automáticamente en la forma del tensor. También dice que TensorFlow proporciona mecanismos avanzados para remodelar las variables. ¿Cómo puedo hacer eso? ¿Algún ejemplo de código?
La clase tf.Variable
es la forma recomendada de crear variables, pero restringe su capacidad para cambiar la forma de la variable una vez que se ha creado.
Si necesita cambiar la forma de una variable, puede hacer lo siguiente (por ejemplo, para un tensor de coma flotante de 32 bits):
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''s shape.
Tenga en cuenta que esta función no se encuentra en la API pública documentada, por lo que está sujeta a cambios. Si encuentra que necesita usar esta función, avísenos y podremos investigar una forma de ayudarlo a seguir adelante.
Eche un vistazo a las formas y la forma de la documentación de TensorFlow. Describe las diferentes transformaciones de formas disponibles.
La función más común es probablemente tf.reshape , que es similar a su equivalente numpy. Le permite especificar cualquier forma que desee, siempre y cuando la cantidad de elementos permanezca igual. Hay algunos ejemplos disponibles en la documentación.
tf.Variable(tf.placeholder(tf.float32))
no es válido en tensorflow 1.2.1
en python shell:
import tensorflow as tf
tf.Variable(tf.placeholder(tf.float32))
Conseguirás:
ValueError: initial_value must have a shape specified: Tensor("Placeholder:0", dtype=float32)
Actualización: si agrega validate_shape=False
, no habrá ningún error.
tf.Variable(tf.placeholder(tf.float32), validate_shape=False)
si tf.py_func
coincide con su requisito:
def init():
return numpy.random.rand(2,3)
a = tf.pyfun(init, [], tf.float32)
Puede crear variables que tengan cualquier forma pasando su propia función init.
De otra manera:
var = tf.get_varible(''my-name'', initializer=init, shape=(1,1))
Puede pasar tf.constant
o cualquier función init
que devuelva numpy array. La forma proporcionada no será validada. La forma de salida es tu forma de datos real.