python - neural - tensorflow tutorial
buscando el código fuente de gen_nn_ops en tensorflow (3)
Desafortunadamente, el código TensorFlow no es fácil de leer :(
Para hacer las cosas rápido, el código de Python tiene que intercalar el código C ++, que también utiliza dependencias indirectas.
gen_X
funciones gen_X
se generan a partir de su código C ++; para encontrarlo, necesita buscar Conv2dBackpropInput
.
Puede encontrar el registro de la ops/nn_ops.cc del kernel en ops/nn_ops.cc y la implementación concreta en kernels/conv_grad_input_ops.cc .
Soy nuevo en tensorflow para aprendizaje profundo e interesado en la operación de deconvolución (transposición de convolución) en tensorflow. Necesito echar un vistazo al código fuente para operar la desconvolución. La función es, supongo, conv2d_transpose () en nn_ops.py .
Sin embargo, en la función llama a otra función llamada gen_nn_ops.conv2d_backprop_input()
. Necesito ver qué hay dentro de esta función, pero no puedo encontrarla en el repositorio. Cualquier ayuda sería apreciada.
Este es un archivo generado cuando construyes Tensorflow. Después de crear la fuente Tensorflow, debería ver un archivo de enlace simbólico llamado " bazel-genfiles " en el directorio raíz de tensorflow, ir a la ubicación a la que apunta, y luego puede encontrarlo en tensorflow / python / ops / gen_nn_ops.py
No puedes encontrar esta fuente porque la fuente es generada automáticamente por bazel. Si bazel-genfiles
desde la fuente, verás este archivo dentro de bazel-genfiles
. También está presente en su distribución local, que puede encontrar usando el módulo de inspect
. El archivo contiene envoltorios de Python generados automáticamente a implementaciones de C ++ subyacentes, por lo que básicamente consiste en un grupo de funciones de 1 línea. Un atajo para encontrar la implementación subyacente en C ++ de dicha operación Python generada es convertir el caso de serpiente en un caso de camello, es decir, conv2d_backprop_input
-> Conv2dBackpropInput
# figure out where gen_nn_ops is
print(tf.nn.conv2d_transpose.__globals__[''gen_nn_ops''])
from tensorflow.python.ops import gen_nn_ops
import inspect
inspect.getsourcefile(''gen_nn_ops.conv2d_backprop_input'')
''/Users/yaroslav/anaconda/lib/python3.5/site-packages/tensorflow/python/ops/gen_nn_ops.py''
Si le importaba descubrir cómo se originó este archivo, podría seguir el rastro de las dependencias de Bazel en los archivos BUILD
. Para encontrar el objetivo de Bazel que lo generó desde el árbol de origen de tensorflow:
fullname=$(bazel query tensorflow/python/ops/gen_nn_ops.py)
bazel query "attr(''srcs'', $fullname, ${fullname//:*/}:*)"
//tensorflow/python:nn_ops_gen
Entonces, yendo al archivo BUILD
dentro de tensorflow/python
, verá que este es un objetivo del tipo tf_gen_op_wrapper_private_py
que se define here y se llama gen_op_wrapper_py
desde tensorflow/tensorflow.bzl
que tiene este aspecto
def tf_gen_op_wrapper_py(name, out=None, hidden=None, visibility=None, deps=[],
....
native.cc_binary(
name = tool_name,
Esta construcción native.cc_binary
es una forma de tener un objetivo Bazel que representa la ejecución de un comando arbitrario. En este caso, llama a tool_name
con algunos argumentos. Con un par de pasos más, puede encontrar la "herramienta" aquí compilada desde framework/python_op_gen_main.cc
La razón de esta complicación es que TensorFlow fue diseñado para ser agnóstico del lenguaje. Entonces, en el mundo ideal, cada ops.pbtxt describiría en ops.pbtxt , y luego cada ops.pbtxt tendría una implementación por tipo de hardware utilizando REGISTER_KERNEL_BUILDER
, por lo que todas las implementaciones se realizarán en C ++ / CUDA / Assembly y estarán disponibles automáticamente para todos los idiomas. termina Habría una opción de traductor equivalente como "python_op_gen_main" para cada idioma y todo el código de la biblioteca del cliente se generaría automáticamente. Sin embargo, debido a que Python es tan dominante, hubo presión para agregar características en el lado de Python. Así que ahora hay dos tipos de operaciones: las operaciones puras de TensorFlow se ven en archivos como gen_nn_ops.py
, y las operaciones de Python-only en archivos como nn_ops.py
que normalmente envuelven las operaciones, generan automáticamente los archivos gen_nn_ops.py
pero agregan funciones adicionales / azúcar de sintaxis. Además, originalmente todos los nombres eran camel-case, pero se decidió que el lanzamiento público debería ser compatible con PEP con la sintaxis más común de Python, por lo que esta es una razón para la discrepancia entre camel y case-snake case entre las interfaces C ++ / Python de la misma op.