tensorflow

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:

  1. ¿Cuál es el significado de "buffers en memoria"?
  2. ¿Cuál es el significado de un "mango"?
  3. ¿Mi suposición inicial sobre los aspectos internos de un tensor es correcta?
  4. ¿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ón t = tf.matmul(x, y) , t es un objeto tf.Tensor que representa el resultado de multiplicar x e y (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 a tf.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 de MatMul toma como entrada dos objetos tensorflow::Tensor bidimensionales, y produce un único objeto tensorflow::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:

  1. ¿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 objetos tensorflow::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.

  2. ¿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 objeto tf.Variable . La base de código de TensorFlow utiliza el "identificador" para referirse a un nombre para un objeto con estado (como tf.FIFOQueue o tf.TensorArray ) que se puede pasar sin copiar todos los valores (es decir, call-by-reference ).

  3. ¿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í.

  4. ¿Cuál es la diferencia de implementación interna esencial entre un tensor y una variable?

    En C ++, un tensorflow::Tensor y tensorflow::Var son muy similares; la única diferencia es que tensorflow::Var también tiene un mutex 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 a tf.Session.run() ). Una tf.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.