Deteccion Carcinoma Invasivo Ductal usando Red Convolucional

Aprenderemos a utilizar una Red Neuronal Convolucional en un conjunto de datos de histopatología del mundo real.

Pasaremos por el proceso de preparar los datos para su clasificación y luego utilizaremos la red neuronal para clasificar las imágenes.

También discutiré la arquitectura del modelo utilizado y algunos de los hiperparámetros afinados al construir el modelo.

Las secciones de este blog son las siguientes:

  • Introduccion Caso Estudio
  • Entendiendo el Set de Datos
  • Pre-Procesamiento de Imagenes
  • Arquitectura del Modelo
  • Compilado
  • Aumento de Datos
  • Entrenamiento
  • Prediccion

Asumo que el lector sabe lo que son las redes neuronales convolucionales y su mecanismo básico de funcionamiento.

En este blog, sólo discutiremos el código que es importante en el contexto del aprendizaje profundo, y también evitaremos las explicaciones repetidas del código utilizado más de una vez.

Introduccion

El aprendizaje profundo en el campo de la salud se utiliza para identificar patrones, clasificar y segmentar imágenes médicas. Como con la mayoría de las tareas relacionadas con la imagen, se utilizan redes neuronales convolucionales para hacer esto.

El problema de clasificación que se aborda aquí es clasificar los portaobjetos de histopatología del carcinoma ductal invasivo (CDI) como maligno o benigno.

El CID es un tipo de cáncer de mama, en el que el cáncer se ha diseminado al tejido mamario circundante.

Los tumores cancerosos se pueden clasificar en dos tipos: malignos y benignos. Un tumor benigno es aquel que no invade los tejidos circundantes, mientras que un tumor maligno es aquel que puede extenderse a los tejidos circundantes o a otras partes del cuerpo.

Entendiendo el Set de Datos

El set de datos utilizado puede ser descargado aqui.

El conjunto de datos consiste en 162 imágenes de diapositivas de montaje completo de pacientes de cáncer de mama escaneados a 40x. De ahí se extrajeron 277.524 parches de tamaño 50 x 50, de los cuales 198.738 son CID negativos (benignos) y 78.786 son CID positivos (malignos).

El nombre de archivo de cada parche es del formato:

u_xX_yY_classC.png → ejemplo 10253_idx5_x1351_y1101_class0.png

Donde u es el ID del paciente (10253_idx5), X es la coordenada x de donde se cortó este parche, Y es la coordenada y de donde se cortó este parche, y C indica la clase donde 0 es no-IDC (benigno) y 1 es IDC (maligno).

El conjunto de datos consta de 279 carpetas, con subcarpetas 0 y 1 dentro de cada una de las 279 carpetas.

Separando Set de Datos

Primero crearemos una carpeta llamada “Dataset”, contendra todas las imagenes descargadas. Adentro crearemos 2 carpetas llamadas “test_set” y “training_set” Adentro de estas dos carpetas vamos a separar los datos en “Benigno” y “Maligno”.

Separaremos los datos en un rango 80 / 20. Daremos 80% de las imagenes benignas y malignas al “training_set”.

Pondremos 20% de las imagenes en el “test_set”.

Ahora que tenemos las imagenes procesadas en las carpetas indicadas vamos a empezar a crear la red convolucional en nuestro editor de codigo de preferencia. En mi caso usare “Spyder”.

Arquitectura del Modelo

Empezaremos importando todos los paquetes / librerias que usaremos para predecir carcinoma invasivo ductal.

Si deseas averiguar mas sobre estas librerias puedes ver la documentacion de keras.

La arquitectura consiste en capas convolucionales, capas de agrupamiento máximo, capas de abandono (Dropout) y capas completamente conectadas.

La primera capa es una capa convolucional con 32 filtros de tamaño 3 x 3. También tenemos que especificar la forma de entrada en la primera capa, que es 50 x 50 x 3 en nuestro caso.

Utilizaremos la función de activación de la unidad lineal rectificada (ReLU) para todas las capas excepto la capa de salida final. ReLU es la opción más común para la función de activación en las capas ocultas y ha demostrado que funciona bastante bien.

La segunda capa es una capa de pooling. Las capas de pooling se utilizan para reducir la dimensión. El Max Pooling con una ventana 2×2 sólo considera el valor máximo en la ventana 2×2.

La tercera capa es de nuevo una capa convolucional de 64 filtros, cada uno de tamaño 3 x 3, seguida de otra capa de pooling máximo de ventana 2×2. Normalmente, el número de filtros en la capa convolucional crece después de cada capa. Las primeras capas con menor número de filtros aprenden características simples de las imágenes mientras que las capas más profundas aprenden características más complejas.

Las dos capas siguientes son de nuevo capas convolucionales con el mismo tamaño de filtro pero con un número creciente de filtros; 128 y 256.

Necesitamos aplanar la salida del mapa de características 3D de la capa convolucional a vectores de características 1D antes de añadir las capas completamente conectadas. Aquí es donde entra en juego la capa de aplanamiento.

La siguiente capa es una capa con una tasa de caída de 0.5. Una capa de salida con una tasa de salida de 0,5 significa que el 50% de las neuronas se apagarán aleatoriamente. Esto ayuda a prevenir el sobreajuste haciendo que todas las neuronas aprendan algo sobre los datos y no dependan sólo de unas pocas neuronas. La caída aleatoria de neuronas durante el entrenamiento significa que otras neuronas tendrán que hacer el trabajo de las neuronas desactivadas, generalizando así mejor y previniendo el sobreajuste.

El valor 0,5 se toma del documento original de Hinton (2012), que ha demostrado ser muy eficaz. Estas capas de salida se añaden después de cada una de las capas completamente conectadas antes de la salida. La deserción también reduce el tiempo de entrenamiento para cada época.

La siguiente capa densa (capa completamente conectada) tiene 128 neuronas. A esto le sigue otra capa con una tasa de caída de 0,5

La siguiente capa es otra capa densa con 128 neuronas.

La capa de salida final es otra capa densa que tiene un número de neuronas igual al número de clases. La función de activación en esta capa es sigmoide porque el problema en cuestión es un problema de clasificación binaria. Para problemas de clasificación multiclase, la función de activación debe ajustarse a softmax.

Compilación

El modelo se compila con la función de pérdida de entropía cruzada binaria y se utiliza el optimizador Adam. La métrica de ‘accuracy’ se utiliza para evaluar el modelo.

Adam es un algoritmo de optimización que actualiza los pesos de la red de forma iterativa.

Aunque el ritmo de aprendizaje inicial de Adam se puede establecer (lo hemos establecido en 0,00001 en nuestro caso), éste es el ritmo de aprendizaje inicial y el ritmo de aprendizaje de cada parámetro se adapta a medida que comienza la formación. Así es como Adam (abreviatura de estimación del momento adaptativo) es diferente del descenso estocástico por gradiente, que mantiene una única velocidad de aprendizaje para todas las actualizaciones de peso. Una explicación detallada del algoritmo de optimización de Adam se puede encontrar aquí

El ritmo de aprendizaje determina la rapidez con la que estamos ajustando los pesos de nuestra red hacia los mínimos locales. Una velocidad de aprendizaje demasiado alta puede resultar en cambios de peso tan altos que podría resultar en sobrepasar los mínimos locales. Esto hace que el error de entrenamiento o validación fluctúe drásticamente entre épocas consecutivas. Una tasa de aprendizaje demasiado baja puede resultar en un tiempo más largo para entrenar a nuestra red. Por lo tanto, la velocidad de aprendizaje es uno de los hiperparámetros más importantes que hay que tener en cuenta a la hora de construir el modelo.

Aumento de Datos

Generalmente, mientras más datos tengamos, mejor será el aprendizaje profundo. Keras ImageDataGenerator genera imágenes en tiempo real durante el entrenamiento utilizando el aumento de datos. Las transformaciones se realizan sobre la marcha en los minilotes. El aumento de datos ayuda a generalizar el modelo al reducir la capacidad de la red para adaptar los datos de formación. Rotación, volteo vertical y horizontal son algunas de las técnicas comunes de aumento de datos que se utilizan.

Keras ImageDataGenerator proporciona una variedad de técnicas de aumento de datos. Sin embargo, sólo utilizaremos algunos de ellos.

Un tumor de histopatología etiquetado como maligno sigue siendo maligno si se gira 20 grados y se voltea verticalmente.

Entrenando el Modelo

El entrenamiento del modelo mediante un GPU acelera el proceso. Para ello, necesitarás una GPU NVIDIA.

Fije el número de epochs inicialmente a 10 para prueba, sin embargo los mejores resultados los obtuve con un número alto, en este caso 80, y use un método de regularización llamado Parada Temprana “EarlyStopping”.

La parada temprana es un método utilizado para evitar el Overfitting mediante la parada del proceso de entrenamiento cuando el parámetro que se debe observar no mejora durante un cierto número de epochs.

En nuestro caso, le decimos a EarlyStopping que controle la pérdida de valor y si no mejora continuamente durante 3 epochs, detenga el proceso de entrenamiento”.

El tamaño de lote se ajusta normalmente a una potencia de 2 porque es más eficiente desde el punto de vista informático. encontramos mejores resultados con 256 numero de lotes (batch_size).

Usamos otra funcion de Keras llamada ModelCheckpoint

El punto de control del modelo se utiliza para guardar el modelo. El parámetro monitor nos permite establecer una métrica que queremos vigilar. En nuestro caso, sólo guardamos el modelo cuando la pérdida de validación es mínima. Guardamos el mejor modelo para utilizarlo más tarde para hacer predicciones y así evaluar el rendimiento del modelo.

Combinando estas dos llamadas de retorno, se guarda el mejor modelo (que tiene la mínima pérdida de validación) y, a continuación, si la pérdida de validación no mejora (disminuye) en los próximos 3 períodos (establecido por EarlyStopping), se detiene la formación del modelo.

Debido a que estamos usando ImageDataGenerator, usamos .fit_generator para entrenar al modelo. Lo configuramos como una variable ‘entrenamiento’, ya que más tarde graficaremos la pérdida de entrenamiento y la pérdida de validación. Esto nos ayuda a hacernos una idea de la varianza, es decir, la diferencia entre el error de entrenamiento y el error de validación del conjunto.

Para la validación, usaremos test_set.

Ahora seleccionaremos todo este codigo y lo correremos (en mi caso en Spyder presiona Ctrl + Alt + Enter).

El entrenamiento empezara y tomara bastante tiempo, por lo menos alrededor de 1 dia (dependiendo de tu GPU / CPU).

Prediccion

Primero cargamos los pesos del modelo entrenado.

El siguiente paso es procesar la imagen input que clasificaremos. (Estamos probando con una imagen benigna)

Ya que sabemos que la imagen es benigna podemos decir que el resultado que de el modelo 0 o 1 es benigno, en nuestro caso 1 es benigno 0 es maligno.

Seleccionamos todo esto y podemos ver los resultados del modelo

Related Articles

Preguntas

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.