Optimización de sistemas de comunicación mediante algoritmos de inteligencia artificial
Full text
FACULTAD DE FÍSICA UNIVERSIDAD DE SEVILLA Trabajo Fin de Grado Grado en Ingeniería de Materiales Optimización de sistemas de comunicación mediante algoritmos de inteligencia artificial Autor: Juan Manuel Solís Vilches Tutores: Luis Alejandro Camuñas Mesa José Manuel de la Rosa Utrera
ÍNDICE DE CONTENIDOS 1. INTRODUCCIÓN 3 2. REDES NEURONALES ARTIFICIALES 5 2.1. Aprendizaje automático 5 2.2. Aprendizaje profundo 5 2.3. Neuronas artificiales 6 2.4. Redes neuronales convolucionales 7 3. METODOLOGÍA Y DESARROLLO DE CONTENIDOS 9 3.1. Conjunto de datos 9 3.1.1. Dataset 9 3.1.2. Tipos de modulaciones 9 3.2. Clasificador 11 3.2.1. Creación del clasificador 11 3.2.2. Arquitectura del clasificador 13 3.2.3. Funcionamiento del clasificador 15 4. RESULTADOS 19 4.1. Definiciones 19 4.2. Ajuste de hiperparámetros 22 4.2.1. Variación del tamaño de lote 24 4.2.2. Variación del dropout 26 4.2.3. Variación de tasa de aprendizaje 28 4.2.4. Variación de las neuronas 29 4.3. Configuración final 36 5. RESUMEN Y CONCLUSIONES 40 5.1. Resumen 40 5.2. Conclusiones 40 6. PROBLEMAS ENCONTRADOS 42 BIBLIOGRAFÍA 43 ANEXO 48 Anexo 1 48 Anexo 2 53 2
1. INTRODUCCIÓN En la actualidad, uno de los problemas que atañe a los sistemas de comunicaciones inalámbricas es la ineficiente utilización del espectro electromagnético y su consiguiente congestión. La principal causa de esta situación son las actuales políticas de asignación de bandas de frecuencia, que dan origen a que ciertas bandas de frecuencia se encuentren congestionadas, mientras que otras se encuentran completamente inutilizadas. Este problema, junto con la creciente demanda actual de servicios de comunicaciones inalámbricas, hacen que sea necesario un uso más eficiente del espectro. Una de las tecnologías que posibilita una mejor administración del espectro, y por lo tanto resolvería este problema, es la radio cognitiva (CR). El funcionamiento de la CR se basa fundamentalmente en la capacidad cognitiva y reconfigurabilidad autónoma [1]. O lo que es lo mismo, una correcta detección del espectro presente en el entorno, y el ajuste automático de parámetros de transmisión o recepción para no interferir en el resto de señales. Para lograr este objetivo, la información se debe procesar mediante software, siendo necesario el uso de algoritmos de inteligencia artificial (IA). Los algoritmos de inteligencia artificial se encargan, por tanto, de ajustar los parámetros necesarios en el dispositivo, y de esta forma lograr adaptarse a las circunstancias del entorno. En particular, el uso de redes neuronales permite realizar un procesamiento inteligente de la información del entorno e identificar, en tiempo real, la banda óptima del espectro disponible para recibir/transmitir información. En concreto, un tipo de red neuronal que destaca por su eficacia en cuanto a tareas de clasificación son las redes neuronales convolucionales. Este tipo de redes permiten una mejor detección y clasificación de señales en comparación con las redes neuronales convencionales. Y es que sobre todo en los últimos años, se ha desarrollado y mejorado ampliamente este campo para su uso en telecomunicaciones, especialmente con la implementación del procesamiento mediante GPU (Graphics Processing Unit)[2] que permite una compilación más rápida y eficiente. 3
En este contexto, una de las posibles implementaciones de las redes neuronales son los prometedores sistemas híbridos memristores-CMOS [3]. Estos dispositivos combinan la flexibilidad y alto rendimiento de fabricación de la tecnología CMOS con la capacidad de los memristores de adaptarse y cambiar su comportamiento con el tiempo en respuesta a diferentes patrones de estimulación como ocurre en el cerebro humano. Finalmente, en este trabajo, nos centramos en la implementación software de una red neural convolucional mediante el uso del lenguaje de programación Python. Esta red cumple la función de identificar y clasificar los tipos de modulación de las señales recibidas, permitiendo reconfigurar el receptor y optimizando la comunicación. Con esa finalidad, se ha usado como base la arquitectura de red planteada por O’Shea [4] y, a partir de ella, se ha realizado un análisis exhaustivo de los parámetros de dicha red con el objetivo de mejorarla. La intención de este análisis es, por lo tanto, lograr optimizar la red neuronal convolucional usada prestando especial atención a factores como su rendimiento (performance) o el coste computacional. En total, el trabajo consta de 7 apartados siendo el primero de ellos esta introducción. En el apartado 2, se definen brevemente los principales conceptos de redes neuronales artificiales. En el apartado 3, se describe el problema de clasificación planteado, además del dataset y el tipo de red utilizados, mientras que en el apartado 4, se exponen los resultados obtenidos mediante la variación de los parámetros de la red, concluyendo con la descripción de la configuración final y sus resultados. Por último, en el apartado 5, se encuentra el resumen del trabajo realizado y las conclusiones obtenidas, exponiendo en el apartado 6 los problemas encontrados durante el proceso. 4
2. REDES NEURONALES ARTIFICIALES 2.1. Aprendizaje automático El aprendizaje automático (Machine learning) [5] es una rama de la inteligencia artificial que se encarga de desarrollar sistemas capaces de mejorar automáticamente mediante la experiencia. El funcionamiento del aprendizaje automático se basa en la identificación de ciertos patrones, de una serie de datos, que posteriormente son utilizados para predecir nuevos datos. Existen cuatro tipos de aprendizaje automático: aprendizaje supervisado, aprendizaje no supervisado, aprendizaje semi-supervisado y aprendizaje por refuerzo. Elegir un tipo u otro depende de los datos disponibles y de la tarea que se vaya a realizar. En este apartado, nos enfocaremos únicamente en los dos primeros tipos. ●Aprendizaje no supervisado (Unsupervised learning): los datos con los que se trabaja no están etiquetados, por lo tanto, el objetivo es encontrar patrones que le permitan agrupar esos datos. ●Aprendizaje supervisado (Supervised learning): los datos con lo que se trabaja están etiquetados, es decir, el algoritmo conoce cuál debería ser el valor de salida. Por lo tanto, en este tipo de aprendizaje automático el objetivo es usar el algoritmo para encontrar la función óptima que mejor relacione nuestros datos de entrada con su valor de salida o etiqueta. El aprendizaje supervisado se puede usar para problemas de regresión o clasificación. 2.2. Aprendizaje profundo El aprendizaje profundo (Deep learning) [6] es un término que agrupa modelos de aprendizaje que usan más de una capa oculta, siendo una capa oculta toda aquella capa que no es de entrada ni de salida. Estos modelos de aprendizaje se conocen como “redes neuronales artificiales” e imitan la función de las redes neuronales del cerebro humano. Un ejemplo de aprendizaje profundo sería las redes neuronales convolucionales. 5
2.3. Neuronas artificiales Una neurona artificial [7] es un procesador elemental que mediante un conjunto de valores de entrada (vector de entrada) procedente del exterior o de otras neuronas, proporciona una única respuesta o salida. La neurona artificial se considera la unidad de procesamiento básica e imprescindible de la red neuronal artificial. En la Figura 1, podemos observar una representación del modelo genérico de una neurona artificial y sus elementos: Figura 1. Modelo genérico de una neurona artificial [7]. Los elementos que constituyen dicha neurona son: ●Entradas: . Las variables de entrada y salida pueden ser binarias 𝑥𝑖(𝑡) (digitales) o continuas (analógicas) dependiendo del modelo de aplicación y de la implementación en sí de la red neuronal. En nuestro caso serán digitales. ●Pesos sinápticos: . Representan la intensidad de interacción entre cada 𝑤𝑖𝑗 neurona presináptica jy la neurona postsináptica i. ● Regla de propagación: . Proporciona el valor del potencial σ(𝑤𝑖𝑗, 𝑥𝑗(𝑡)) postsináptico, , de la neurona ien función de sus pesos y entradas. ℎ𝑖(𝑡) 6
●Función de activación o de transferencia: . Proporciona 𝑓𝑖(𝑎𝑖(𝑡 − 1), ℎ𝑖(𝑡)) el estado de activación actual, , de la neurona ien función de su estado 𝑎𝑖(𝑡) anterior, , y de su potencial postsináptico actual. 𝑎𝑖(𝑡 − 1) ● Función de salida: . Proporciona la salida actual, , de la 𝐹𝑖(𝑎𝑖(𝑡)) 𝑦𝑖(𝑡) neurona ien función de su estado de activación actual, . Muy 𝑎𝑖(𝑡) frecuentemente la función de salida es simplemente la identidad , de 𝐹(𝑥) = 𝑥 modo que el estado de activación de la neurona se considera como la propia salida. Por último, en la Figura 2 se muestra la interconexión entre varias neuronas: Figura 2. Interconexión entre una neurona presináptica y una neurona postsináptica [7]. 7
2.4. Redes neuronales convolucionales Las redes neuronales convolucionales (CNN) [8] son un tipo de red neuronal artificial con aprendizaje supervisado. Como su nombre indica, este tipo de red utiliza una operación matemática llamada convolución, que es un tipo especializado de operación lineal cuya expresión matemática [9] se expresa como: Donde fson los datos de entrada y hnuestra matriz núcleo de la función, mientras que m y n son, respectivamente, las filas y columnas de la matriz resultante. Estas redes neuronales [10] se utilizan ampliamente para tareas de clasificación y pertenecen a los métodos conocidos como aprendizaje profundo. Su arquitectura consta, como cualquier red neuronal, de una serie de capas de neuronas que poseen pesos (weights) y sesgos (biases) que se utilizan para que la red “aprenda”. El proceso de aprendizaje consiste en minimizar el error obtenido a la salida de cada neurona iteración tras iteración. Para ello, las neuronas procesan los datos de entrada mediante un algoritmo que, redefiniendo los valores de los pesos y los sesgos, genera una salida que se transmite a la siguiente neurona. Este proceso se repite, capa por capa, hasta la salida minimizando el error y dando como resultado la predicción de la red neuronal. La diferencia fundamental de las redes neuronales convolucionales con respecto a las demás radica en la operación matemática que utiliza, la convolución. La red neuronal convolucional estará formada por distintos tipos de capas (layers), siendo la capa convolucional la más importante. 8
3. METODOLOGÍA Y DESARROLLO DE CONTENIDOS 3.1. Conjunto de datos 3.1.1. Dataset El dataset es el conjunto de datos que utilizamos para entrenar y validar nuestra red neuronal. En nuestro caso, el dataset [2] utilizado es un conjunto de datos sintéticos obtenidos de Deepsig con 10 tipos de modulaciones, donde cada muestra corresponde a un fragmento de señal de comunicación cuyo tipo de modulación queremos identificar. Aunque hay dos versiones del dataset 2016.10, se utiliza la versión 2016.10B que fue generada mediante GNU Radio, una herramienta de desarrollo libre y abierta que proporciona bloques de procesamiento de señales. Con la intención de simular las condiciones reales a la que se ven expuestas las señales se han aplicado varios efectos a las distintas modulaciones de nuestro dataset. Los efectos aplicados en el dataset obtenido de Deepsig incluyen: desviación de muestreo, desviación de frecuencia, desvanecimiento selectivo y adición de ruido blanco gaussiano. Concretamente, el dataset utilizado para entrenar el clasificador consta de señales en fase y cuadratura (señales I/Q) para 10 tipos de modulación diferentes, cada una de ellas con un rango de relación señal/ruido (SNR) desde -20 a 18 dB. El dataset contiene 120.000 muestras de señales I/Q para cada tipo de modulación, es decir, en total el dataset almacena 1.200.000 muestras. Cada una de las muestras poseen la forma [2,128] que determina las dimensiones que posee el vector de entrada. De estas dimensiones, la corresponde con nuestros canales I y Q 𝐷𝑖𝑚𝑒𝑛𝑠𝑖ó𝑛1= 2 (componentes en fase y en cuadratura), mientras que la se 𝐷𝑖𝑚𝑒𝑛𝑠𝑖ó𝑛 2= 128 corresponde con el número de muestras temporales. 9
●Capa convolucional: las capas de convolución [21] están diseñadas para la detección de características. Su funcionamiento se basa en la operación de convolución. Esta operación consiste en un filtro llamado ventana de convolución que se desliza sobre los datos de entrada y realiza una operación de multiplicación respecto a la matriz núcleo de la función. Finalmente, el resultado obtenido se almacena en un mapa de características como se observa en la Figura 5. El filtro tiene tantas dimensiones como la entrada, y su tamaño se puede variar libremente. Un filtro de la capa convolucional equivaldría a una neurona, y la capa equivale a una capa de neuronas. Figura 5. Funcionamiento de la capa convolucional [10]. ●Capa densa: es una capa de la red neuronal densamente conectada [21], se utiliza principalmente para detectar y clasificar imágenes. Este tipo de capas se colocan al final de la arquitectura, recibiendo como entrada las salidas de las capas de convolución e identificando la probabilidad de cada dato de pertenecer a un determinado tipo de modulación. 16
En cuanto a las funciones de activación [22] que se utilizan, nos podemos encontrar dos tipos: ●ReLU: es la función rectificada lineal, se encarga de transformar los valores introducidos anulando los valores negativos y dejando los positivos tal y como entran. ●SoftMax: esta función se encarga de transformar las salidas a una representación en forma de probabilidades, de tal manera que el sumatorio de todas las probabilidades de las salidas dé 1. En cuanto al método que se utiliza en nuestro output o salida, es el siguiente: ●Codificación en caliente: la codificación en caliente,también conocida como One Hot Encoding [23],es un proceso que convierte las variables categóricas de forma que puedan ser usadas por los algoritmos de la red para realizar una mejor predicción. En nuestro caso, para convertir las variables categóricas se crea una columna para cada tipo de modulación y, para cada registro de salida, se marca con un 1 la columna a la que pertenece la modulación mientras que las demás son 0. El proceso descrito se muestra en la Figura 6 que aparece a continuación: Figura 6. Esquema de codificación en caliente 17
Mientras que la función de pérdida utilizada es: ●Entropía cruzada categórica: la entropía cruzada categórica [24], es una medida de precisión para variables categóricas. Por último, el optimizador de nuestra red neuronal se corresponde con: ●Adam: el optimizador Adam [25] es un método de descenso de gradiente estocástico bastante popular en aprendizaje profundo. Su funcionamiento se basa en adaptar individualmente la tasa de aprendizaje para cada parámetro de entrada, lo que permite acelerar la optimización de nuestra red neuronal. 18
4. RESULTADOS 4.1. Definiciones Antes de mostrar las variaciones de parámetros realizadas, conviene definir algunos de los conceptos que usaremos: ● Hiperparámetro: con este término se designa a cada uno de los parámetros de nuestra red neuronal que son ajustables y permiten controlar el entrenamiento del modelo. ●Tamaño de lote: conocido también como batch size, es uno de los hiperparámetros [26] que podemos configurar y determina el número de datos que tiene cada iteración de un ciclo (epoch). A mayor tamaño de lote, más memoria se necesitará. ●Iteración: las iteraciones [26] son las ejecuciones internas en las que se divide un ciclo. El número de iteraciones está determinado por el tamaño de lote y el número total de datos de nuestro dataset. Para conocer el número de iteraciones que tendrá cada ciclo, solamente habría que dividir nuestro número total de datos a entrenar entre el hiperparámetro tamaño de lote. ●Dropout: es un hiperparámetro [27] que determina la probabilidad de que un nodo sea eliminado aleatoriamente en cada ciclo de entrenamiento. Su utilidad radica en que si una neurona es eliminada, las demás neuronas tienen que intervenir y predecir el resultado que deberían dar las neuronas faltantes. Esta situación da lugar a una red neuronal artificial más robusta, menos propensa a sobreajustarse a los datos de entrenamiento. 19
●Tasa de aprendizaje: la tasa de aprendizaje o learning rate [28] es un hiperparámetro que determina el tamaño de paso, es decir, la cantidad que se actualiza cada uno de los pesos durante el entrenamiento en cada iteración. La tasa de aprendizaje controla la rapidez con la que el modelo se adapta al problema. Las tasas de aprendizaje más pequeñas requieren más ciclos de entrenamiento [29] dados los cambios más pequeños realizados en los pesos en cada actualización, mientras que las tasas de aprendizaje más grandes dan como resultado cambios rápidos y requieren menos ciclos de entrenamiento. ●SNR : la relación señal/ruido o SNR se define como la proporción existente entre la potencia de la señal que se transmite y la potencia del ruido que la corrompe. ●Ciclo: ciclo o epoch [29] es el término utilizado en machine learning para referirse a la cantidad de pases que el algoritmo de machine learning ha realizado en todo el conjunto de datos de entrenamiento (dataset). ●Tiempo por ciclo: el tiempo por ciclo (time per epoch) indica la duración de cada pase que el algoritmo de machine learning realiza. En nuestros resultados, el tiempo por ciclo que aparece es una media de la duración del total de pases. ●Precisión de clasificación: la precisión de clasificación o classification accuracy [4] nos indica el porcentaje de aciertos que nuestro clasificador obtiene al categorizar cualquiera de las 10 modulaciones presentes en nuestro dataset. 20
Se usan 600.000 datos para entrenar, y otros 600.000 para testear y validar. Estos datos se distribuyen uniformemente para SNR desde -20dB hasta 18dB y están etiquetados para poder evaluar el rendimiento en subconjuntos específicos. Para valorar nuestra precisión (accuracy) se recurre a las matrices de confusión que nos indican si la modulación verdadera de la señal coincide con la modulación que la red neuronal predice. Estas matrices son especialmente útiles a la hora de mostrar qué porcentaje de una modulación suele malinterpretarse con otra. Finalmente, los resultados obtenidos por la matrices de confusión para cada relación señal/ruido (SNR) se condensan en una gráfica que muestra la precisión de clasificación para todas las SNR estudiadas. ●Rendimiento: para encontrar una configuración óptima de nuestra red neuronal artificial es necesario entrenarla con distintos valores de ciertos hiperparámetros y de números de neuronas. Uno de los recursos utilizados para evaluar y decidir qué configuraciones son válidas es el rendimiento o performance. Para hallar el rendimiento de nuestra red neuronal, se representa la evolución del error estimado mediante entropía cruzada categórica frente al número de ciclos. La gráfica representa el error estimado tanto para la etapa de entrenamiento (línea azul) como para la etapa de validación (línea naranja). Si nuestra red neuronal funciona correctamente, el error estimado disminuirá a medida que se realicen más ciclos. El valor mínimo de error estimado que se logre será nuestro rendimiento. 21
4.2. Ajuste de hiperparámetros El objetivo de nuestra red neuronal artificial es clasificar correctamente señales de radio en función de su modulación para distintas relaciones señal/ruido. Con esta finalidad, se toma como base una Red Neuronal Convolucional (CNN) y se varían parámetros que determinan sus condiciones de entrenamiento. Los hiperparámetros que se han tenido en cuenta para este estudio son: el tamaño de lote, el dropout, la tasa de aprendizaje y el número de neuronas/filtros, así como las capas a las que están asociadas estas neuronas/filtros. Cada uno de estos hiperparámetros han sido estudiados por separado, manteniendo el resto de hiperparámetros su valor inicial en cada caso. De esta forma, se asegura que la comparación de los resultados obtenidos sea consistente. Las variaciones de hiperparámetros se realizan con el objetivo de encontrar, si fuera posible, una configuración de red neuronal que sea aún más eficiente que nuestra configuración inicial. Para ello se debe conocer el valor de los hiperparámetros de nuestra configuración inicial y sus resultados: Hiperparámetros Tamaño de lote Dropout Tasa de aprendizaje Neuronas/Filtros 1024 0,5 0,01 (256,80,256) Resultados Tiempo por ciclo (s) Rendimiento 14 1,55 22
Figura 7. Precisión de clasificación (Classification Accuracy) frente a relación señal/ruido (SNR) de nuestra configuración inicial. Mientras que en las tablas se muestran el valor de los hiperparámetros para la configuración inicial, la Figura 7 corresponde con los resultados de precisión de clasificación frente a la relación señal/ruido (SNR). Por otra parte, para representar el número de neuronas/filtros que pertenece a cada capa, se ha decidido usar el siguiente esquema: (Nº de neuronas de la primera capa convolucional 2D, Nº de neuronas de la segunda capa convolucional 2D, Nº de neuronas de la capa densa) Además, con la intención de facilitar la lectura de los resultados, se ha decidido utilizar el color naranja en los resultados que indiquen rendimiento y tiempo por ciclo para la configuración inicial. Una vez expuesto todo esto, se procede a la exposición de los resultados obtenidos mediante la variación de los hiperparámetros de la red. 23
4.2.1. Variación del tamaño de lote Como se ha definido anteriormente, el tamaño de lote o batch size determina el número de datos que tiene cada iteración de un ciclo (epoch). Por otra parte, las pérdidas de entrenamiento son el error entre la modulación estimada y la modulación real. Los valores de tamaño de lote sujetos a estudio son los siguientes: 2048, 1536, 1024, 512, 256, 128 y 64. En la Figura 8 se exponen las pérdidas de entrenamiento (train loss) para cada ciclo (epoch) obtenidas para los diferentes valores: Figura 8. Pérdidas de entrenamiento (train loss) frente a ciclos (epochs) para distintos valores de tamaño de lote (batch size). Se observa que a mayor número de ciclos, menos pérdidas. Esto se debe a que el modelo “aprende” ajustando los pesos sinápticos en cada ciclo, por lo que mientras mayor sea el número de ciclos, más probable es que la predicción sea correcta. También, se observa que no todos los tamaños de lote poseen el mismo número de ciclos. Esto se debe a que la función de Keras “EarlyStopping” detiene el entrenamiento cuando los resultados dejan de mejorar. En nuestro caso, la función está programada para detenerse tras 5 ciclos si los resultados no mejoran, lo cual se traduce en el código como “patience=5”. 24
Otro de los resultados obtenidos para los distintos valores de tamaño de lote es la precisión de clasificación frente a la relación señal/ruido: Figura 9. Precisión de clasificación (Classification Accuracy) frente a relación señal/ruido (SNR) para diferentes valores de tamaño de lote (batch size). Mientras que el rendimiento (Figura 10) y el tiempo por ciclo (Figura 11) según el valor del tamaño de lote se muestran en las siguientes figuras: Figura 10. Rendimiento (performance) obtenido para diferentes valores de tamaño de lote (batch size). 25
Figura 20.Rendimiento (performance) y tiempo por ciclo (Time per Epoch) para la tercera serie de datos de neuronas. Según la Figura 20, el rendimiento es casi similar en todos los casos, aunque la Figura 19 indica que (512,160,512) es la configuración más precisa. Como en casos anteriores, se sigue cumpliendo que a mayor número de neuronas, mayor tiempo por ciclo. Debido a que la configuración más precisa posee un tiempo por ciclo elevado respecto a las demás configuraciones, tiene más sentido escoger la configuración (310,100,310) que ofrece una precisión un poco menor, pero mucho mejor tiempo por ciclo, sólo 17 segundos. En cuanto a la cuarta serie de datos, la primera capa convolucional 2D y la capa densa se han fijado para 300 neuronas, mientras que se ha variado el número de neuronas de la segunda capa convolucional 2D. Figura 21. Precisión de clasificación (Classification Accuracy) frente a relación señal/ruido (SNR) para la cuarta serie de datos de neuronas. 32
Figura 22.Rendimiento (performance) y tiempo por ciclo (Time per Epoch) para la cuarta serie de datos de neuronas. En la Figura 22, se observa que el rendimiento es casi similar en todos los casos, mientras que el tiempo por ciclo aumenta levemente con el número de neuronas. Por otra parte, en la Figura 21, se obtiene que la configuración (300,100,300) posee la mejor precisión de clasificación, por lo que se le considera la mejor configuración de esta serie. En este caso, la configuración óptima se asemeja bastante con la configuración óptima de la tercera serie de datos. Para la quinta serie de datos, se usan configuraciones estudiadas anteriormente pero que no se habían comparado entre ellas. Esta comparación, como las dos series de datos anteriores, se centra en configuraciones que tienen la misma proporción de neuronas entre la segunda capa convolucional 2D y el resto de capas. Figura 23. Precisión de clasificación (Classification Accuracy) frente a relación señal/ruido (SNR) para la quinta serie de datos de neuronas. 33
Figura 24.Rendimiento (performance) y tiempo por ciclo (Time per Epoch) para la quinta serie de datos de neuronas. En la Figura 24, se observa que el rendimiento es casi similar, aunque el tiempo por ciclo aumenta con el número de neuronas, un patrón que ya observamos anteriormente. Otro patrón interesante de esta serie de datos se observa en la Figura 23, donde se muestra que la precisión de clasificación aumenta con el número de neuronas. Por último, la sexta serie de datos mantiene la proporción de neuronas entre la segunda capa convolucional 2D y el resto de capas, pero utiliza un menor número de neuronas. La intención de esta prueba es obtener un menor tiempo por ciclo manteniendo el rendimiento. Figura 25. Precisión de clasificación (Classification Accuracy) frente a relación señal/ruido (SNR) para la sexta serie de datos de neuronas. 34
Figura 26.Rendimiento (performance) y tiempo por ciclo (Time per Epoch) para la sexta serie de datos de neuronas. Como muestra la Figura 26, tal y como se esperaba el tiempo por ciclo es menor, mientras que, como se observa en la Figura 25, se ha logrado mantener la precisión de clasificación. Por otra parte, volviendo a la Figura 26, se observa que el rendimiento mejora levemente para las configuraciones que usan menos neuronas. En esta última serie se ha demostrado que se puede mantener el rendimiento de una red neuronal y, simultáneamente, reducir su tiempo por ciclo. Aunque debido a que su precisión de clasificación no es tan alta como en series de datos anteriores, se elegirá una configuración final con un mayor número de neuronas. Tras realizar todas estas pruebas, llegamos a la conclusión de que el tipo de configuración neuronal ideal se corresponde con aquella que posee el mismo número de neuronas tanto en la primera capa convolucional 2D como en la capa densa. Mientras que la proporción de neuronas entre la segunda capa convolucional 2D y el resto de capas resulta indiferente, siempre que esta segunda capa no tenga un número demasiado pequeño de neuronas. 35
4.3. Configuración final Teniendo en cuenta los resultados obtenidos mediante el ajuste de los diferentes hiperparámetros de la red neuronal, se procede a seleccionar una configuración definitiva para la red y a mostrar sus resultados. Utilizando la arquitectura del clasificador expuesta anteriormente en el apartado del mismo nombre, se han asignado valores definitivos para los hiperparámetros estudiados en el apartado anterior. De esta forma, el valor del tamaño de lote ha permanecido idéntico al de la configuración inicial, 1024, por funcionar bastante bien con nuestro dataset, teniendo una buena precisión de clasificación y obteniendo de los mejores tiempos por ciclo. En cuanto al dropout, se le ha asignado un valor de 0,25 por tener la mayor precisión de clasificación, además ofrece un buen rendimiento y no hay diferencias con los demás respecto al tiempo por ciclo, como se pudo observar en los resultados expuestos en el apartado “Variación del dropout”. Por otra parte, la tasa de aprendizaje será constante y mantendrá su valor por defecto de 0,01. Finalmente, se le han asignado 300 neuronas a la primera capa convolucional 2D y la primera capa densa, mientras que la segunda capa convolucional 2D posee 200 neuronas. Por lo tanto, la configuración sigue el patrón que aporta mejores resultados en las variaciones efectuadas, teniendo la primera capa convolucional 2D y la primera capa densa el mismo valor. Además, esta configuración posee un tiempo por ciclo de 19 segundos, por lo que no hay mucha diferencia con la configuración inicial. 36
En cuanto a los resultados obtenidos, la Figura 27 nos muestra las pérdidas de entrenamiento (train loss) y de validación (val loss) frente al número de ciclos: Figura 27. Pérdidas de entrenamiento (train loss) y de validación (val loss) frente al número de ciclos para la configuración final. Como se puede observar, las pérdidas disminuyen con el número de ciclos. Esto, nos indica que la red neuronal está funcionando correctamente. Por otra parte, las matrices de confusión nos indican, como se definió anteriormente, si la modulación verdadera de la señal coincide con la modulación que la red neuronal predice. Para ello, se representan las modulaciones verdaderas en el eje vertical, mientras que la modulación que predice la red neuronal viene indicada en el eje horizontal. La leyenda de la derecha, nos indica el porcentaje con el que nuestra red predice una cierta modulación. Si las modulaciones verdaderas coinciden con las modulaciones que predice nuestra red, debería observarse una diagonal con coloración azul en nuestra matriz de confusión. Se han realizado matrices de confusión para relaciones señal/ruido desde -20dB hasta 18dB a un intervalo de 2dB (véase Anexo 2). A continuación, se representan algunas de las matrices de confusión más representativas: 37
Figura 28. Matrices de confusión correspondientes a la configuración final para relaciones señal/ruido (SNR) de -20dB y -4dB Figura 29. Matriz de confusión correspondiente a la configuración final para una relación señal/ruido (SNR) de 18dB Como se puede observar, y es lógico, a relaciones señal/ruido (SNR) muy negativas (Figura 28) nuestra red neuronal apenas es capaz de predecir correctamente las modulaciones. A medida que la relación señal/ruido se va volviendo positiva, la predicción de nuestra red neuronal convolucional aumenta, alcanzando casi un 70% de precisión en la clasificación de modulaciones para una SNR de 18dB, como muestra la Figura 29. 38
Los mayores errores de clasificación de la red ocurren con las modulaciones QAM16 y WBFM. La modulación QAM16 suele ser clasificada incorrectamente como QAM64, un error que puede llegar a ser comprensible debido a que ambas clases utilizan una técnica de modulación similar. En cuanto a la modulación WBFM, esta suele ser confundida con la modulación AM-DSB. Aunque en este caso no hay evidencias tan claras de a qué se debe el error, puede que ocurra debido a que ambas son las únicas modulaciones analógicas presentes en el dataset. Por último, se obtiene una última gráfica (Figura 30) que representa la precisión de clasificación (Classification Accuracy) de nuestra red neuronal para las modulaciones de nuestro dataset 2016.10B. La representación abarca las relaciones señal/ruido desde -20dB hasta 18dB. Figura 30. Precisión de clasificación (Classification Accuracy) frente a relación señal/ruido (SNR) de nuestra configuración final. 39
5. RESUMEN Y CONCLUSIONES 5.1. Resumen En este trabajo, se usa Python para observar cómo afecta el valor de los distintos hiperparámetros de una red neuronal convolucional a su precisión de predicción. Para ello, se utiliza un dataset proporcionado por DeepSig, con 10 modulaciones de radio y relaciones señal/ruido de -20dB hasta 18dB. A lo largo del documento, se exponen los conceptos básicos de redes neuronales, así como la arquitectura y el funcionamiento de una red neuronal.Por último, se explica el procedimiento seguido para encontrar, utilizando los nuevos avances en aprendizaje profundo, una configuración de red neuronal que sea capaz de predecir correctamente el tipo de modulación de cada señal. 5.2. Conclusiones Las tendencias observadas mediante la variación de los hiperparámetros de la red han contribuido a mejorar el proceso de clasificación de modulaciones. Gracias a ello, la red neuronal convolucional propuesta ha logrado obtener una precisión de clasificación cercana al 70% haciendo uso de la configuración final. Entre las tendencias observadas en el estudio, se evidencia que un tamaño de lote menor a 1024 aumenta el tiempo por ciclo y disminuye la precisión de clasificación, por lo que el tamaño de lote debe ser igual o mayor a 1024 para lograr una buena configuración. En el caso del dropout, un hiperparámetro con gran peso en la correcta clasificación de la red, no tiene influencia en el tiempo por ciclo de la red neuronal. Para este hiperparámetro, se aconseja el uso de valores entre 0,25 y 0,35, pues aunque el rendimiento es ligeramente menor, aumenta la precisión de clasificación. Por otra parte, para la tasa de aprendizaje es aconsejable un valor constante y en nuestro caso ni se ha variado su valor, por lo que no podemos concluir nada más acerca de este hiperparámetro. 40
Por último, la variación de neuronas ha evidenciado que mantener el mismo número de neuronas tanto en la primera capa convolucional 2D como en la capa densa es una estrategia útil, pues permite mejorar la precisión de clasificación sin que el tiempo por ciclo se vea afectado. Se desaconseja el uso de valores superiores a 300 neuronas en las dos capas nombradas anteriormente, esto se debe a que el tiempo por ciclo empieza a aumentar considerablemente sin traducirse en una mejora considerable de la precisión de clasificación. Mientras que la segunda capa convolucional no debe poseer valores inferiores a la mitad de neuronas que se usen en la primera capa, pues si esto ocurre el entrenamiento no es óptimo. Mediante las conclusiones obtenidas, se facilita la optimización de redes neuronales convolucionales para su uso en detección y clasificación de modulaciones de señales de radio. Por lo tanto, la red optimizada es capaz de identificar el tipo de modulación de la señal recibida, lo que nos permite configurar el receptor de radio y ajustar el tipo de modulación de forma dinámica, permitiendo la optimización de las comunicaciones y haciendo un uso más eficiente del espectro electromagnético. 41
ANEXO Anexo 1 En este anexo se incluye el código, correspondiente a la configuración final, realizado en Kaggle haciendo uso del lenguaje de programación Python: # Import all the things we need --- # by setting env variables before Keras import you can set up which backend and which GPU it uses %matplotlib inline import os,random os.environ["KERAS_BACKEND"]="theano" #os.environ["KERAS_BACKEND"] = "tensorflow" os.environ["THEANO_FLAGS"]="device=cuda%d"%(1) import numpy as np import theano as th import theano.tensor as T from keras.utils import np_utils import keras.models as models from keras.layers.core import Reshape,Dense,Dropout,Activation,Flatten from keras.layers.noise import GaussianNoise from keras.layers.convolutional import Convolution2D, MaxPooling2D, ZeroPadding2D from keras.regularizers import * from keras.optimizers import adam import matplotlib.pyplot as plt import seaborn as sns import pickle,random,sys,keras # Load the dataset ... # You will need to seperately download or generate this file with open("../input/modulacion-radio/RML2016.10b.dat",'rb')as file: Xd =pickle.load(file,encoding='bytes') snrs,mods =map(lambda j: sorted(list(set(map(lambda x: x[j], Xd.keys())))), [1,0]) X=[] lbl =[] for mod in mods: for snr in snrs: X.append(Xd[(mod,snr)]) for iin range(Xd[(mod,snr)].shape[0]): lbl.append((mod,snr)) X=np.vstack(X) 48
# Partition the data # into training and test sets of the form we can train/test on # while keeping SNR and Mod labels handy for each np.random.seed(2016) n_examples =X.shape[0] n_train =n_examples // 2 train_idx =np.random.choice(range(0,n_examples), size=n_train, replace=False) test_idx =list(set(range(0,n_examples))-set(train_idx)) X_train =X[train_idx] X_test =X[test_idx] def to_onehot(yy): yy1 =np.zeros([len(yy), max(yy)+1]) yy1[np.arange(len(yy)),yy] =1 return yy1 Y_train =to_onehot(list(map(lambda x: mods.index(lbl[x][0]), train_idx))) Y_test =to_onehot(list(map(lambda x: mods.index(lbl[x][0]), test_idx))) in_shp =list(X_train.shape[1:]) print(X_train.shape, in_shp) classes =mods # Build VT-CNN2 Neural Net model using Keras primitives -- # - Reshape [N,2,128] to [N,1,2,128] on input # - Pass through 2 2DConv/ReLu layers # - Pass through 2 Dense layers (ReLu and Softmax) # - Perform categorical cross entropy optimization from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten, Conv2D, MaxPooling2D , Reshape , ZeroPadding2D,BatchNormalization from tensorflow.keras.callbacks import EarlyStopping #model = Sequential() dr =0.25 # dropout rate (%) model =Sequential() model.add(Reshape([1]+in_shp, input_shape=in_shp)) 49
model.add(ZeroPadding2D((0,2))) model.add(Conv2D(300,1,3, padding='valid', activation="relu", name="conv1", kernel_initializer='glorot_uniform',data_format='channels_first')) model.add(Dropout(dr)) model.add(ZeroPadding2D((0,2))) model.add(Conv2D(200,2,3, padding='valid', activation="relu", name="conv2", kernel_initializer='glorot_uniform',data_format='channels_first')) model.add(Dropout(dr)) model.add(Flatten()) model.add(Dense(300, activation='relu', kernel_initializer='he_normal', name="dense1")) model.add(Dropout(dr)) model.add(Dense( len(classes), kernel_initializer='he_normal', name="dense2" )) model.add(Activation('softmax')) model.add(Reshape([len(classes)])) model.compile(loss='categorical_crossentropy', optimizer='adam') model.summary() from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten, Conv2D, MaxPooling2D , Reshape , ZeroPadding2D,BatchNormalization from tensorflow.keras.callbacks import EarlyStopping # Set up some params nb_epoch =100 # number of epochs to train on batch_size =1024 # training batch size # perform training ... # - call the main training loop in keras for our network+dataset filepath ='convmodrecnets_CNN2_0.5.wts.h5' history =model.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=nb_epoch, # show_accuracy=False, ESTE ARGUMENTO YA NO EXISTE, POR ESO EL COMENTARIO verbose=2, validation_data=(X_test, Y_test), callbacks =[ keras.callbacks.ModelCheckpoint(filepath, monitor='val_loss', verbose=0, save_best_only=True, mode='auto'), 50
keras.callbacks.EarlyStopping(monitor='val_loss', patience=5, verbose=0, mode='auto') ]) # we re-load the best weights once training is finished model.load_weights(filepath) # Show simple version of performance score =model.evaluate(X_test, Y_test, verbose=0, batch_size=batch_size) print (score) # Show loss curves plt.figure() plt.title('Training performance') plt.plot(history.epoch, history.history['loss'], label='train loss') plt.plot(history.epoch, history.history['val_loss'], label='val loss') plt.legend() def plot_confusion_matrix(cm, title='Confusion matrix', cmap=plt.cm.Blues, labels=[]): plt.imshow(cm, interpolation='nearest', cmap=cmap) plt.title(title) plt.colorbar() tick_marks =np.arange(len(labels)) plt.xticks(tick_marks, labels, rotation=45) plt.yticks(tick_marks, labels) plt.tight_layout() plt.ylabel('True label') plt.xlabel('Predicted label') # Plot confusion matrix test_Y_hat =model.predict(X_test, batch_size=batch_size) conf =np.zeros([len(classes),len(classes)]) confnorm =np.zeros([len(classes),len(classes)]) for iin range(0,X_test.shape[0]): j=list(Y_test[i,:]).index(1) k=int(np.argmax(test_Y_hat[i,:])) conf[j,k] =conf[j,k] +1 for iin range(0,len(classes)): confnorm[i,:] =conf[i,:] /np.sum(conf[i,:]) 51
plot_confusion_matrix(confnorm, labels=classes) # Plot confusion matrix acc ={} for snr in snrs: # extract classes @ SNR test_SNRs =list(map(lambda x: lbl[x][1], test_idx)) test_X_i =X_test[np.where(np.array(test_SNRs)==snr)] test_Y_i =Y_test[np.where(np.array(test_SNRs)==snr)] # estimate classes test_Y_i_hat =model.predict(test_X_i) conf =np.zeros([len(classes),len(classes)]) confnorm =np.zeros([len(classes),len(classes)]) for iin range(0,test_X_i.shape[0]): j=list(test_Y_i[i,:]).index(1) k=int(np.argmax(test_Y_i_hat[i,:])) conf[j,k] =conf[j,k] +1 for iin range(0,len(classes)): confnorm[i,:] =conf[i,:] /np.sum(conf[i,:]) plt.figure() plot_confusion_matrix(confnorm, labels=classes, title="ConvNet Confusion Matrix (SNR=%d) using CNN"%(snr)) cor =np.sum(np.diag(conf)) ncor =np.sum(conf) -cor print("snr",snr) #OTRO PRINT MAS APARTE DEL CÓDIGO ORIGINAL print ("Overall Accuracy: ", cor /(cor+ncor)) acc[snr] =1.0*cor/(cor+ncor) # Save results to a pickle file for plotting later print(acc) fd =open('results_cnn2_d0.5.dat','wb') pickle.dump( ("CNN2",0.5, acc) , fd ) # Plot accuracy curve plt.plot(snrs, list(map(lambda x: acc[x], snrs))) plt.xlabel("Signal to Noise Ratio") plt.ylabel("Classification Accuracy") plt.title("CNN Classification Accuracy on dataset RadioML 2016.10 Beta") 52
Anexo 2 Matrices de confusión, para relaciones señal/ruido desde -20dB hasta 18dB a un intervalo de 2dB, obtenidas con la configuración final: 53
54
55
56