# Torch

Torch es una biblioteca de código abierto para aprendizaje automático, un marco de computación científica, y un lenguaje de script basado en el lenguaje de programación Lua. Proporciona una amplia gama de algoritmos de aprendizaje profundo, y usa el lenguaje de script LuaJIT, sobre una implementación en C.
Torch se ha dejado de desarrollar en 2017, en favor de otras plataformas. La comunidad de soporte de la última versión estable cerró definitivamente en 2019. Sin embargo Torch se sigue usando para proyectos terminados, e incluso en desarrollos a través de PyTorch.

## torch

El paquete central de Torch es torch. Provee un arreglo flexible N-dimensional o Tensor, el cual soporta rutinas básicas de indexado, recorte, transposición, revisión de tipos, redimensionamiento, almacenamiento compartido y clonación. Este objeto es usado por la mayoría de los otros paquetes y por lo tanto forma el objento central de la biblioteca. El Tensor también soporta operaciones matemáticas como max, min, sum, distribuciones estadísticas como uniforme continua, normal y multinomial, y operaciones BLAS como multiplicación de matrices.
El siguiente ejemplo usa torch vía su intérprete REPL:
El paquete torch también simplifica la programación orientada a objetos y serialización al proveer varias funciones conveniente que son usadas a través de sus paquetes. La función torch.class(classname, parentclass) puede ser usada para crear un patrón de diseño (clases). Cuando el constructor es llamado, torch inicializa y una tabla de Lua con la metatabla definida por el usuario, lo cual hace a la tabla un objeto.
Los objetos creados con el patrón de torch también puedens er serializados, mientras no contenga referencias a objetos que no puedan ser serializados, tales como Coroutine de Lua y userdata de Lua. Como sea, userdata puede ser serializado si es envuelto por una tabla (o metatabla) que provea los métodos read y write.

## nn

El paquete nn es usado para construir redes neuronales. Está dividido en objetos modulares que comparten una interfaz Module común. Los módulos tienen métodos forward y backward que les permiten prealimentar y retroalimentar, respectivamente. Los módulos pueden ser unidos usando composición de módulos, como Sequential, Parallel y Concat para crear gráficas complejas a la medida de las tareas. Módulos más simples como Linear, Tanh y Max complementan los módulos componentes básicos. Esta interfaz modular provee diferenciación automática de primer grado. El siguiente es un ejemplo de caso de uso para construir un perceptrón multicapa usando módulos:
Las funciones de pérdida son implementadas como subclases de Criterion, el cual tiene una interfaz similar a Module. También tiene los métodos forward y backward para calcular la pérdida y gradientes de propagación hacia atrás, respectivamente. El uso de criterios es de ayuda para entrenar redes neuronales en tareas clásicas. Criterios comunes son el error cuadrático medio implementado en MSECriterion y la entropía cruzada implementada en ClassNLLCriterion. El siguiente ejemplo es una función de Lua que puede ser llamada interativamente para entrena un módulo mlp sobre una Tensor de entrada x, Tensor objetivo y con un escalar learningRate:
Tiene también la clase StochasticGradient para entrenar una red neuronal usando gradiente descendente estocástico, aunque el paquete Optim provee muchas más opciones a este respecto, como algumos métodos de regularización.

## Otros paquetes

Muchos paquetes además the los paquetes oficiales antes mencionados son usados con Torch. Estos están listado en torch cheatsheet. Estos paquetes extras proveen una amplia gama de utilidades tales como paralelismo, entrada/salida asíncrona, procesamiento de imagen, etc. Pueden ser instalados con LuaRocks, el administrador de paquetes Lua el cual también está incluido con la distribución de Torch.

## Aplicaciones

Torch es usado por Facebook AI Research Group, IBM,, Yandex y el Instituto de Investigación Idiap. Torch ha sido extendido para su uso en Android e iOS. Ha sido usado para implementaciones construidas en hardware para flujos de datos como aquellos encontrados en redes neuronales.
Facebook ha publicado un conjunto de módulos extensiones como software de código abierto.

## Bibliotecas relacionadas

* Deeplearning4j, una biblioteca código abierto de aprendizaje profundo escrito para Java y Scala
* OpenNN, una biblioteca código abierto para redes neuronales escrito C++ para aprendizaje profundo.
* Theano, una biblioteca código abierto de aprendizaje profundo para Python.
* Keras, una biblioteca código abierto de aprendizaje profundo para Python.
* PyTorch, una biblioteca código abierto de aprendizaje profundo para Python y está relacionada con Torch en términos del código C/C++ subyacente.