318 votes

Quelle est la différence entre tf.placeholder et tf.Variable?

Je suis novice en TensorFlow. Je suis confus au sujet de la différence entre tf.placeholder et tf.Variable. À mon avis, tf.placeholder est utilisé pour les données d'entrée, et tf.Variable est utilisé pour stocker l'état des données. C'est tout ce que je sais.

Est-ce que quelqu'un pourrait m'expliquer plus en détail les différences? En particulier, quand utiliser tf.Variable et quand utiliser tf.placeholder?

7 votes

Intuitivement, vous voudrez des gradients par rapport aux Variable, mais pas aux placeholder (dont les valeurs doivent toujours être fournies).

0 votes

Un cours comme cs231n.stanford.edu peut aider ceux qui sont confus. Je l'ai beaucoup aimé! Évidemment, il y en a d'autres.

190voto

Sung Kim Points 57

En bref, vous utilisez tf.Variable pour des variables entraînables telles que les poids (W) et les biais (B) pour votre modèle.

weights = tf.Variable(
    tf.truncated_normal([IMAGE_PIXELS, hidden1_units],
                    stddev=1.0 / math.sqrt(float(IMAGE_PIXELS))), name='weights')

biases = tf.Variable(tf.zeros([hidden1_units]), name='biases')

tf.placeholder est utilisé pour alimenter des exemples d'entraînement réels.

images_placeholder = tf.placeholder(tf.float32, shape=(batch_size, IMAGE_PIXELS))
labels_placeholder = tf.placeholder(tf.int32, shape=(batch_size))

Voici comment vous alimentez les exemples d'entraînement pendant l'entraînement :

for step in xrange(FLAGS.max_steps):
    feed_dict = {
       images_placeholder: images_feed,
       labels_placeholder: labels_feed,
     }
    _, loss_value = sess.run([train_op, loss], feed_dict=feed_dict)

Vos tf.variables seront entraînées (modifiées) à la suite de cet entraînement.

Consultez plus sur https://www.tensorflow.org/versions/r0.7/tutorials/mnist/tf/index.html. (Les exemples sont tirés de la page web.)

2 votes

Que se passe-t-il si je veux prétraiter mon image avant de la fournir? (par exemple, rescaler le contraste). Ai-je maintenant besoin d'une variable pour cela? Si oui, cela a-t-il des implications en termes de mémoire ou de vitesse?

1 votes

Toute prétraitement que vous effectuez va être fait avant de nourrir les données dans le graphique Tensorflow (c'est-à-dire le réseau), donc ce travail ne nécessite pas techniquement d'outils de code de Tensorflow. Par exemple, une variable serait inutile 1. parce que ce sont des données d'entrée, qui sont passées à travers tf.placeholders (pas de variables) dans le graphique et 2. Le prétraitement se fait avant d'être chargé dans un espace réservé pour le passage actuel à travers le réseau.

0 votes

Juste voulais noter à quel point j'apprécie cette réponse. Le fait qu'il y ait beaucoup moins de votes positifs sur cette réponse que sur la question montre simplement à quel point les gens peuvent être en quête de satisfaction immédiate, et à quel point les balises à la mode comme tensorflow et deep learning et IA le sont.

81voto

fabrizioM Points 11498

La différence est qu'avec tf.Variable vous devez fournir une valeur initiale lorsque vous le déclarez. Avec tf.placeholder vous n'avez pas besoin de fournir une valeur initiale et vous pouvez la spécifier au moment de l'exécution avec l'argument feed_dict à l'intérieur de Session.run

68 votes

-1. Bien que cela soit vrai, cela passe à côté du sujet. La différence la plus importante est leur rôle au sein de TensorFlow. Les variables sont entraînées avec le temps, les placeholders sont les données d'entrée qui ne changent pas pendant l'entraînement du modèle (comme les images d'entrée et les étiquettes de classe pour ces images). Comme le dit la réponse de Sung Kim, vous utilisez des variables pour les poids et les biais de votre modèle (bien que cela ne se limite pas à cela - pour le transfert de style, vous optimisez une image avec le temps).

0 votes

@ChrisAnderson pourrions-nous dire que cette illustration est fausse ?! youtu.be/MotG3XI2qSs?t=136

0 votes

@ChrisAnderson Pourquoi est-ce important de savoir à quoi cela devait être utilisé, si les différences ne sont que qu'une nécessité d'avoir une valeur initiale ?

66voto

leo adams Points 22

Étant donné que les calculs de tenseurs se composent de graphiques, il est donc préférable d'interpréter les deux en termes de graphiques.

Prenons par exemple la régression linéaire simple

WX+B=Y

W et B représentent les poids et le biais, X les entrées des observations et Y les sorties des observations.

De toute évidence, X et Y sont de même nature (variables manifestes) qui diffèrent de celle de W et B (variables latentes). X et Y sont des valeurs des échantillons (observations) et ont donc besoin d'un endroit à remplir, tandis que W et B sont les poids et le biais, Variables (les valeurs précédentes affectent les dernières) dans le graphique qui doivent être entraînés en utilisant différentes paires de X et Y. Nous plaçons différents échantillons dans les Placeholders pour entraîner les Variables.

Nous devons seulement enregistrer ou restaurer les Variables (aux points de contrôle) pour enregistrer ou reconstruire le graphique avec le code.

Les Placeholders sont principalement des conteneurs pour les différents ensembles de données (par exemple les données d'entraînement ou de test). Cependant, les Variables sont entraînées dans le processus d'entraînement pour les tâches spécifiques, c'est-à-dire pour prédire le résultat de l'entrée ou mapper les entrées aux étiquettes souhaitées. Elles restent les mêmes jusqu'à ce que vous retrainez ou affinez le modèle en utilisant des échantillons différents ou les mêmes pour remplir les Placeholders souvent à travers le dict. Par exemple:

 session.run(a_graph, dict = {a_placeholder_name : sample_values}) 

Les Placeholders sont également passés en paramètres pour définir les modèles.

Si vous modifiez les placeholders (ajoutez, supprimez, changez la forme, etc.) d'un modèle en cours d'entraînement, vous pouvez toujours recharger le point de contrôle sans autres modifications. Mais si les variables d'un modèle enregistré sont modifiées, vous devez ajuster le point de contrôle en conséquence pour le recharger et continuer l'entraînement (toutes les variables définies dans le graphique doivent être disponibles dans le point de contrôle).

En résumé, si les valeurs proviennent des échantillons (observations que vous avez déjà), vous pouvez en toute sécurité créer un placeholder pour les contenir, tandis que si vous avez besoin qu'un paramètre soit entraîné, utilisez une Variable (autrement dit, définissez les Variables pour les valeurs que vous souhaitez obtenir automatiquement à l'aide de TF).

Dans certains modèles intéressants, comme un modèle de transfert de style, les pixels d'entrée vont être optimisés et les variables du modèle habituellement appelées sont fixes, alors nous devrions faire de l'entrée (généralement initialisée de manière aléatoire) une variable comme implémenté dans ce lien.

Pour plus d'informations, veuillez vous référer à ce document simple et illustratif.

42voto

James Points 3068

Résumé

Variables

  • Pour les paramètres à apprendre
  • Les valeurs peuvent être dérivées de l'entraînement
  • Des valeurs initiales sont nécessaires (souvent aléatoires)

Emplacements réservés

  • Stockage alloué pour les données (comme pour les données de pixels d'image pendant une alimentation)
  • Les valeurs initiales ne sont pas nécessaires (mais peuvent être définies, voir tf.placeholder_with_default)

35voto

Salvador Dali Points 11667

La différence la plus évidente entre le tf.Variable et le tf.placeholder est que


vous utilisez des variables pour stocker et mettre à jour les paramètres. Les variables sont des buffers en mémoire contenant des tenseurs. Ils doivent être explicitement initialisés et peuvent être sauvegardés sur disque pendant et après l'entraînement. Vous pouvez ensuite restaurer les valeurs sauvegardées pour tester ou analyser le modèle.

L'initialisation des variables se fait avec sess.run(tf.global_variables_initializer()). De plus, lors de la création d'une variable, vous devez passer un tenseur comme valeur initiale à la méthode Variable() et lorsque vous créez une variable, vous connaissez toujours sa forme.


En revanche, vous ne pouvez pas mettre à jour le placeholder. Ils ne doivent pas non plus être initialisés, mais parce qu'ils sont une promesse d'avoir un tenseur, vous devez leur fournir une valeur avec sess.run(, {a: }). Et enfin, contrairement à une variable, un placeholder pourrait ne pas connaître sa forme. Vous pouvez soit fournir certaines dimensions, soit ne rien fournir du tout.


Voici d'autres différences:

  • les valeurs à l'intérieur de la variable peuvent être mises à jour pendant les optimisations
  • les variables peuvent être partagées, et peuvent être non entraînables
  • les valeurs à l'intérieur de la variable peuvent être stockées après l'entraînement
  • lorsque la variable est créée, 3 ops sont ajoutées à un graphe (opération de variable, opération d'initialisation, opérations pour la valeur initiale)
  • placeholder est une fonction, Variable est une classe (d'où une majuscule)
  • lorsque vous utilisez TF dans un environnement distribué, les variables sont stockées dans un endroit spécial (serveur de paramètres) et sont partagées entre les travailleurs.

La partie intéressante est que non seulement les placeholders peuvent être alimentés. Vous pouvez fournir une valeur à une Variable et même à une constante.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X