Una Introducción Práctica al Deep Learning con Caffe y Python

 

Una Introducción Práctica a la profunda aprendizaje con Caffe y Python

El aprendizaje profundo es la nueva gran tendencia en el aprendizaje de la máquina. Tuvo muchos éxitos recientes en la visión artificial, reconocimiento automático del habla y el procesamiento del lenguaje natural.

El objetivo de este blog es para darle una introducción práctica al aprendizaje profundo. Para ello, vamos a construir un clasificador de la imagen del gato / perro usando un algoritmo de aprendizaje profundo llamada red neuronal de convolución (CNN) y un conjunto de datos Kaggle .

Este mensaje se divide en 2 partes principales. La primera parte cubre algunos conceptos básicos detrás de aprendizaje profundo, mientras que la segunda parte está estructurada en un formato de tutorial práctico.

En la primera parte de la guía de aprendizaje práctico (sección 4), vamos a construir un clasificador gato imagen / perro usando una red neuronal de convolución a partir de cero. En la segunda parte del tutorial (sección 5), vamos a cubrir una técnica avanzada para la formación de redes neuronales convolucionales llamados aprendizaje transferencia. Vamos a utilizar un código Python y un marco de aprendizaje profundo de código abierto popular llamado Caffe para construir el clasificador. Nuestro clasificador será capaz de lograr una precisión de la clasificación de 97%.

Para el final de este post, usted entenderá cómo el trabajo de convolución redes neuronales, y obtendrá familiarizados con los pasos y el código para la construcción de estas redes.

El código fuente de este tutorial se puede encontrar en este repositorio GitHub .

1. Definición del problema

En este tutorial, vamos a utilizar un conjunto de datos de Kaggle . El conjunto de datos se compone de 25.000 imágenes de perros y gatos.

Nuestro objetivo es construir un algoritmo de aprendizaje automático capaz de detectar correctamente el animal (perro o gato) en nuevas imágenes no se ven.

En el aprendizaje de máquina, este tipo de problemas se llama clasificación.

Texto alt

2. Clasificación a partir tradicional Machine Learning vs aprendizaje profundo

Clasificación a partir de un algoritmo de aprendizaje automático tiene 2 fases:

  • Fase de formación: En esta fase, que entrenar a un algoritmo de aprendizaje automático utilizando un conjunto de datos compuesta de las imágenes y sus correspondientes etiquetas.
  • fase de predicción: En esta fase, utilizamos el modelo entrenado para predecir las etiquetas de las imágenes no se ven.

La fase de entrenamiento para un problema de clasificación de imágenes tiene 2 pasos principales:

  1. Extracción de Características:. En esta fase, utilizamos el conocimiento del dominio para extraer nuevas características que serán utilizados por el algoritmo de aprendizaje automático HoG y SIFT son ejemplos de características utilizadas en la clasificación de imágenes.
  2. Formación del modelo: En esta fase, que utilizan un conjunto de datos limpia compuesto por las características de imágenes y de las correspondientes etiquetas para entrenar el modelo de aprendizaje automático.

En la fase predicition, aplicamos el mismo proceso de extracción de características de las nuevas imágenes y pasamos a las características del algoritmo de aprendizaje de máquina entrenada para predecir la etiqueta.

Texto alt

 

 

La principal diferencia entre el aprendizaje tradicional de la máquina y los algoritmos de aprendizaje profundo está en la ingeniería característica. En algoritmos de aprendizaje automático tradicionales, que necesitamos para hacer a mano las características. Por el contrario, en el aprendizaje profundo algoritmos incluyen la ingeniería se realiza automáticamente por el algoritmo. ingeniería característica es difícil, consume tiempo y requiere experiencia en el campo. La promesa de aprendizaje profundo es algoritmos de aprendizaje automático más precisos en comparación con la máquina de aprendizaje tradicional con menos o ninguna característica ingeniería.

Texto alt

3. Un curso acelerado en el aprendizaje profundo

El aprendizaje profundo se refiere a una clase de redes neuronales artificiales (RNAs) compuestos de muchas capas de procesamiento. RNAs existe desde hace muchas décadas, pero los intentos de la formación de profundos arquitecturas de redes neuronales no avance hasta que el trabajo de los mediados de los años 2000 de Geoffrey Hinton. Además de las innovaciones algorítmicas, el aumento de las capacidades de cálculo utilizando las GPU y la recogida de grandes conjuntos de datos son todos factores que ayudaron en la reciente oleada de aprendizaje profundo.

3.1. Las redes neuronales artificiales (RNA)

Las redes neuronales artificiales (RNA) son una familia de modelos de aprendizaje automático inspirados en las redes neuronales biológicas.

Redes Neuronales Artificiales vs. Redes neuronales biológicas

Las neuronas biológicas son los componentes centrales del cerebro humano. Una neurona se compone de un cuerpo celular, las dendritas y un axón. Procesa y transmitir información a otras neuronas mediante la emisión de señales eléctricas. Cada neurona recibe señales de entrada de sus dendritas y produce señales de salida a lo largo de su axón. El axón se ramifica y se conecta a través de las sinapsis en las dendritas de otras neuronas.

Un modelo básico para el funcionamiento de las neuronas es la siguiente: Cada sinapsis tiene una resistencia que se puede aprender y controlar la fuerza de la influencia de una neurona a otra. Las dendritas transmiten las señales en el cuerpo de la neurona diana, zona que siempre suman. Si la suma final está por encima de un cierto umbral, la neurona son despedidos, el envío de un pico a lo largo de su axón. [1]

neuronas artificiales se inspiran en las neuronas biológicas, y tratan de formular el modelo explicó anteriormente en una forma computacional. Una neurona artificial tiene un número finito de entradas con los pesos asociados a ellos, y una función de activación (también llamada función de transferencia). La salida de la neurona es el resultado de la función de activación aplicada a la suma ponderada de las entradas. neuronas artificiales se conectan entre otros para formar redes neuronales artificiales.

Texto alt

Feedforward Redes Neuronales

Feedforward redes neuronales son la forma más simple de las redes neuronales artificiales.

Estas redes tienen 3 tipos de capas: capa de entrada, una capa oculta y la capa de salida. En estas redes, los datos se mueve desde la capa de entrada a través de los nodos ocultos (si existe) y a los nodos de salida.

A continuación se muestra un ejemplo de una red neuronal feedforward plenamente conectado con 2 capas ocultas. “Totalmente conectado” significa que cada nodo está conectado a todos los nodos de la capa siguiente.

Tenga en cuenta que, el número de capas ocultas y su tamaño son los únicos parámetros libres. Los más grandes y más profundas las capas ocultas, los patrones más complejos que pueden modelar en teoría.

Texto alt

funciones de activación

funciones de activación transforman la suma ponderada de las entradas que se dedica a las neuronas artificiales.Estas funciones deben ser no lineal para codificar patrones complejos de los datos. Las funciones de activación más populares son sigmoide, tanh y RELU. RELU es la función de activación más popular en las redes neuronales profundas.

Texto alt

Formación de redes neuronales artificiales

El objetivo de la fase de entrenamiento es aprender los pesos de la red. Necesitamos 2 elementos para entrenar una red neuronal artificial:

  • datos de entrenamiento: En el caso de la clasificación de imágenes, los datos de entrenamiento se compone de imágenes y las etiquetas correspondientes.
  • pérdida de función: una función que mide la inexactitud de las predicciones.

Una vez que tenemos los 2 elementos anteriormente, entrenar la red neuronal utilizando un algoritmo llamado propagación hacia atrás junto con el descenso de gradiente (o uno de sus derivados). Para una explicación detallada de propagación hacia atrás, recomiendo este artículo .

3.2. Convolucionales Redes Neuronales (CNNs o ConvNets)

redes neuronales convolucionales son un tipo especial de las redes de alimentación de avance. Estos modelos están diseñados para emular el comportamiento de una corteza visual. CNNs funcionan muy bien en tareas de reconocimiento visual. CNNs tienen capas especiales llamadas capas y capas de fondo común convolucionales que permiten a la red para codificar ciertas propiedades imágenes.

Texto alt

capa de convolución

Esta capa consiste en un conjunto de filtros que se pueden aprender que se deslizan sobre la imagen espacialmente, el cálculo de productos escalares entre las entradas del filtro y la imagen de entrada. Los filtros deben extenderse a toda la profundidad de la imagen de entrada. Por ejemplo, si queremos aplicar un filtro de tamaño 5×5 a una imagen en color de tamaño 32×32, a continuación, el filtro debe tener una profundidad de 3 (5x5x3) para cubrir todos los canales de 3 colores (rojo, verde, azul) de la imagen. Estos filtros se activarán cuando ven misma estructura específica en las imágenes.

Texto alt

capa de puesta en común

El agrupamiento es una forma de no-lineal de reducción de muestreo. El objetivo de la capa de la agrupación es reducir progresivamente el tamaño espacial de la representación para reducir la cantidad de parámetros y la computación en la red, y por lo tanto para controlar también overfitting. Hay varias funciones para implementar la puesta en común entre los que la agrupación de max es la más común. Puesta en común se aplica a menudo con filtros de tamaño 2×2 aplicados con un paso de 2 en cada rebanada de profundidad. Una capa de puesta en común de tamaño 2×2 con paso de 2 reduce la imagen de entrada a un cuarto de su tamaño original. [2]

Texto alt

Convolucional Redes Neuronales Arquitectura

La arquitectura más simple de un redes neuronales convolucionales comienza con una capa de entrada (imágenes) seguido de una secuencia de capas convolucionales y capas de fondo común, y termina con capas conectadas totalmente. Las capas convolucionales suelen ir seguidas de una capa de funciones de activación RELU.

La convolución, la puesta en común y las capas RELU actuar como extractores de características que se pueden aprender, mientras que las capas totalmente conectados actúa como un clasificador de aprendizaje automático.Además, las primeras capas de la red codifican patrones genéricos de las imágenes, mientras que las capas posteriores codifican los detalles patrones de las imágenes.

Tenga en cuenta que sólo las capas y capas convolucionales conectados completamente tienen pesos. Estos pesos se aprenden en la fase de entrenamiento.

Texto alt

4. La construcción de un gato / perro usando un clasificador de red neuronal convolucional

En esta sección, vamos a implementar un clasificador gato / perro usando una red neuronal de convolución.Vamos a utilizar un conjunto de datos a partir de Kaggle Perros vs Gatos competencia . Para implementar la red neuronal de convolución, vamos a utilizar un marco de aprendizaje profundo llamado Caffe y algo de código Python.

4.1 Obtención de Perros y Gatos de Datos

En primer lugar, tenemos que descargar 2 conjuntos de datos de la página de la competencia : train.zip y test1.zip. El archivo contiene train.zip gatos y perros marcados imágenes que vamos a utilizar para entrenar a la red. El archivo contiene test1.zip imágenes no marcados que vamos a clasificar ya sea perro o gato usando el modelo entrenado. Vamos a subir nuestras predicciones a Kaggle para obtener la puntuación de nuestro modelo de predicción.

Puesta en marcha 4.2 Máquina

Para entrenar las redes neuronales convolucionales, necesitamos una máquina con una GPU potente.

En este tutorial, he usado uno de AWS instancia EC2 del tipo g2.2xlarge. Esta instancia tiene una NVIDIA GPU de alto rendimiento con 1.536 núcleos CUDA y 4 GB de memoria de vídeo, 15 GB de RAM y 8 CPU virtuales. La máquina cuesta $ 0.65 / hora.

Si usted no está familiarizado con AWS, esta guía le ayudará a configurar una instancia AWS EC2.

Tenga en cuenta, que el IAM recomendado en la guía ya no está disponible. Preparé un nuevo IAM (ami-64d31209) con todo el software necesario instalado. También he creado una guía para la instalación de Caffe y Anaconda en una instancia AWS EC2 o una máquina de Ubuntu con GPU.

Después de la creación de una instancia AWS, conectamos a ella y clonar el repositorio GitHub que contiene los archivos de código Python y configuración Caffe necesarias para el tutorial. Desde su terminal, ejecute el siguiente comando.

git clone https://github.com/adilmoujahid/deeplearning-cats-dogs-tutorial.git

A continuación, creamos una entrada de carpeta para almacenar las imágenes de entrenamiento y de prueba.

cd aprendizaje profundo-gatos-perros-tutorial
de entrada mkdir

4.3 Descripción general Caffe

Caffe es un marco de profundo aprendizaje desarrollado por el Centro de Visión y Aprendizaje Berkeley ( BVLC ).Está escrito en C ++ y tiene enlaces Python y Matlab.

Hay 4 pasos en la formación de un uso de Caffe CNN:

  • Paso 1 – Preparación de datos: En este paso, se limpia las imágenes y almacenarlas en un formato que puede ser utilizado por Caffe. Vamos a escribir un script en Python que controlará tanto la imagen pre-procesamiento y almacenamiento.
  • Paso 2 – Definición del modelo: En este paso, elegimos una arquitectura CNN y definimos sus parámetros en un archivo de configuración con la extensión .prototxt .
  • Paso 3 – definición Solver: El solucionador es responsable de la optimización del modelo. Definimos los parámetros del solver en un archivo de configuración con la extensión .prototxt .
  • Paso 4 – Formación del modelo: Entrenamos el modelo mediante la ejecución de un comando Caffe desde el terminal. Tras el entrenamiento del modelo, obtendremos el modelo entrenado en un archivo con extensión.caffemodel .

Después de la fase de entrenamiento, vamos a utilizar el .caffemodel modelo entrenado para hacer predicciones de nuevos datos que no se ven. Vamos a escribir una secuencia de comandos de Python para esto.

4.4 Preparación de datos

Empezamos copiando el train.zip y test1.zip (que hemos descargado en nuestro ordenador local) a la entrada dela carpeta en la instancia AWS. Podemos hacer esto mediante el SCP comando desde un MAC o máquina Linux.Si se está utilizando Windows, puede utilizar un programa como Winscp . Después de copiar los datos, descomprimir los archivos mediante la ejecución de los siguientes comandos:

~ / descomprimir-aprendizaje profundo gatos-perros-tutorial / input / train.zip
~ / descomprimir-aprendizaje profundo gatos-perros-tutorial / input / test1.zip
rm ~ / aprendizaje profundo-gatos-perros-tutorial / input / *. zip

A continuación, se corre create_lmdb.py .

cd ~ / aprendizaje profundo-gatos-perros-tutorial / Código
create_lmdb.py pitón

create_lmdb.py script hace lo siguiente:

  • Ejecutar ecualización del histograma en todas las imágenes de entrenamiento. ecualización del histograma es una técnica para ajustar el contraste de las imágenes.
  • Cambiar el tamaño de todas las imágenes de entrenamiento a un formato de 227×227.
  • Dividir los datos de entrenamiento en 2 conjuntos: uno para la formación (5/6 de imágenes) y el otro para la validación (1/6 de imágenes). El conjunto de entrenamiento se utiliza para entrenar el modelo, y el conjunto de validación se utiliza para calcular la precisión del modelo.
  • Almacenar la formación y validación en 2 bases de datos LMDB. train_lmdb para entrenar el modelo y validation_lmbd para la evaluación del modelo.

A continuación se muestra la explicación de las partes más importantes del código.

def  transform_img ( img ,  img_width = IMAGE_WIDTH ,  img_height = IMAGE_HEIGHT ):

    #Histogram Equalization 
    img [:,  :,  0 ]  =  cv2 . equalizeHist ( img [:,  :,  0 ]) 
    img [:,  :,  1 ]  =  cv2 . equalizeHist ( img [:,  :,  1 ]) 
    img [:,  :,  2 ]  =  cv2 . equalizeHist ( img [:,  :,  2 ])

    Cambiar el tamaño de #Image 
    img  =  cv2 . Redimensionar ( img ,  ( img_width ,  img_height ),  la interpolación  =  cv2 . INTER_CUBIC )

    retorno  img

transform_img toma imágenes en color como entrada, hace la ecualización del histograma de los canales de color 3 y cambiar el tamaño de la imagen.

Texto alt

def  make_datum ( img ,  etiqueta ):

    return  caffe_pb2 . Datum ( 
        channels = 3 , 
        width = IMAGE_WIDTH , 
        height = IMAGE_HEIGHT , 
        label = label , 
        data = np . rollaxis ( img ,  2 ) . tostring ())

make_datum toma una imagen y su etiqueta y devuelve un objeto de Datum que contiene la imagen y su etiqueta.

in_db  =  lmdb . open ( train_lmdb ,  map_size = int ( 1e12 )) 
with  in_db . begin ( write = True )  as  in_txn : 
    for  in_idx ,  img_path  in  enumerate ( train_data ): 
        if  in_idx  %   6  ==  0 : 
            continue 
        img  =  cv2 . imread ( img_path ,  cv2 . IMREAD_COLOR ) 
        img  =  transform_img ( img ,  img_width = IMAGE_WIDTH ,  img_height = IMAGE_HEIGHT ) 
        if  'cat'  in  img_path : 
            label  =  0 
        else : 
            label  =  1 
        datum  =  make_datum ( img ,  label ) 
        in_txn . put ( '{:0>5d}' . format ( in_idx ),  datum . SerializeToString ()) 
        print  '{:0>5d}' . format ( in_idx )  +  ':'  +  img_path 
in_db . close ()

El código anterior toma 5/6 de las imágenes de entrenamiento, se transforma y los almacena en train_lmdb. El código para almacenar datos de validación sigue la misma estructura.

La generación de la imagen media de los datos de entrenamiento

Ejecutamos el siguiente comando para generar la imagen media de los datos de entrenamiento. Vamos a restar la imagen media de cada imagen de entrada de asegurar que cada píxel característica tiene media cero. Este es un paso de preprocesamiento común en la máquina de aprendizaje supervisado.

/ Home / ubuntu / caffe / construcción / herramientas / compute_image_mean -backend = LMDB / home / ubuntu / aprendizaje profundo-gatos-perros-tutorial / input / train_lmdb /home/ubuntu/deeplearning-cats-dogs-tutorial/input/mean.binaryproto

4.4 Definición de Modelo

Después de decidir sobre la arquitectura de la CNN, es necesario definir sus parámetros en un .prototxt archivo train_val. Caffe viene con un par de CNN populares modelos como Alexnet y GoogleNet. En este tutorial, vamos a utilizar el bvlc_reference_caffenet modelo que es una réplica de AlexNet con algunas modificaciones. A continuación se muestra una copia del archivo train_val que llamamos caffenet_train_val_1.prototxt . Si se clona el repositorio git tutorial como se explicó anteriormente, usted debe tener el mismo archivo bajoaprendizaje profundo-gatos-perros-tutorial / caffe_models / caffe_model_1 / .

Tenemos que hacer las modificaciones a continuación al archivo bvlc_reference_caffenet prototxt el original:

  • Cambiar la ruta de datos de entrada y la media de imagen: Líneas 24, 40 y 51.
  • Cambiar el número de las salidas desde 1000 a 2: Línea 373. El bvlc_reference_caffenet original fue diseñado para un problema de clasificación con 1.000 clases.

Podemos imprimir el modelo de arquitectura mediante la ejecución del siguiente comando. La imagen de modelo de arquitectura se almacenarán en aprendizaje profundo-gatos-perros-tutorial / caffe_models / caffe_model_1 / caffe_model_1.png

python  / home / ubuntu / caffe / python / draw_net . py  / home / ubuntu / deeplearning - cats - dogs - tutorial / caffe_models / caffe_model_1 / caffenet_train_val_1 . prototxt  / home / ubuntu / deeplearning - cats - dogs - tutorial / caffe_models / caffe_model_1 / caffe_model_1 . png

Texto alt

4.5 Definición Solver

El solucionador es responsable de la optimización del modelo. Definimos los parámetros del solver en un.prototxt archivo. Puede encontrar nuestro solucionador de bajo aprendizaje profundo-gatos-perros-tutorial / caffe_models / caffe_model_1 / con el nombre solver_1.prototxt . A continuación se muestra una copia del mismo.

Este solucionador calcula la precisión del modelo usando el conjunto de validación cada 1000 iteraciones. El proceso de optimización tendrá una duración de un máximo de 40000 iteraciones y tomará una instantánea del modelo entrenado cada 5000 iteraciones.

base_lr , lr_policy , gamma , el impulso y weight_decay son hiper- que tenemos que sintonizar para obtener una buena convergencia del modelo.

Elegí lr_policy: "paso" con tamaño de paso: 2500 , base_lr: 0.001 y gamma: 0,1 . En esta configuración, vamos a empezar con una tasa de aprendizaje de 0,001, y vamos a dejar caer la tasa de aprendizaje en un factor de diez cada 2500 iteraciones.

Existen diferentes estrategias para el proceso de optimización. Para una explicación detallada, recomiendo de Caffe documentación solucionador .

Formación 4.6 Modelo

Después de definir el modelo y el solucionador, podemos empezar a entrenar el modelo mediante la ejecución del siguiente comando:

/ Home / ubuntu / caffe / construcción / herramientas / tren caffe --solver /home/ubuntu/deeplearning-cats-dogs-tutorial/caffe_models/caffe_model_1/solver_1.prototxt 2> & 1 | camiseta /home/ubuntu/deeplearning-cats-dogs-tutorial/caffe_models/caffe_model_1/model_1_train.log

Los registros de entrenamiento se almacenarán en aprendizaje profundo-gatos-perros-tutorial / caffe_models / caffe_model_1 / model_1_train.log .

Durante el proceso de formación, tenemos que controlar la pérdida y la exactitud del modelo. Podemos detener el proceso en cualquier momento pulsando Ctrl + c. Caffe tomará una instantánea del modelo entrenado cada 5000 iteraciones, y su almacenamiento en condiciones caffe_model_1 carpeta.

Las instantáneas tienen .caffemodel extensión. Por ejemplo, 10000 iteraciones instantánea se llama:caffe_model_1_iter_10000.caffemodel .

El trazado de la curva de aprendizaje

Una curva de aprendizaje es un gráfico de las pérdidas de formación y la prueba como una función del número de iteraciones. Estas parcelas son muy útiles para visualizar las pérdidas de tren / validación y exactitud de validación.

Podemos ver en la curva de aprendizaje que el modelo logra una precisión de validación de 90%, y dejado de mejorar después de 3000 iteraciones.

/home/ubuntu/deeplearning-cats-dogs-tutorial/caffe_models/code/plot_learning_curve.py pitón /home/ubuntu/deeplearning-cats-dogs-tutorial/caffe_models/caffe_models/caffe_model_1/model_1_train.log /home/ubuntu/deeplearning-cats-dogs-tutorial/caffe_models/caffe_models/caffe_model_1/caffe_model_1_learning_curve.png

Texto alt

4.7 Predicción de datos nuevo

Ahora que tenemos un modelo entrenado, podemos usarla para hacer predicciones sobre nuevos datos que no se ven (imágenes de prueba1). El código Python para hacer las predicciones es make_predictions_1.py y se almacena bajo aprendizaje profundo-gatos-perros-tutorial / código . El código necesita para ejecutar archivos de 4:

  • Las imágenes de prueba: Se utilizarán imágenes test1.
  • La media de la imagen: La imagen media que hemos calculado en el apartado 4.4.
  • Archivo de la arquitectura del modelo: Vamos a llamar a este archivo caffenet_deploy_1.prototxt . Se almacena bajo aprendizaje profundo-gatos-perros-tutorial / caffe_models / caffe_model_1 .Está estructurado de una manera similar a caffenet_train_val_1.prototxt , pero con algunas modificaciones. Tenemos que eliminar las capas de datos, añadir una capa de entrada y cambiar el último tipo de capa de SoftmaxWithLoss a Softmax.
  • Formado pesos modelo: Este es el archivo que hemos calculado en la fase de entrenamiento. Vamos a utilizar caffe_model_1_iter_10000.caffemodel .

Para ejecutar el código Python, hay que ejecutar el comando a continuación. Las predicciones se almacenarán enaprendizaje profundo-gatos-perros-tutorial / caffe_models / caffe_model_1 / submission_model_1.csv .

cd / home / ubuntu / aprendizaje profundo-gatos-perros-tutorial / Código
make_predictions_1.py pitón

A continuación se muestra la explicación de las partes más importantes en el código.

#read significaría image 
mean_blob  =  caffe_pb2 . BlobProto () 
with  open ( '/home/ubuntu/deeplearning-cats-dogs-tutorial/input/mean.binaryproto' )  as  f : 
    mean_blob . ParseFromString ( f . read ()) 
mean_array  =  np . asarray ( mean_blob . data ,  dtype = np . float32 ) . reshape ( 
    ( mean_blob . channels ,  mean_blob . height ,  mean_blob . width ))


Arquitectura Modelo # Leer y entrenado el modelo de weights 
net  =  caffe . Net ( '/home/ubuntu/deeplearning-cats-dogs-tutorial/caffe_models/caffe_model_1/caffenet_deploy_1.prototxt' , 
                '/home/ubuntu/deeplearning-cats-dogs-tutorial/caffe_models/caffe_model_1/caffe_model_1_iter_10000.caffemodel' , 
                caffe . TEST )

imagen #Define transformers 
transformer  =  caffe . io . Transformer ({ 'data' :  net . blobs [ 'data' ] . data . shape }) 
transformer . set_mean ( 'data' ,  mean_array ) 
transformer . set_transpose ( 'data' ,  ( 2 , 0 , 1 ))

El código anterior almacena la imagen media bajo mean_array , define un modelo llamado neta leyendo el archivo de despliegue y el modelo entrenado, y define las transformaciones que necesitamos para aplicar a las imágenes de prueba.

img  =  cv2 . imread ( img_path ,  cv2 . IMREAD_COLOR ) 
img  =  transform_img ( img ,  img_width = IMAGE_WIDTH ,  img_height = IMAGE_HEIGHT )

net . blobs [ 'data' ] . data [ ... ]  =  transformer . preprocess ( 'data' ,  img ) 
out  =  net . forward () 
pred_probas  =  out [ 'prob' ] 
print  pred_probas . argmax ()

El código anterior leer una imagen, se aplican los pasos de procesamiento de imágenes similares a fase de entrenamiento, calcula cada clase “probabilidad e imprime la clase con la probabilidad más grande (0 para los gatos, y 1 para perros).

Después de la presentación de los predicitions a Kaggle , que dan una precisión de 0,89691.

Texto alt

5. La construcción de un gato / perro clasificador mediante la transferencia del aprendizaje

En esta sección, vamos a utilizar una técnica muy práctico y poderoso llamado aprendizaje de transferencia para la construcción de nuestro clasificador gato / perro.

5.1 ¿Qué es la transferencia del aprendizaje?

redes neuronales convolucionales requieren grandes conjuntos de datos y una gran cantidad de tiempo para entrenar computional. Algunas redes pueden tomar hasta 2-3 semanas a través de múltiples GPU para entrenar.el aprendizaje de transferencia es una técnica muy útil que trata de abordar ambos problemas. En lugar de entrenar la red desde cero, el aprendizaje transferencia utiliza un modelo entrenado en un conjunto de datos diferente, y lo adapta al problema que estamos tratando de resolver.

Hay 2 estrategias para el aprendizaje de la transferencia:

  • Utilizar el modelo entrenado como un extractor de características fijas: En esta estrategia, se elimina la última capa totalmente conectado desde el modelo entrenado, congelamos los pesos de las capas restantes, y formamos un clasificador de aprendizaje automático en la salida de las capas restantes.
  • Afinar el modelo entrenado: En esta estrategia, afinar el modelo entrenado en el nuevo conjunto de datos al continuar la propagación hacia atrás. Tenemos la posibilidad de poner a punto toda la red o congelar algunos de sus capas.

Para una explicación detallada de la transferencia de aprendizaje, recomiendo la lectura de estas notas .

5.2 Formación del gato / perro clasificador mediante la transferencia del aprendizaje

Caffe viene con un repositorio que es utilizado por los investigadores y profesionales de aprendizaje automático para compartir sus modelos entrenados. Esta biblioteca se llama Modelo Zoo .

Vamos a utilizar la formación bvlc_reference_caffenet como punto de partida de la construcción de nuestro gato clasificador / perro con el aprendizaje de transferencia. Este modelo fue entrenado en el conjunto de datos IMAGEnet que contiene millones de imágenes a través de 1000 categorías.

Vamos a utilizar la estrategia de puesta a punto para la formación de nuestro modelo.

Descargar entrenado modelo bvlc_reference_caffenet

Podemos descargar el modelo entrenado por ejecutar el comando a continuación.

cd / home / ubuntu / caffe / modelos / bvlc_reference_caffenet
wget http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel

Definición de modelo

Los archivos de configuración de modelo y solucionador se almacenan bajo aprendizaje profundo-gatos-perros-tutorial / caffe_models / caffe_model_2 . Tenemos que hacer el siguiente cambio en el archivo original configuración del modelo bvlc_reference_caffenet.

  • Cambiar la ruta de datos de entrada y la media de imagen: Líneas 24, 40 y 51.
  • Cambiar el nombre de la última capa totalmente conectado desde FC8 a FC8-gatos-perros. Las líneas 360, 363, 387 y 397.
  • Cambiar el número de las salidas desde 1000 a 2: Línea 373. El bvlc_reference_caffenet original fue diseñado para un problema de clasificación con 1.000 clases.

Tenga en cuenta que si mantenemos el nombre de una capa sin cambios y se pasa pesos del modelo entrenado para Caffe, elegirá sus pesos a partir del modelo entrenado. Si queremos congelar una capa, necesitamos configurar su lr_mult parámetro a 0.

Definición Solver

Vamos a utilizar un programa de solución similar a la utilizada en el apartado 4.5.

Formación modelo con la transferencia del aprendizaje

Después de definir el modelo y el solucionador, podemos empezar a entrenar el modelo mediante la ejecución del siguiente comando. Tenga en cuenta que podemos pasar los pesos del modelo entrenado utilizando los argumentos --weights .

/ Home / ubuntu / caffe / construcción / herramientas / tren caffe --solver = / home / ubuntu / aprendizaje profundo-gatos-perros-tutorial / caffe_models / caffe_model_2 / solver_2.prototxt --weights / home / ubuntu / caffe / modelos / bvlc_reference_caffenet /bvlc_reference_caffenet.caffemodel 2> & 1 | camiseta /home/ubuntu/deeplearning-cats-dogs-tutorial/caffe_models/caffe_model_2/model_2_train.log

Trazando la curva de aprendizaje

Al igual que en la sección anterior, podemos trazar la curva de aprendizaje mediante la ejecución del siguiente comando. Podemos ver en la curva de aprendizaje que el modelo logra una precisión de ~ 97% después de sólo 1000 iteraciones. Esto demuestra el poder del aprendizaje de transferencia. Hemos sido capaces de obtener una mayor precisión con un menor número de iteraciones.

pitón /home/ubuntu/deeplearning-cats-dogs-tutorial/code/plot_learning_curve.py /home/ubuntu/deeplearning-cats-dogs-tutorial/caffe_models/caffe_model_2/model_2_train.log /home/ubuntu/deeplearning-cats-dogs-tutorial/caffe_models/caffe_model_2/caffe_model_2_learning_curve.png

Texto alt

Predicción de los nuevos datos

De manera parecida a la sección 4.7, vamos a generar predicciones en los datos de prueba y cargar los resultados en Kaggle para conseguir la exactitud del modelo. El código para la fabricación de los predicitions está bajo aprendizaje profundo-gatos-perros-tutorial / código / make_predictions_2.py .

El modelo tiene una precisión de 0,97154, que es mejor que el modelo que hemos entrenado desde cero.

Texto alt

Conclusión

En esta entrada del blog, hemos cubierto los conceptos básicos de aprendizaje profundo y redes neuronales convolucionales. También aprendimos cómo construir redes neuronales utilizando convolucionales Caffe y Python desde cero y utilizando el aprendizaje de transferencia. Si desea obtener más información sobre este tema, le recomiendo de Stanford curso “Redes Neuronales convolucionales de Reconocimiento Visual” .

referencias

  1. CS231n – Redes Neuronales Parte 1: Configuración de la Arquitectura
  2. Wikipedia – Red Neural convolucional
  3. CS231n – Traslado Notas de aprendizaje
  4. Un paso a paso Ejemplo Retropropagación
  5. CS231n convolucionales Redes Neuronales de Reconocimiento Visual

Articulo basado en el post de Adil Moujahid.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s