web-dev-qa-db-fra.com

Comment puis-je changer la forme d'une variable dans TensorFlow?

Tutoriel TensorFlow dit qu'au moment de la création, nous devons spécifier la forme des tenseurs. Cette forme devient automatiquement la forme du tenseur. Il indique également que TensorFlow fournit des mécanismes avancés pour remodeler les variables. Comment puis je faire ça? Un exemple de code?

21
Jadiel de Armas

Jetez un œil à formes-et-mise en forme de la documentation TensorFlow. Il décrit les différentes transformations de forme disponibles.

La fonction la plus courante est probablement tf.reshape , qui est similaire à son équivalent numpy. Il vous permet de spécifier n'importe quelle forme que vous souhaitez tant que le nombre d'éléments reste le même. Il y a quelques exemples disponibles dans la documentation.

6
Rafał Józefowicz

Le tf.Variable classe est la méthode recommandée pour créer des variables, mais elle restreint votre capacité à modifier la forme de la variable une fois qu'elle a été créée.

Si vous devez modifier la forme d'une variable, vous pouvez effectuer les opérations suivantes (par exemple, pour un tenseur à virgule flottante 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.

Notez que cette fonctionnalité n'est pas dans l'API publique documentée, elle peut donc être modifiée. Si vous avez besoin d'utiliser cette fonctionnalité, faites-le nous savoir et nous pourrons rechercher un moyen de la soutenir à l'avenir.

19
mrry

La documentation montre méthodes de remodelage. Elles sont:

  • remodeler
  • compression (supprime les dimensions de la taille 1 de la forme d'un tenseur)
  • expand_dims (ajoute des dimensions de taille 1)

ainsi qu'un tas de méthodes pour obtenir shape, size, rank de votre tenseur. Le plus utilisé est probablement reshape et voici un exemple de code avec quelques cas Edge (-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
Salvador Dali
tf.Variable(tf.placeholder(tf.float32))

n'est pas valide à tensorflow 1.2.1

dans python Shell:

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

Tu auras:

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

Mise à jour: si vous ajoutez validate_shape=False, il n'y aura pas d'erreur.

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

si tf.py_func correspond à vos besoins:

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

Vous pouvez créer une variable qui a n'importe quelle forme en passant votre propre fonction init.

Autrement:

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

Tu peux passer tf.constant ou toute fonction init qui renvoie un tableau numpy. La forme fournie ne sera pas validée. La forme de sortie est votre véritable forme de données.

2
chunyang.wen