Soy un novato en TensorFlow. Estoy confundido acerca de la diferencia entre tf.placeholder
y tf.Variable
. En mi opinión, tf.placeholder
se usa para datos de entrada y tf.Variable
para almacenar el estado de los datos. Esto es todo lo que sé.
¿Podría alguien explicarme más detalladamente sobre sus diferencias? En particular, ¿cuándo usar tf.Variable
y cuándo usar tf.placeholder
?
tensorflow
J.Doe
fuente
fuente
Variable
s, pero noplaceholder
s (cuyos valores siempre deben proporcionarse).Respuestas:
En resumen, utiliza
tf.Variable
para variables entrenables como pesos (W) y sesgos (B) para su modelo.tf.placeholder
se utiliza para alimentar ejemplos de entrenamiento reales.Así es como alimentas los ejemplos de entrenamiento durante el entrenamiento:
Serás
tf.variables
entrenado (modificado) como resultado de este entrenamiento.Ver más en https://www.tensorflow.org/versions/r0.7/tutorials/mnist/tf/index.html . (Se toman ejemplos de la página web).
fuente
tensorflow
edeep learning
yAI
son.La diferencia es que con
tf.Variable
usted debe proporcionar un valor inicial cuando lo declara. Contf.placeholder
usted no tiene que proporcionar un valor inicial y puede especificarlo en tiempo de ejecución con elfeed_dict
argumento dentroSession.run
fuente
Dado que los cálculos de Tensor se componen de gráficos, entonces es mejor interpretar los dos en términos de gráficos.
Tomemos por ejemplo la regresión lineal simple
dónde
W
yB
representar los pesos y el sesgo yX
las entradasY
de las observaciones y las salidas de las observaciones.Obviamente
X
yY
son de la misma naturaleza (variables manifiestas) que difieren de la deW
yB
(variables latentes).X
yY
son valores de las muestras (observaciones) y, por lo tanto, necesitan un lugar para ser llenado , mientras queW
yB
son los pesos y el sesgo, las variables (los valores anteriores afectan a las últimas) en el gráfico que deben entrenarse utilizando diferentesX
yY
pares. Colocamos diferentes muestras a los Marcadores de posición para entrenar las Variables .Solo necesitamos guardar o restaurar las Variables (en los puntos de control) para guardar o reconstruir el gráfico con el código.
Los marcadores de posición son en su mayoría titulares de los diferentes conjuntos de datos (por ejemplo, datos de capacitación o datos de prueba). Sin embargo, las variables se entrenan en el proceso de capacitación para las tareas específicas, es decir, para predecir el resultado de la entrada o asignar las entradas a las etiquetas deseadas. Siguen siendo los mismos hasta que vuelva a entrenar o ajustar el modelo utilizando muestras diferentes o iguales para rellenar los Marcadores de posición a menudo a través del dict. Por ejemplo:
Los marcadores de posición también se pasan como parámetros para establecer modelos.
Si cambia los marcadores de posición (agregar, eliminar, cambiar la forma, etc.) de un modelo en medio del entrenamiento, aún puede volver a cargar el punto de control sin ninguna otra modificación. Pero si se cambian las variables de un modelo guardado, debe ajustar el punto de control en consecuencia para volver a cargarlo y continuar el entrenamiento (todas las variables definidas en el gráfico deben estar disponibles en el punto de control).
En resumen, si los valores provienen de las muestras (observaciones que ya tiene), puede hacer un marcador de posición para mantenerlos, mientras que si necesita un parámetro para entrenar, aproveche una Variable (simplemente, establezca las Variables para los valores que desea para usar TF automáticamente).
En algunos modelos interesantes, como un modelo de transferencia de estilo , los pixeles de entrada se optimizarán y las variables del modelo normalmente llamadas son fijas, entonces deberíamos hacer que la entrada (generalmente inicializada al azar) sea una variable tal como se implementa en ese enlace.
Para obtener más información, infiera a este documento simple e ilustrativo .
fuente
TL; DR
Variables
Marcadores de posición
tf.placeholder_with_default
)fuente
La diferencia más obvia entre el tf. Variable y el tf.placeholder es que
La inicialización de las variables se realiza con
sess.run(tf.global_variables_initializer())
. Además, al crear una variable, debe pasar un Tensor como su valor inicial alVariable()
constructor y cuando crea una variable siempre conoce su forma.Por otro lado, no puede actualizar el marcador de posición. Tampoco deben inicializarse, pero debido a que son una promesa de tener un tensor, es necesario introducir el valor en ellos.
sess.run(<op>, {a: <some_val>})
. Y, por último, en comparación con una variable, el marcador de posición podría no conocer la forma. Puede proporcionar partes de las dimensiones o no proporcionar nada en absoluto.Hay otras diferencias:
Lo interesante es que no solo se pueden alimentar los marcadores de posición. Puede alimentar el valor a una variable e incluso a una constante.
fuente
Además de las respuestas de otros, también lo explican muy bien en este tutorial de MNIST en el sitio web de Tensoflow:
fuente
x
forma[batch size, features]
, tenemos los pesos que van desde la entrada hasta la primera capa de tamaño[features, hidden units]
y los sesgos[hidden units]
. Entonces mi pregunta es: ¿cómo los multiplicamos? Si lo hacemos,tf.matmul(x, w)
entonces vamos a llegar[batch size, hidden units]
y no podemosb
hacerlo, ya que tiene forma[hidden units]
Tensorflow utiliza tres tipos de contenedores para almacenar / ejecutar el proceso.
Constantes: las constantes contienen los datos típicos.
variables: los valores de los datos se cambiarán, con las funciones respectivas, como cost_function.
marcadores de posición: los datos de capacitación / prueba se pasarán al gráfico.
fuente
Fragmento de ejemplo:
Como su nombre lo indica, el marcador de posición es una promesa de proporcionar un valor más adelante, es decir
Las variables son simplemente los parámetros de entrenamiento (
W
(matriz),b
(sesgo) iguales a las variables normales que usa en su programación diaria, que el entrenador actualiza / modifica en cada carrera / paso.Si bien el marcador de posición no requiere ningún valor inicial, cuando creó
x
yy
TF no asignó ninguna memoria, en su lugar más tarde cuando alimente los marcadores de posición en elsess.run()
usofeed_dict
, TensorFlow asignará la memoria del tamaño adecuado para ellos (x
yy
), esto sin restricciones. Ness nos permite alimentar cualquier tamaño y forma de datos.En pocas palabras :
Variable : es un parámetro que desea que el entrenador (es decir, GradientDescentOptimizer) actualice después de cada paso.
Demo de marcador de posición -
Ejecución:
resultando en la salida
En el primer caso, 3 y 4.5 se pasarán a
a
yb
respectivamente, y luego a adder_node ouputting 7. En el segundo caso hay una lista de fuentes, se agregarán los primeros pasos 1 y 2, luego los 3 y 4 (a
yb
).Lecturas relevantes:
fuente
Variables
Una variable TensorFlow es la mejor manera de representar el estado compartido persistente manipulado por su programa. Las variables se manipulan a través de la clase tf.Variable. Internamente, un tf.Variable almacena un tensor persistente. Las operaciones específicas le permiten leer y modificar los valores de este tensor. Estas modificaciones son visibles en varias sesiones de tf, por lo que varios trabajadores pueden ver los mismos valores para una tf.Variable. Las variables deben inicializarse antes de usar.
Ejemplo:
Esto crea un gráfico de cálculo. Las variables (x e y) se pueden inicializar y evaluar la función (f) en una sesión de tensorflow de la siguiente manera:
Marcadores de posición
Un marcador de posición es un nodo (igual que una variable) cuyo valor se puede inicializar en el futuro. Estos nodos básicamente generan el valor asignado a ellos durante el tiempo de ejecución. Se puede asignar un nodo de marcador de posición utilizando la clase tf.placeholder () a la que puede proporcionar argumentos como el tipo de la variable y / o su forma. Los marcadores de posición se utilizan ampliamente para representar el conjunto de datos de entrenamiento en un modelo de aprendizaje automático a medida que el conjunto de datos de entrenamiento cambia constantemente.
Ejemplo:
Nota: 'Ninguno' para una dimensión significa 'cualquier tamaño'.
Referencias
fuente
Piense en
Variable
in tensorflow como variables normales que usamos en lenguajes de programación. Inicializamos variables, también podemos modificarlo más tarde. Mientrasplaceholder
que no requiere valor inicial. El marcador de posición simplemente asigna un bloque de memoria para uso futuro. Más tarde, podemos usarfeed_dict
para alimentar los datosplaceholder
. De forma predeterminada,placeholder
tiene una forma sin restricciones, que le permite alimentar tensores de diferentes formas en una sesión. Puede hacer una forma restringida pasando el argumento opcional -shape, como he hecho a continuación.Mientras realizamos la tarea de Aprendizaje automático, la mayoría de las veces desconocemos la cantidad de filas, pero (supongamos) sabemos la cantidad de características o columnas. En ese caso, podemos usar Ninguno.
Ahora, en tiempo de ejecución, podemos alimentar cualquier matriz con 4 columnas y cualquier número de filas.
Además, los marcadores de posición se utilizan para los datos de entrada (son un tipo de variables que utilizamos para alimentar nuestro modelo), donde las variables son parámetros tales como los pesos que entrenamos con el tiempo.
fuente
Marcador de posición:
Un marcador de posición es simplemente una variable a la que asignaremos datos en una fecha posterior. Nos permite crear nuestras operaciones y construir nuestro gráfico de cálculo, sin necesidad de los datos. En la terminología de TensorFlow, luego introducimos datos en el gráfico a través de estos marcadores de posición.
Los valores iniciales no son obligatorios, pero pueden tener valores predeterminados con
tf.placeholder_with_default)
Tenemos que proporcionar valor en tiempo de ejecución como:
Variable :
Ejemplo:
tf.Variable("Welcome to tensorflow!!!")
fuente
Respuesta compatible con Tensorflow 2.0 : El concepto de Marcadores de posición
tf.placeholder
no estará disponibleTensorflow 2.x (>= 2.0)
de forma predeterminada, ya que el Modo de ejecución predeterminado es Ejecución ansiosa.Sin embargo, podemos usarlos si se usan en
Graph Mode
(Disable Eager Execution
).El comando equivalente para TF Placeholder en la versión 2.x es
tf.compat.v1.placeholder
.El comando equivalente para la variable TF en la versión 2.x es
tf.Variable
y si desea migrar el código de 1.xa 2.x, el comando equivalente estf.compat.v2.Variable
.Consulte esta página de Tensorflow para obtener más información sobre Tensorflow Versión 2.0.
Consulte la Guía de migración para obtener más información sobre la migración de las versiones 1.xa 2.x.
fuente
Piensa en un gráfico de cálculo . En dicho gráfico, necesitamos un nodo de entrada para pasar nuestros datos al gráfico, esos nodos deben definirse como Placeholder en el tensorflow .
No pienses como un programa general en Python. Puede escribir un programa Python y hacer todas esas cosas que los chicos explicaron en otras respuestas solo con Variables, pero para los gráficos de cálculo en tensorflow, para alimentar sus datos al gráfico, debe definir esos guiños como Marcadores de posición.
fuente