Je suis un débutant à TensorFlow. Je suis confus quant à 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.
Quelqu'un pourrait-il m'expliquer plus en détail leurs différences? En particulier, quand utiliser tf.Variable
et quand utiliser tf.placeholder
?
tensorflow
J.Doe
la source
la source
Variable
s, mais pas àplaceholder
s (dont les valeurs doivent toujours être fournies).Réponses:
En bref, vous utilisez
tf.Variable
pour des variables entraînables telles que les poids (W) et les biais (B) pour votre modèle.tf.placeholder
est utilisé pour alimenter des exemples de formation réels.Voici comment vous alimentez les exemples de formation pendant la formation:
Votre
tf.variables
sera formé (modifié) à la suite de cette formation.Voir plus sur https://www.tensorflow.org/versions/r0.7/tutorials/mnist/tf/index.html . (Des exemples sont tirés de la page Web.)
la source
tensorflow
etdeep learning
etAI
sont.La différence est que
tf.Variable
vous devez fournir une valeur initiale lorsque vous la déclarez. Avectf.placeholder
vous n'avez pas à fournir une valeur initiale et vous pouvez la spécifier au moment de l'exécution avec l'feed_dict
argument à l'intérieurSession.run
la source
Étant donné que les calculs Tensor se composent de graphiques, il est préférable d'interpréter les deux en termes de graphiques.
Prenons par exemple la régression linéaire simple
où
W
etB
pour les poids et biais etX
pour les entrées des observations etY
pour les sorties des observations.Evidemment
X
etY
sont de même nature (variables manifestes) qui diffèrent de celle deW
etB
(variables latentes).X
etY
sont des valeurs des échantillons (observations) et ont donc besoin d'une place à remplir , tandis queW
etB
sont les poids et les biais, les variables (les valeurs précédentes affectent ces dernières) dans le graphique qui doivent être entraînées à l'aide de différentsX
et deY
paires. Nous plaçons différents échantillons dans les espaces réservés pour former les variables .Nous avons seulement besoin d' enregistrer ou de restaurer les variables (aux points de contrôle) pour enregistrer ou reconstruire le graphique avec le code.
Les espaces réservés sont principalement des détenteurs pour les différents ensembles de données (par exemple des données de formation ou des données de test). Cependant, les variables sont formées au processus de formation 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. Ils restent les mêmes jusqu'à ce que vous réentraîniez ou affiniez le modèle en utilisant des échantillons différents ou identiques à remplir dans les espaces réservés souvent via le dict. Par exemple:
Les espaces réservés sont également passés en tant que paramètres pour définir des modèles.
Si vous modifiez des espaces réservés (ajoutez, supprimez, modifiez la forme, etc.) d'un modèle au milieu de la formation, vous pouvez toujours recharger le point de contrôle sans aucune autre modification. 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 la formation (toutes les variables définies dans le graphique doivent être disponibles dans le point de contrôle).
Pour résumer, si les valeurs proviennent des échantillons (observations que vous avez déjà), vous créez en toute sécurité un espace réservé pour les conserver, tandis que si vous avez besoin d'un paramètre pour être formé, exploitez une variable (mettez simplement, définissez les variables pour les valeurs que vous voulez pour utiliser TF automatiquement).
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 de modèle normalement appelées sont fixes, alors nous devrions faire de l'entrée (généralement initialisée au hasard) en tant que variable implémentée dans ce lien.
Pour plus d'informations, veuillez vous référer à ce document simple et illustrant .
la source
TL; DR
Variables
Espaces réservés
tf.placeholder_with_default
)la source
La différence la plus évidente entre le tf.Variable et le tf.placeholder est que
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 transmettre un tenseur comme valeur initiale auVariable()
constructeur et lorsque vous créez une variable, vous connaissez toujours sa forme.En revanche, vous ne pouvez pas mettre à jour l'espace réservé. Ils ne doivent pas non plus être initialisés, mais comme ils sont une promesse d'avoir un tenseur, vous devez leur fournir la valeur
sess.run(<op>, {a: <some_val>})
. Et enfin, par rapport à une variable, l'espace réservé peut ne pas connaître la forme. Vous pouvez soit fournir des parties des dimensions, soit ne rien fournir du tout.Il y a d'autres différences:
La partie intéressante est que non seulement les espaces réservés peuvent être alimentés. Vous pouvez fournir la valeur à une variable et même à une constante.
la source
Ajoutant aux réponses des autres, ils l'expliquent également très bien dans ce tutoriel MNIST sur le site Web de Tensoflow:
la source
x
avec la forme[batch size, features]
, nous avons les poids allant de l'entrée à la première couche de taille[features, hidden units]
et les biais[hidden units]
. Ma question est donc: comment les multiplier ensemble? Si nous le faisons,tf.matmul(x, w)
nous allons y arriver[batch size, hidden units]
et nous ne pouvons pas leb
faire, car il a une forme[hidden units]
Tensorflow utilise trois types de conteneurs pour stocker / exécuter le processus
Constantes: les constantes contiennent les données typiques.
variables: Les valeurs des données seront modifiées, avec respectivement les fonctions telles que cost_function ..
espaces réservés: les données de formation / test seront transmises au graphique.
la source
Exemple d'extrait:
Comme son nom l'indique, l'espace réservé est une promesse de fournir une valeur plus tard, c'est-à-dire
Les variables sont simplement les paramètres d'entraînement (
W
(matrice),b
(biais) identiques aux variables normales que vous utilisez dans votre programmation quotidienne, que le formateur met à jour / modifie à chaque exécution / étape.Bien que l' espace réservé ne nécessite aucune valeur initiale, que lorsque vous avez créé
x
et quey
TF n'alloue pas de mémoire, au lieu de cela plus tard lorsque vous alimentez les espaces réservés à l'sess.run()
aidefeed_dict
, TensorFlow leur allouera la mémoire de taille appropriée (x
ety
) - ceci sans contrainte - ness nous permet d'alimenter n'importe quelle taille et forme de données.En bref :
Variable - est un paramètre que le formateur (ie GradientDescentOptimizer) doit mettre à jour après chaque étape.
Démo de l' espace réservé -
Exécution:
résultant en la sortie
Dans le premier cas, 3 et 4.5 seront transmis à
a
etb
respectivement, puis à adder_node ouputting 7. Dans le second cas, il y a une liste de flux, les premières étapes 1 et 2 seront ajoutées, les 3 et 4 suivants (a
etb
).Lectures pertinentes:
la source
Variables
Une variable TensorFlow est le meilleur moyen de représenter un état partagé et persistant manipulé par votre programme. Les variables sont manipulées via la classe tf.Variable. En interne, une tf.Variable stocke un tenseur persistant. Des opérations spécifiques vous permettent de lire et de modifier les valeurs de ce tenseur. Ces modifications sont visibles sur plusieurs tf.Sessions, de sorte que plusieurs travailleurs peuvent voir les mêmes valeurs pour un tf.Variable. Les variables doivent être initialisées avant d'être utilisées.
Exemple:
Cela crée un graphique de calcul. Les variables (x et y) peuvent être initialisées et la fonction (f) évaluée dans une session tensorflow comme suit:
Espaces réservés
Un espace réservé est un nœud (identique à une variable) dont la valeur peut être initialisée à l'avenir. Ces nœuds génèrent essentiellement la valeur qui leur est affectée lors de l'exécution. Un nœud d'espace réservé peut être attribué à l'aide de la classe tf.placeholder () à laquelle vous pouvez fournir des arguments tels que le type de la variable et / ou sa forme. Les espaces réservés sont largement utilisés pour représenter l'ensemble de données d'apprentissage dans un modèle d'apprentissage automatique, car l'ensemble de données d'apprentissage continue de changer.
Exemple:
Remarque: «Aucun» pour une dimension signifie «n'importe quelle taille».
Références:
la source
Considérez
Variable
dans tensorflow comme des variables normales que nous utilisons dans les langages de programmation. Nous initialisons des variables, nous pouvons également les modifier plus tard. Alors queplaceholder
ne nécessite pas de valeur initiale. L'espace réservé alloue simplement un bloc de mémoire pour une utilisation future. Plus tard, nous pouvons utiliserfeed_dict
pour alimenter les donnéesplaceholder
. Par défaut,placeholder
a une forme sans contrainte, ce qui vous permet d'alimenter des tenseurs de formes différentes dans une session. Vous pouvez créer une forme contrainte en passant l'argument optionnel -shape, comme je l'ai fait ci-dessous.Lors de la tâche d'apprentissage automatique, la plupart du temps, nous ne connaissons pas le nombre de lignes, mais (supposons), nous connaissons le nombre de fonctionnalités ou de colonnes. Dans ce cas, nous pouvons utiliser None.
Maintenant, au moment de l'exécution, nous pouvons alimenter n'importe quelle matrice avec 4 colonnes et n'importe quel nombre de lignes.
En outre, les espaces réservés sont utilisés pour les données d'entrée (ce sont des types de variables que nous utilisons pour alimenter notre modèle), où les variables sont des paramètres tels que les poids que nous entraînons au fil du temps.
la source
Espace réservé:
Un espace réservé est simplement une variable à laquelle nous assignerons des données à une date ultérieure. Il nous permet de créer nos opérations et de construire notre graphe de calcul, sans avoir besoin des données. Dans la terminologie TensorFlow, nous introduisons ensuite des données dans le graphique via ces espaces réservés.
Les valeurs initiales ne sont pas obligatoires mais peuvent avoir des valeurs par défaut avec
tf.placeholder_with_default)
Nous devons fournir de la valeur lors de l'exécution comme:
Variable:
Exemple :
tf.Variable("Welcome to tensorflow!!!")
la source
Réponse compatible avec Tensorflow 2.0 : Le concept d' espaces réservés
tf.placeholder
ne sera pas disponibleTensorflow 2.x (>= 2.0)
par défaut, car le mode d'exécution par défaut est Exécution désirée.Cependant, nous pouvons les utiliser s'ils sont utilisés dans
Graph Mode
(Disable Eager Execution
).La commande équivalente pour TF Placeholder dans la version 2.x est
tf.compat.v1.placeholder
.La commande équivalente pour la variable TF dans la version 2.x est
tf.Variable
et si vous souhaitez migrer le code de 1.x vers 2.x, la commande équivalente esttf.compat.v2.Variable
.Veuillez consulter cette page Tensorflow pour plus d'informations sur Tensorflow version 2.0.
Veuillez consulter le Guide de migration pour plus d'informations sur la migration des versions 1.x à 2.x.
la source
Pensez à un graphique de calcul . Dans un tel graphique, nous avons besoin d'un nœud d'entrée pour transmettre nos données au graphique, ces nœuds doivent être définis comme espace réservé dans tensorflow .
Ne pensez pas comme un programme général en Python. Vous pouvez écrire un programme Python et faire toutes ces choses que les gars ont expliquées dans d'autres réponses uniquement par des variables, mais pour les graphiques de calcul dans tensorflow, pour alimenter vos données en graphique, vous devez définir ces hochements de tête comme espaces réservés.
la source