PyTorch es un marco de aprendizaje automático basado en la biblioteca Torch , [4] [5] [6] utilizado para aplicaciones como visión por computadora y procesamiento de lenguaje natural , [7] desarrollado originalmente por Meta AI y ahora parte de la Fundación Linux . [8] [9] [10] [11] Es reconocida como una de las dos bibliotecas de aprendizaje automático más populares junto con TensorFlow , y ofrece software gratuito y de código abierto publicado bajo la licencia BSD modificada . Aunque la interfaz de Python está más pulida y es el foco principal del desarrollo, PyTorch también tiene una interfaz de C++ . [12]
Varias piezas de software de aprendizaje profundo se construyen sobre PyTorch, incluido Tesla Autopilot , [13] Uber 's Pyro, [14] Hugging Face's Transformers, [15] PyTorch Lightning , [16] [17] y Catalyst. [18] [19]
PyTorch proporciona dos características de alto nivel: [20]
Meta (anteriormente conocido como Facebook) opera tanto PyTorch como la arquitectura convolucional para la incrustación rápida de funciones ( Caffe2 ), pero los modelos definidos por los dos marcos eran mutuamente incompatibles. El proyecto Open Neural Network Exchange ( ONNX ) fue creado por Meta y Microsoft en septiembre de 2017 para convertir modelos entre marcos. Caffe2 se fusionó con PyTorch a finales de marzo de 2018. [21] En septiembre de 2022, Meta anunció que PyTorch estaría gobernado por la Fundación PyTorch, una organización independiente de nueva creación, una subsidiaria de la Fundación Linux . [22]
PyTorch 2.0 se lanzó el 15 de marzo de 2023. [23]
PyTorch define una clase llamada Tensor ( torch.Tensor
) para almacenar y operar en matrices de números rectangulares multidimensionales homogéneas. Los tensores PyTorch son similares a los NumPy Arrays, pero también pueden funcionar en una GPU NVIDIA compatible con CUDA . PyTorch también ha estado desarrollando soporte para otras plataformas GPU, por ejemplo, ROCm de AMD y Metal Framework de Apple . [24]
PyTorch admite varios subtipos de tensores. [25]
Un tensor en física es similar a un tensor de PyTorch, en el sentido de que es principalmente una matriz multidimensional. La única característica adicional del tensor de un físico que falta en un tensor de PyTorch es que al indexar sus entradas, algunos de los índices se escriben en subíndice o superíndice, como . El número de superíndices y subíndices en un tensor físico se denomina tipo de tensor. Debería ser fácil entender que el tipo del tensor anterior es (2,3). Un índice en superíndice se denomina índice contravariante y un índice en subíndice se denomina índice covariante . El tensor de un físico admite cuatro operaciones fundamentales:
De estos, la distinción de co/contravarianza sólo afecta a la operación de cambio de base. Las otras tres operaciones no se ven afectadas por la co/contravarianza y, por lo tanto, son fáciles de implementar para los tensores de PyTorch. Por lo tanto, si un "tensor" de PyTorch merece ser llamado tensor es una cuestión de opinión.
El tensor de un matemático también es sutilmente diferente del tensor de un físico, pero la diferencia es tan pequeña que no tiene ningún efecto en las aplicaciones. En aras de la exhaustividad, para un matemático, un tensor de tipo (m,n) sobre un espacio vectorial es un elemento del espacio vectorial . Las primeras tres de las cuatro operaciones anteriores se pueden expresar de forma independiente de la base, haciendo innecesaria la cuarta. El tensor de un físico resulta entonces de elegir una base para , lo que convierte el tensor de un matemático en una matriz multidimensional. Dado que la elección de la base fue arbitraria , necesitamos una operación de cambio de base para eliminar esta arbitrariedad, que termina siendo nuestra operación 4.
PyTorch define una clase llamada nn ( torch.nn
) para describir redes neuronales y respaldar el entrenamiento. Este módulo ofrece una colección completa de bloques de construcción para redes neuronales, incluidas varias capas y funciones de activación, que permiten la construcción de modelos complejos.
El siguiente programa muestra la funcionalidad de bajo nivel de la biblioteca con un ejemplo simple.
importar antorchatipo d = antorcha . flotardispositivo = antorcha . dispositivo ( "cpu" ) # Esto ejecuta todos los cálculos en la CPU# dispositivo = torch.device("cuda:0") # Esto ejecuta todos los cálculos en la GPU# Creación de un tensor y llenado de un tensor con números aleatoriosa = antorcha . randn ( 2 , 3 , dispositivo = dispositivo , dtipo = dtipo )print ( a ) # Salida del tensor A# Salida: tensor([[-1.1884, 0.8498, -1.7129],# [-0,8816, 0,1944, 0,5847]])# Creación de un tensor y llenado de un tensor con números aleatoriosb = antorcha . randn ( 2 , 3 , dispositivo = dispositivo , dtipo = dtipo )print ( b ) # Salida del tensor B# Salida: tensor([[ 0.7178, -0.8453, -1.3403],# [1,3262, 1,1512, -1,7070]])print ( a * b ) # Salida de una multiplicación de los dos tensores# Salida: tensor([[-0.8530, -0.7183, 2.58],# [-1,1692, 0,2238, -0,9981]])print ( a . sum ()) # Salida de la suma de todos los elementos en el tensor A# Salida: tensor (-2.1540)print ( a [ 1 , 2 ]) # Salida del elemento en la tercera columna de la segunda fila (basada en cero)# Salida: tensor (0,5847)print ( a . max ()) # Salida del valor máximo en el tensor A# Salida: tensor (0.8498)
El siguiente bloque de código muestra un ejemplo de la funcionalidad de nivel superior proporcionada por el nn
módulo. En el ejemplo se define una red neuronal con capas lineales.
importar antorchafrom torch import nn # Importa el submódulo nn de PyTorchclase NeuralNetwork ( nn . Módulo ): # Las redes neuronales se definen como clases def __init__ ( self ): # Las capas y variables se definen en el método __init__ super ( NeuralNetwork , self ) . __init__ () # Debe estar en todas las redes. ser . aplanar = nn . Aplanar () # Definir una capa de aplanamiento. ser . linear_relu_stack = nn . Secuencial ( # Definiendo una pila de capas. nn . Lineal ( 28 * 28 , 512 ), # Las capas lineales tienen una forma de entrada y salida nn . ReLU (), # ReLU es una de las muchas funciones de activación proporcionadas por nn nn . Lineal ( 512 , 512 ), nn . ReLU (), nn . Lineal ( 512 , 10 ), ) def forward ( self , x ): # Esta función define el pase hacia adelante. x = yo . aplanar ( x ) logits = yo . pila_relu_lineal ( x ) logits de retorno
FAIR está acostumbrado a trabajar con PyTorch, un marco de aprendizaje profundo optimizado para lograr resultados de vanguardia en investigación, independientemente de las limitaciones de recursos.
Desafortunadamente, en el mundo real, la mayoría de nosotros estamos limitados por las capacidades computacionales de nuestros teléfonos inteligentes y computadoras.