Path: blob/master/site/es-419/tutorials/audio/transfer_learning_audio.ipynb
25118 views
Copyright 2021 The TensorFlow Authors.
Aprendizaje de transferencia con YAMNet para la clasificación de sonidos ambientales
YAMNet es una red neuronal profunda preentrenada que puede predecir eventos de audio de 521 clases, como risas, ladridos o una sirena.
En este tutorial aprenderá a:
Cargar y usar el modelo YAMNet para la inferencia.
Construir un nuevo modelo usando las incrustaciones de YAMNet para clasificar los sonidos de gatos y perros.
Evaluar y exportar su modelo.
Importar TensorFlow y otras librerías
Empiece instalando TensorFlow I/O, que le facilitará la carga de archivos de audio del disco.
Acerca de YAMNet
YAMNet es una red neuronal preentrenada que emplea la arquitectura de convolución separable en profundidad MobileNetV1. Puede usar una forma de onda de audio como entrada y hacer predicciones independientes para cada uno de los 521 eventos de audio del corpus de AudioSet.
Internamente, el modelo extrae "cuadros" de la señal de audio y procesa lotes de estos cuadros. Esta versión del modelo usa cuadros de 0.96 segundos de duración y extrae un cuadro cada 0.48 segundos.
El modelo acepta un Tensor 1-D float32 o un arreglo NumPy que contenga una forma de onda de longitud arbitraria, representada como muestreo monocanal (mono) de 16 kHz en el rango [-1.0, +1.0]
. Este tutorial incluye código para ayudarle a convertir archivos WAV al formato compatible.
El modelo devuelve 3 salidas, incluidas las puntuaciones de las clases, las incrustaciones (que usará para el aprendizaje por transferencia) y el espectrograma del logaritmo mel. Puede encontrar más detalles aquí.
Un uso particular de YAMNet es como extractor de características de alto nivel: la salida incorporada de 1,024 dimensiones. Tomará las características de entrada del modelo base (YAMNet) y las alimentará a su modelo menos profundo, formado por una capa oculta tf.keras.layers.Dense
. Luego entrenará la red con una pequeña cantidad de datos para la clasificación de audio sin necesidad de muchos datos etiquetados ni de un entrenamiento de principio a fin. (Esto es similar al aprendizaje por transferencia para la clasificación de imágenes con TensorFlow Hub para más información).
Primero, probará el modelo y verá los resultados de la clasificación del audio. Luego construirá la canalización de preprocesamiento de datos.
Cargar YAMNet desde TensorFlow Hub
Va a usar una YAMNet preentrenada de Tensorflow Hub para extraer las incrustaciones de los archivos de sonido.
Cargar un modelo desde TensorFlow Hub es sencillo: seleccione el modelo, copie su URL y use la función load
.
Nota: para leer la documentación del modelo, use la URL del modelo en su navegador.
Con el modelo cargado, puede seguir el tutorial de uso básico de YAMNet y descargar un archivo WAV de muestra para ejecutar la inferencia.
Va a necesitar una función para cargar archivos de audio, que se usará también más adelante al trabajar con los datos de entrenamiento. (Más información sobre la lectura de archivos de audio y sus etiquetas en Reconocimiento simple de audio).
Nota: El wav_data
devuelto por load_wav_16k_mono
ya está normalizado a valores en el rango [-1.0, 1.0]
(consulte la documentación de YAMNet sobre el TF Hub para saber más).
Cargue el mapeo de clases
Es importante cargar los nombres de clase que YAMNet es capaz de reconocer. El archivo de mapeo se encuentra en yamnet_model.class_map_path()
en formato CSV.
Ejecutar inferencia
YAMNet da puntuaciones por clase a nivel de cuadro (es decir, 521 puntuaciones por cada cuadro). Para determinar las predicciones a nivel de clip, las puntuaciones pueden agregarse por clase a través de los cuadros (por ejemplo, usando la agregación media o máxima). Esto se hace a continuación con scores_np.mean(axis=0)
. Por último, para encontrar la clase mejor puntuada a nivel de clip, se toma el máximo de las 521 puntuaciones agregadas.
Nota: El modelo ha deducido correctamente el sonido de un animal. Su meta en este tutorial es aumentar la precisión del modelo para clases específicas. Además, observe que el modelo generó 13 incorporaciones, 1 por cuadro.
Conjunto de datos ESC-50
El conjunto de datos ESC-50 (Piczak, 2015) es una recolección etiquetada de 2,000 grabaciones de audio ambiental de cinco segundos de duración. El conjunto de datos consta de 50 clases, con 40 ejemplos por clase.
Descárguelo y extráigalo.
Explorar los datos
Los metadatos de cada archivo se especifican en el archivo csv en ./datasets/ESC-50-master/meta/esc50.csv
y todos los archivos de audio están en ./datasets/ESC-50-master/audio/
Creará un DataFrame
de pandas con el mapeo y lo usará para tener una visión más clara de los datos.
Filtrar los datos
Ahora que los datos están almacenados en el DataFrame
, aplique algunas transformaciones:
Filtre las filas y use sólo las clases seleccionadas:
dog
ycat
. Si quiere usar otras clases, aquí puede elegir.Modifique el nombre del archivo para que contenga la ruta completa. Esto facilitará la carga más adelante.
Cambie los objetivos para que estén dentro de un rango específico. En este ejemplo,
dog
permanecerá en0
, perocat
pasará a ser1
en lugar de su valor original de5
.
Cargar los archivos de audio y recuperar las incorporaciones
Aquí aplicará el load_wav_16k_mono
y preparará los datos WAV para el modelo.
Al extraer las incorporaciones de los datos WAV, obtiene un arreglo de forma (N, 1024)
donde N
es el número de cuadros que encontró YAMNet (uno por cada 0.48 segundos de audio).
Su modelo usará cada cuadro como una entrada. Por eso, tiene que crear una nueva columna que tenga un cuadro por fila. También tiene que ampliar las etiquetas y la columna fold
para reflejar adecuadamente estas nuevas filas.
La columna expandida fold
conserva los valores originales. No se puede mezclar cuadros porque, al dividirse, podría acabar teniendo partes del mismo audio en distintas divisiones, con lo que la validación y la prueba serían menos eficaces.
Dividir los datos
Va a usar la columna fold
para dividir el conjunto de datos en conjuntos de entrenamiento, validación y prueba.
ESC-50 está organizado en cinco fold
de validación cruzada con tamaño uniforme, para que los clips de la misma fuente original estén siempre en el mismo fold
. Más información en el artículo ESC: Conjunto de datos para la clasificación de sonidos ambientales.
El último paso es eliminar la columna fold
del conjunto de datos, ya que no se usa durante el entrenamiento.
Crear su modelo
¡Ya hizo la mayor parte del trabajo! Ahora, defina un modelo Sequential muy sencillo con una capa oculta y dos salidas para reconocer gatos y perros a partir de sonidos.
Vamos a ejecutar el método evaluate
en los datos de prueba para asegurarnos de que no hay ningún sobreajuste.
¡Excelente!
Cómo probar su modelo
A continuación, pruebe su modelo sobre la incorporación de la prueba anterior usando sólo YAMNet.
Guardar un modelo que pueda tomar directamente un archivo WAV como entrada
Su modelo funciona cuando le da las incorporaciones como entrada.
En un escenario real, necesitará usar datos de audio como entrada directa.
Para ello, combinará YAMNet con su modelo en un único modelo que podrá exportar para otras aplicaciones.
Por comodidad a la hora de usar los resultados del modelo, la capa final será una operación reduce_media
. Si está usando este modelo para el servicio (aprenderá más adelante sobre eso en el tutorial), necesitará el nombre de la capa final. Si no define uno, TensorFlow definirá automáticamente uno incremental, dificultando las pruebas, ya que cambia cada vez que entrena el modelo. Si está usando una operación TensorFlow sin procesar, no puede darle un nombre. Para resolver este problema, creará una capa personalizada que aplique reduce_media
y la llamará 'classifier'
.
Cargue su modelo guardado para verificar que funciona como se espera.
Y para la prueba final: dados unos datos de sonido, ¿su modelo devuelve el resultado correcto?
Si quiere probar su nuevo modelo en un escenario de servicio, puede usar la firma 'serving_default'.
(Opcional) Unas pruebas más
El modelo está listo.
Comparémoslo con YAMNet en el conjunto de datos de prueba.
Siguientes pasos
Ha creado un modelo que puede clasificar sonidos de perros o gatos. Con la misma idea y un conjunto de datos distinto puede intentar, por ejemplo, construir un identificador acústico de pájaros basado en su canto.
¡Comparta su proyecto con el equipo de TensorFlow en las redes sociales!