Weblog de Posit AI: Revisitando Keras para R



Antes de que hablemos de nuevas características, respondamos la pregunta obvia. Sí, habrá una segunda edición de Aprendizaje profundo para R! Como reflejo de lo que ha estado sucediendo mientras tanto, la nueva edición cubre un conjunto ampliado de arquitecturas probadas; Al mismo tiempo, encontrará que los diseños intermedios a avanzados que ya estaban presentes en la primera edición se han vuelto bastante más intuitivos de implementar, gracias a las nuevas mejoras de bajo nivel a las que se alude en el resumen.

Pero no nos malinterprete: el alcance del libro no ha cambiado por completo. Sigue siendo la opción perfecta para las personas nuevas en el aprendizaje automático y el aprendizaje profundo. A partir de las concepts básicas, progresa sistemáticamente a temas intermedios y avanzados, dejándole tanto una comprensión conceptual como una bolsa de plantillas de aplicaciones útiles.

Ahora, ¿qué ha estado pasando con Keras?

Estado del ecosistema

Comencemos con una caracterización del ecosistema y algunas palabras sobre su historia.

En este submit, cuando decimos Kerasnos referimos a R, a diferencia de Python, Keras. Ahora, esto se traduce inmediatamente al paquete R keras. Pero keras solo no te llevaría lejos. Mientras keras proporciona la funcionalidad de alto nivel (capas de redes neuronales, optimizadores, gestión de flujo de trabajo y más), la estructura de datos básica sobre la que se opera, tensoresvive en tensorflow. En tercer lugar, tan pronto como necesite realizar un preprocesamiento menos que trivial, o ya no pueda mantener todo el conjunto de entrenamiento en la memoria debido a su tamaño, querrá investigar tfdatasets.

Entonces son estos tres paquetes: tensorflow, tfdatasetsy keras – eso debe entenderse por “Keras” en el contexto precise. (El ecosistema R-Keras, por otro lado, es un poco más grande. Pero otros paquetes, como tfruns o cloudmlestán más desacoplados del núcleo.)

Coincidiendo con su estrecha integración, los paquetes antes mencionados tienden a seguir un ciclo de lanzamiento común, que depende de la biblioteca de Python subyacente, TensorFlow. para cada uno de tensorflow, tfdatasetsy keras , la versión precise de CRAN es 2.7.0, lo que refleja la versión de Python correspondiente. La sincronía de versiones entre los dos Kerases, R y Python, parece indicar que sus destinos se habían desarrollado de manera comparable. Nada podría ser menos cierto, y saber esto puede ser útil.

En R, entre paquetes presentes desde el principio tensorflow y keraslas responsabilidades siempre se han repartido como ahora: tensorflow proporcionando elementos básicos indispensables, pero a menudo, siendo completamente transparente para el usuario; keras siendo lo que usas en tu código. De hecho, es posible entrenar un modelo Keras sin usar conscientemente tensorflow.

En el lado de Python, las cosas han estado experimentando cambios significativos, en los que, en cierto sentido, el último desarrollo ha estado invirtiendo el primero. Al principio, TensorFlow y Keras eran bibliotecas separadas, con TensorFlow proporcionando un backend, uno entre varios, para que Keras lo use. En algún momento, el código de Keras se incorporó al código base de TensorFlow. Finalmente (a partir de hoy), luego de un período prolongado de ligera confusión, Keras se mudó nuevamente y comenzó, nuevamente, a crecer considerablemente en funciones.

Es solo ese rápido crecimiento lo que ha creado, en el lado R, la necesidad de refactorización y mejoras extensas de bajo nivel. (¡Por supuesto, la nueva funcionalidad orientada al usuario también tuvo que implementarse!)

Antes de llegar a los momentos destacados prometidos, una palabra sobre cómo pensamos acerca de Keras.

Toma tu pastel y cómelo también: Una filosofía de (R) Keras

Si usó Keras en el pasado, sabe lo que siempre ha sido su intención: una biblioteca de alto nivel, que lo hace fácil (en la medida de lo posible). poder ser fácil) para entrenar redes neuronales en R. En realidad, no se trata solo de facilidad. Keras permite a los usuarios escribir código de aspecto idiomático y pure. Esto, en gran medida, se logra al permitir la composición de objetos a través del operador de tubería; también es una consecuencia de sus abundantes envolturas, funciones de conveniencia y semántica funcional (sin estado).

Sin embargo, debido a la forma en que TensorFlow y Keras se han desarrollado en el lado de Python, en referencia a los grandes cambios arquitectónicos y semánticos entre las versiones 1.x y 2.x, caracterizados por primera vez de manera integral en este weblog. aquí – se ha vuelto más desafiante proporcionar toda la funcionalidad disponible en el lado de Python para el usuario de R. Además, mantener la compatibilidad con varias versiones de Python TensorFlow, algo que R Keras siempre ha hecho, por necesidad se vuelve cada vez más desafiante, cuanto más envoltorios y funciones convenientes agrega.

Así que aquí es donde complementamos lo anterior “hazlo como R y pure, donde sea posible” con “haz que sea fácil de portar desde Python, cuando sea necesario”. Con la nueva funcionalidad de bajo nivel, no tendrá que esperar a que los contenedores de R utilicen objetos definidos por Python. En cambio, los objetos de Python pueden subclasificarse directamente desde R; y cualquier funcionalidad adicional que le gustaría agregar a la subclase se outline en una sintaxis comparable a Python. Lo que esto significa, concretamente, es que traducir el código de Python a R se ha vuelto mucho más fácil. Echaremos un vistazo a esto en el segundo de nuestros tres puntos destacados.

Novedades en Keras 2.6/7: tres aspectos destacados

Entre las muchas capacidades nuevas agregadas en Keras 2.6 y 2.7, presentamos rápidamente tres de las más importantes.

  • Capas de preprocesamiento ayudan significativamente a agilizar el flujo de trabajo de capacitación, integrando la manipulación de datos y el aumento de datos.

  • La capacidad de subclasificar objetos de Python (ya mencionado varias veces) es la nueva magia de bajo nivel disponible para el keras usuario y que impulsa muchas mejoras de cara al usuario debajo.

  • Las capas de redes neuronales recurrentes (RNN) obtienen una nueva API a nivel de celda.

De estos, los dos primeros definitivamente merecen un tratamiento más profundo; Seguirán publicaciones más detalladas.

Capas de preprocesamiento

Antes de la llegada de estas capas dedicadas, el preprocesamiento solía realizarse como parte del tfdatasets tubería. Encadenaría las operaciones según sea necesario; tal vez, integrando transformaciones aleatorias para ser aplicadas durante el entrenamiento. Dependiendo de lo que quería lograr, es posible que se haya producido un esfuerzo de programación significativo.

Esta es un área donde las nuevas capacidades pueden ayudar. Existen capas de preprocesamiento para varios tipos de datos, lo que permite la “disputa de datos” recurring, así como el aumento de datos y la ingeniería de características (como en el hash de datos categóricos o la vectorización de texto).

La mención de la vectorización de texto conduce a una segunda ventaja. A diferencia de, digamos, una distorsión aleatoria, la vectorización no es algo que pueda olvidarse una vez hecho. No queremos perder la información unique, es decir, las palabras. Lo mismo sucede, para datos numéricos, con la normalización. Necesitamos mantener las estadísticas resumidas. Esto significa que hay dos tipos de capas de preprocesamiento: sin estado y con estado. Los primeros forman parte del proceso de formación; estos últimos son llamados con anticipación.

Las capas sin estado, por otro lado, pueden aparecer en dos lugares en el flujo de trabajo de entrenamiento: como parte del tfdatasets tubería, o como parte del modelo.

Así es, esquemáticamente, cómo se vería el primero.

library(tfdatasets)
dataset <- ... # outline dataset
dataset <- dataset %>%
  dataset_map(operate(x, y) listing(preprocessing_layer(x), y))

Mientras que aquí, la capa de preprocesamiento es la primera en un modelo más grande:

enter <- layer_input(form = input_shape)
output <- enter %>%
  preprocessing_layer() %>%
  rest_of_the_model()
mannequin <- keras_model(enter, output)

Hablaremos sobre qué manera es preferible y cuándo, y también mostraremos algunas capas especializadas en una publicación futura. Hasta entonces, no dude en consultar el – detallado y rico en ejemplos viñeta.

subclases de Python

Imagina que quisieras portar un modelo de Python que hiciera uso de la siguiente restricción:

viñeta para numerosos ejemplos, azúcar sintáctico y detalles de bajo nivel.

API de celda RNN

Nuestro tercer punto es al menos la mitad de reconocimiento a la excelente documentación que alerta a una nueva característica. La pieza de documentación en cuestión es una nueva viñeta en RNN. La viñeta brinda una descripción common útil de cómo funcionan los RNN en Keras, y aborda las preguntas habituales que tienden a surgir una vez que no los ha usado por un tiempo: ¿Qué son exactamente los estados frente a las salidas, y cuándo una capa devuelve qué? ¿Cómo inicializo el estado de una manera dependiente de la aplicación? ¿Cuál es la diferencia entre los RNN con estado y sin estado?

Además, la viñeta cubre preguntas más avanzadas: ¿Cómo paso datos anidados a una RNN? ¿Cómo escribo celdas personalizadas?

De hecho, esta última pregunta nos lleva a la nueva función que queríamos mencionar: la nueva API de nivel de celda. Conceptualmente, con RNN, siempre hay dos cosas involucradas: la lógica de lo que sucede en un solo paso de tiempo; y el enhebrado del estado a través de pasos de tiempo. Los llamados “RNN simples” se ocupan del último aspecto (recursión) únicamente; tienden a exhibir el clásico problema de los gradientes que se desvanecen. Las arquitecturas cerradas, como LSTM y GRU, se han diseñado especialmente para evitar esos problemas; ambos se pueden integrar fácilmente en un modelo usando el respectivo layer_x() constructores ¿Qué sucede si desea, no un GRU, sino algo como una GRU (usando algún nuevo y elegante método de activación, por ejemplo)?

Con Keras 2.7, ahora puede crear una celda RNN de un solo paso de tiempo (usando el método descrito anteriormente). %py_class% API), y obtener una versión recursiva – una capa completa – usando layer_rnn():

rnn <- layer_rnn(cell = cell)

Si estás interesado, echa un vistazo a la viñeta para un ejemplo extendido.

Con eso, terminamos nuestro noticias de keras, para hoy. ¡Gracias por leer, y estén atentos para más!

Foto por Hans-Jurgen Mager en Unsplash

Related Articles

La semana en ransomware – 3 de febrero de 2023

Si bien la semana comenzó lentamente, se convirtió en un...

Comments

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Same Category

spot_img

Stay in touch!

Follow our Instagram