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?
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.
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.
La documentation montre méthodes de remodelage. Elles sont:
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
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.