Estás leyendo la publicación: PyTorch vs TensorFlow para construir modelos de aprendizaje profundo
Dos de las bibliotecas de aprendizaje profundo basadas en Python más populares son PyTorch y TensorFlow. Puede ser difícil para un principiante en aprendizaje automático decidir cuál usar cuando trabaja con un modelo de aprendizaje profundo. Es posible que desconozca por completo las distinciones, lo que le imposibilita tomar una decisión informada. Veremos algunas de esas diferencias en la práctica en este artículo creando un clasificador utilizando ambos marcos para la misma resolución de problemas. Finalmente, concluiremos cómo los modelos similares definidos para abordar el mismo problema pero usando diferente infraestructura difieren en los resultados. Los puntos principales que se tratarán en este artículo se enumeran a continuación.
Tabla de contenido
- Acerca de los datos de dígitos MNIST
- Resumen sobre TensorFlow
- Resumen sobre PyTorch
- Construcción de un modelo de aprendizaje profundo para la clasificación de imágenes
- Construcción de modelos con TensorFlow
- Construcción de modelos con PyTorch
- Comparando las actuaciones
Primero analicemos el conjunto de datos MNIST.
Acerca de los datos de dígitos MNIST
El conjunto de datos del Instituto Nacional de Estándares y Tecnología Modificado es un acrónimo del conjunto de datos MNIST. Es una colección de 60.000 imágenes cuadradas pequeñas en escala de grises de dígitos individuales escritos a mano que van del 0 al 9. El objetivo es ordenar una imagen de dígitos escritos a mano en una de diez clases que representan valores enteros que van del 0 al 9, inclusive.
Es un conjunto de datos ampliamente utilizado y bien entendido que ha sido resuelto en su mayor parte. Las redes neuronales convolucionales de aprendizaje profundo son los modelos de mejor rendimiento, con una precisión de clasificación superior al 99 % y una tasa de error de entre el 0,4 % y el 0,2 % en el conjunto de datos de prueba de exclusión. Los ejemplos que se muestran a continuación provienen del conjunto de datos de entrenamiento de dígitos MNIST cargados desde la API del conjunto de datos de Tensorflow.
Resumen sobre TensorFlow
Google desarrolló TensorFlow, que se hizo de código abierto en 2015. Evolucionó a partir del software de aprendizaje automático interno de Google, que se reformuló y optimizó para su uso en producción.
El término “TensorFlow” se refiere a la forma en que se organizan y procesan los datos. Un tensor es la estructura de datos más básica tanto en TensorFlow como en PyTorch. Cuando usa TensorFlow, crea un gráfico de flujo de datos con estado, que es similar a un diagrama de flujo que recuerda eventos pasados, para realizar operaciones en los datos de estos tensores.
TensorFlow es conocido por ser una biblioteca de aprendizaje profundo de alto rendimiento. Tiene una base de usuarios grande y activa, así como una gran cantidad de modelos, herramientas y plataformas de capacitación, implementación y servicio oficiales y de terceros.
Resumen sobre PyTorch
PyTorch es uno de los marcos de aprendizaje profundo más recientes, desarrollado por el equipo de Facebook y lanzado en GitHub en 2017. PyTorch está ganando popularidad debido a su facilidad de uso, simplicidad, gráfico computacional dinámico y uso eficiente de la memoria. Es imperativo, lo que significa que se ejecuta inmediatamente y el usuario puede probarlo para ver si funciona antes de escribir el código completo.
Podemos escribir una sección de código y ejecutarla en tiempo real porque tiene una implementación de Python incorporada para brindar compatibilidad como plataforma de aprendizaje profundo. Rápidamente ganó popularidad debido a su interfaz fácil de usar, lo que llevó al equipo de Tensorflow a incorporar sus funciones más populares en Tensorflow 2.0.
Construcción de un modelo de aprendizaje profundo para la clasificación de imágenes
Aquí, en esta sección, vamos a comparar la usabilidad del código y la facilidad de uso de TensorFlow y PyTorch en el conjunto de datos MNIST más utilizado para clasificar dígitos escritos a mano. Usando ambos marcos, comprobaremos los procedimientos mínimos que se deben llevar a cabo para tener un modelo de clasificación adecuado. En ambos modelos, los pasos a seguir son la carga de datos, el preprocesamiento, la construcción del modelo, el entrenamiento y la visualización del resultado. Para ambos modelos, traté de mantener las capas y las configuraciones de hiperparámetros iguales entre sí.
Así que ahora comencemos primero con Tensorflow.
Construcción de modelos con TensorFlow
Construyamos un modelo de red neuronal convolucional para la clasificación de imágenes en TensorFlow.
importar tensorflow desde tensorflow.keras.datasets importar mnist desde tensorflow.keras.utils importar to_categorical desde tensorflow.keras.layers importar Conv2D, Flatten, Dense, MaxPooling2D desde tensorflow.keras.models importar Sequential importar matplotlib.pyplot as plt
Cargar y preprocesar los datos. Aquí, el preprocesamiento no es más que remodelar las imágenes de 28 x 28 a 28 x 28 x 1, es decir, hemos agregado el canal de color y 1 significa el canal gris. A continuación, hemos hecho una representación binaria de cada clase y, por último, hemos escalado todos los valores de píxeles.
# remodelación y una codificación activa x_train = x_train.reshape(x_train.shape[0]28, 28, 1) prueba_x = prueba_x.reforma(prueba_x.forma[0]28, 28, 1) y_train = to_categorical(y_train) y_test = to_categorical(y_test) # escalando x_train = x_train.astype(‘float32’) x_test = x_test.astype(‘float32’) x_train = x_train / 255.0 x_test = x_test / 255.0
A continuación, construiremos un modelo. Este modelo constará de 2 capas convolucionales seguidas de una capa de agrupación y un clasificador denso. Se utiliza el descenso de gradiente estocástico como función optimizadora con una tasa de aprendizaje de 0,01 y la entropía cruzada categórica como función de pérdida, el modelo se entrena para 5 épocas. Y esto también se mantiene en el modelo de Pytorch.
modelo = Sequential() modelo.add(Conv2D(32, (3,3), input_shape = (28,28,1), activación=’relu’)) modelo.add(Conv2D(64,(3,3), activación=’relu’)) modelo.añadir(MaxPooling2D((2,2))) modelo.añadir(Flatten()) modelo.añadir(Dense(1024, activación=’relu’)) modelo.añadir(Dense(10 , activación=’softmax’)) # compile model.compile(optimizer=”sgd”, loss=”categorical_crossentropy”, metrics=[‘accuracy’]) # historial de entrenamiento = model.fit(x_train, y_train, validation_split=0.3, epochs=5)
A continuación se muestran las pérdidas de tren y validación para 5 épocas.
Hasta aquí, este es todo el trabajo mínimo requerido para construir un clasificador de imágenes usando TensorFlow.
Construcción de modelos con PyTorch
Construyamos un modelo de red neuronal convolucional para la clasificación de imágenes en PyTorch.
importar antorcha importar antorcha.nn como nn importar antorcha.optim como optim importar antorcha.nn.funcional como F de torchvision importar conjuntos de datos, transformaciones
Cargar y preprocesar los datos.
# transformación del preprocesador = transforms.Compose([
transforms.Resize((8, 8)),
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))]) # cargar los datos tren_conjunto de datos = conjuntos de datos.MNIST(‘datos’, tren=Verdadero, descargar=Verdadero, transformar=transformar) test_conjunto de datos = conjuntos de datos.MNIST(‘datos’, tren=Falso, descargar=Verdadero, transformar=transformar) tren_cargador = torch.utils.data.DataLoader(train_dataset, batch_size=512) test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=512)
A continuación, igual que antes, construiremos un modelo y lo compilaremos.
# Construir una clase modelo CNNModel(nn.Module): def __init__(self): super(CNNModel, self).__init__() self.conv1 = nn.Conv2d(1, 32, 3, 1) self.conv2 = nn. Conv2d(32, 64, 3, 1) self.fc = nn.Linear(1024, 10) def adelante(self, x): x = F.relu(self.conv1(x)) x = F.relu(self .conv2(x)) x = F.max_pool2d(x, 1) x = torch.flatten(x, 1) x = self.fc(x) salida = F.log_softmax(x, dim=1) return output net = CNNModel() # compilando optimizador = optim.SGD(net.parameters(), lr=0.01) criterio = nn.CrossEntropyLoss()
Después de esto, durante la fase de entrenamiento, debemos crear un ciclo que recorra nuestras épocas y lotes. Procesaremos nuestras imágenes en consecuencia y usaremos el pase hacia adelante para calcular nuestra pérdida. Este código se puede encontrar en el cuaderno vinculado a continuación.
Ahora finalmente vamos a echar un vistazo a la curva de pérdida.
Comparando las actuaciones
En los dos gráficos anteriores, la curva del modelo TensorFlow parece empinada y después de la tercera época, la pérdida en el conjunto de validación parece aumentar. En resumen, podemos decir que el procedimiento de aprendizaje en el modelo TensorFlow es de naturaleza abrupta y podemos esperar muchas compensaciones.
Mientras que en el modelo PyTorch, incluso el procedimiento de construcción del modelo parece complejo, se observó que el entrenamiento y la pérdida fueron fluidos a lo largo del procedimiento y la pérdida de validación siguió adecuadamente a la pérdida de prueba.
Ultimas palabras
En este punto, hemos analizado brevemente TensorFlow y PyTorch y hemos visto el procedimiento de modelado mínimo para la clasificación de imágenes. En el contexto del rendimiento de entrenamiento y prueba de los dos gráficos respectivos, podemos decir que el proceso de entrenamiento y evaluación es más fluido en el modelo PyTorch, y en términos de componentes básicos, diría que TensorFlow es más fácil de usar para principiantes debido a su API simplificada. .