Diferencia de implementación entre TensorFlow Variable y TensorFlow Tensor
(1)
En primer lugar, soy consciente de que here se ha formulado una pregunta relacionada.
Sin embargo, esta pregunta es sobre la implementación y los aspectos internos. Estaba leyendo el periódico " A Tour of TensorFlow ". Los siguientes dos puntos se citan desde allí:
1.
Un tensor en sí no guarda ni almacena valores en la memoria, sino que proporciona solo una interfaz para recuperar el valor referenciado por el tensor.
Esto me sugiere que un Tensor es un objeto que simplemente almacena el puntero a un resultado de una operación y, al recuperar el resultado o valor del tensor, simplemente hace referencia a ese puntero.
2.
Las variables se pueden describir como mangos persistentes y mutables a los búferes en memoria que almacenan los tensores. Como tales, las variables se caracterizan por una cierta forma y un tipo fijo.
Ante esto, me confundo porque pensé, según el punto anterior, que los tensores simplemente almacenan un puntero. Si fueran simplemente punteros, también podrían ser mutables.
Para ser precisos estas son mis preguntas:
- ¿Cuál es el significado de "buffers en memoria"?
- ¿Cuál es el significado de un "mango"?
- ¿Mi suposición inicial sobre los aspectos internos de un tensor es correcta?
- ¿Cuál es la diferencia de implementación interna esencial entre un tensor y una variable? ¿Por qué se declaran de manera diferente y por qué esa diferencia es esencial para TensorFlow?
Antes de explicar la distinción entre tensores y variables, debemos ser precisos acerca de lo que significa la palabra "tensor" en el contexto de TensorFlow:
En la API de Python , un objeto
tf.Tensor
representa el resultado simbólico de una operación TensorFlow. Por ejemplo, en la expresiónt = tf.matmul(x, y)
,t
es un objetotf.Tensor
que representa el resultado de multiplicarx
ey
(que pueden ser en sí mismos resultados simbólicos de otras operaciones, valores concretos tales como matrices NumPy, o variables).En este contexto, un "resultado simbólico" es más complicado que un puntero al resultado de una operación. Es más análogo a un objeto de función que, cuando se
tf.Session.run()
(es decir, se pasa atf.Session.run()
) ejecutará el cálculo necesario para producir el resultado de esa operación y se lo devolverá a usted como un valor concreto (por ejemplo, un NumPy formación).En la API de C ++ , un objeto
tensorflow::Tensor
representa el valor concreto de una matriz multidimensional. Por ejemplo, el núcleo deMatMul
toma como entrada dos objetostensorflow::Tensor
bidimensionales, y produce un único objetotensorflow::Tensor
bidimensional como su salida.
Esta distinción es un poco confusa, y podríamos elegir nombres diferentes si volvemos a empezar (en las API de otro idioma, preferimos el nombre Output
para un resultado simbólico y Tensor
para un valor concreto).
Una distinción similar existe para las variables. En la API de Python, una tf.Variable
es la representación simbólica de una variable, que tiene métodos para crear operaciones que leen el valor actual de la variable y le asignan valores. En la implementación de C ++, un objeto tensorflow::Var
es un envoltorio alrededor de un objeto tensorflow::Tensor
compartido y mutable.
Con ese contexto fuera del camino, podemos abordar sus preguntas específicas:
¿Cuál es el significado de "buffers en memoria"?
Un búfer en memoria es simplemente una región contigua de memoria que se ha asignado con un asignador TensorFlow.
tensorflow::Tensor
objetostensorflow::Tensor
contienen un puntero a un búfer en memoria, que contiene los valores de ese tensor. El búfer podría estar en la memoria del host (es decir, accesible desde la CPU) o en la memoria del dispositivo (por ejemplo, accesible solo desde una GPU), y TensorFlow tiene operaciones para mover datos entre estos espacios de memoria.¿Cuál es el significado de un "mango"?
En la explicación del artículo , la palabra "manejar" se usa de dos maneras diferentes, que son ligeramente diferentes de cómo TensorFlow usa el término. El papel utiliza el "identificador simbólico" para referirse a un objeto
tf.Tensor
, y el "identificador persistente y mutable" para referirse a un objetotf.Variable
. La base de código de TensorFlow utiliza el "identificador" para referirse a un nombre para un objeto con estado (comotf.FIFOQueue
otf.TensorArray
) que se puede pasar sin copiar todos los valores (es decir, call-by-reference ).¿Mi suposición inicial sobre lo interno de un tensor es correcta?
Su suposición coincide más estrechamente con la definición de un objeto
tensorflow::Tensor
(C ++). El objeto (Python)tf.Tensor
es más complicado porque se refiere a una función para calcular un valor, en lugar del valor en sí.¿Cuál es la diferencia de implementación interna esencial entre un tensor y una variable?
En C ++, un
tensorflow::Tensor
ytensorflow::Var
son muy similares; la única diferencia es quetensorflow::Var
también tiene unmutex
que se puede usar para bloquear la variable cuando se está actualizando.En Python, la diferencia esencial es que un
tf.Tensor
se implementa como un gráfico de flujo de datos y es de solo lectura (es decir, llamando atf.Session.run()
). Unatf.Variable
puede ser leída (es decir, evaluando su operación de lectura) y escrita (ej. Ejecutando una operación de asignación).¿Por qué se declaran de manera diferente y por qué esa diferencia es esencial para TensorFlow?
Tensores y variables sirven para diferentes propósitos. Los tensores (
tf.Tensor
objetos) pueden representar composiciones complejas de expresiones matemáticas, como funciones de pérdida en una red neuronal, o gradientes simbólicos. Las variables representan el estado que se actualiza a lo largo del tiempo, como matrices de peso y filtros convolucionales durante el entrenamiento. Si bien en principio podría representar el estado evolutivo de un modelo sin variables, terminaría con una expresión matemática muy grande (y repetitiva), por lo que las variables proporcionan una manera conveniente de materializar el estado del modelo y, por ejemplo, compartir Con otras máquinas para entrenamiento paralelo.