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.

Diferentes estrategias emprendidas por las AAPP para cumplir/salvar la LEY 11/2007

En este post voy a comentar las diferentes estrategias que han y están tomando las AAPP para el cumplimiento según las experiencias que me voy encontrando en diferentes oportunidades o proyectos en si, y que como objetivo principal de casi todos está el cumplimiento de la ley LACSP 11/2007 “Ley de Acceso de los ciudadnos a los servicios publicos”,  o como se diría en mi pueblo “cubrir el expediente”, éstas son:

1.- La total aunque no sepa si realmente necesito todo: Hay administraciones que por su poco tamaño y su abultado presupuesto (no me pregunte como) te piden un mega proyecto con la frase; Este pliego es para realizar el sistema de Administración Electrónica para mi organismo”, a lo cual empiezas a preguntar: pero se requiere ventanilla única o compatible, cuantos procedimientos existen, cuáles quiere automatizar y cuáles dejarlos con un procesamiento manual (esto tiene fácil respuesta, lo menos usados y más complejos), requiere interoperatibidad entre administraciones o no, etc. A lo que ellos se miran unos a los otros y te vuelven a decir: “sí, sí que lo lleve todo, queremos un sistema de eAdmin total”, y digo yo joder otra peli de terminator…

2.- Los que tienen muy claro lo que necesitan, y quieren invertir el dinero justo por que no creen que esto de la eAdmin este aún maduro en España, cosa que en cierta forma comparto, ya que no se hizo Roma de dos día ( o algo así).

3.- Los que no tienen presupuesto (o se lo han gastado en otros sitios), pero quieren cumplir la ley 11/2007, por lo que te piden la sede electrónica a modo de fachada, ya que la tramitación de los procedimientos y sus expedientes los seguirán haciendo con el actual Backoffice de san fernando (:-)), o sea una ratito a máquina y otro a mano.

4.- De los que te plantean un plan estratégico con su correspondiente plan de acción, en donde han perfilado un road-map de los diferentes proyectos que quieren acometer en orden cronológico según la necesidad  del organismo y que además le sirva para cumplir la ley 11/2007.

5.- Otros que no lo tienen claro, ni su papel como organismo dentro de la administración electrónica, ni que deben de ofrecer a los ciudadanos y a otros organimos para conseguir una administración electrónica real. Además esta indifinición se junta con que muchos proveedores le venden, o les vendemos,  la moto, o sea, componentes o sistemas que no necesitan, o aún necesitandolo y una vez ya entregado, no cumplen las funcionalidades que debería de ofrecer según la definición de eAdmin.

En fin, espero que todos estos planteamientos dispares sea cuestión de unos estadíos preliminares de una eAdmin que en el futuro será de las más punteras de Europa, y porque no decirlo, del mundo, ya que tanto el mercado de las TI como los ciudadanos españoles están preparados para acometerla.

SalU2.

Carta enviada al Sr. Presiente de Gobierno

Esta es la carta que he enviado, bueno e-mail, al presidente de gobierno, a través de la web del Ministerio de la Presidencia. En ella le hago participe de que en los proyectos presentados por los ayuntamientos en el tan traído “PlanE” no se ha tenido en cuenta las TI ya que ningún proyecto habla de inversiones en equipos software, desarrollos, portales, conectividad, Administración Electrónica, etc, y esto me parece muy grave.

Buenos días, me gustaría preguntar al señor presidente por que no se ha indicado a los ayuntamientos y luego se han asignado por parte del gobierno central porcentajes de los 8.000 euros a los distintos sectores de la economía.

Esto lo cuento ya que al revisar la lista de proyectos aprobados (casi 7300 mll €) no he encontrado ningún proyecto o inversión que tenga que ver con las TI, y no digo a nivel de I+D+i tan necesaria en este país que necesitamos aumentar la productividad y eficiencia, si no ya en la compra de un PC, o de un software, etc. Esto me parece realmente grave cuando estamos todos programando con la excelencia tecnológica, el aumento de la productividad, la eAdministración centrada en el ciudadano, etc.

Por favor tenga en cuenta esta petición, ya que como trabajador del sector, veo que si no se mantienen los presupuestos, e incluso se aumentan, para este sector, va a producir un ajuste como en el sector de la construcción por ser un gasto que tanto la instituciones públicas como privadas consideran un gasto superfluo (muy equivocadamente) y el cual se puede prescindir en época de crisis.

Un saludo y muchas gracias por su atención.

Musicote

El otro día, por casualidad, me encontre con un grupo que se llamaba Hard Rain y que tenía un temazo de esos que me hacen recordar aquellos finales 80 y principios de los 90 en los cuales yo mozeaba, ha raiz de esto me pues a buscar y através de maravilloso youtube encontre este grupo y encima me daba sugerencias para ver-escuchar grupos relacionadas de época, como pueden ser The Simple, Mignithg,  Snake Corp, The cult, The Mision, etc, y joder que nostalgia me entró.

Total que empeze a buscar en la burra y encontre muchos pero algunos de estos el tio que los tiene no debe de conectarse mucho y están tardado un huevo.

De todas maneras aquí dejo uno de esos temazos.

A recordar …..

Bueno no puedo subirlo, os dejo los enlaces de la burra.

ed2k://|file|03%20-%20Midnight%20-%20Run%20With%20You.mp3|5347456|73D97435949191F841CAAB2446C10F35|/

ed2k://|file|Hard%20Rain%20-%20Diamons.wma|2786675|6411564F9F33ACCDACB019C1ED4F17D2|/

Cenas, cenitas y cenotes de navidad

Pues si, estoy hasta los cojo….. de tanta cenita o comidita de navidad, que si con los del dpto de tu empresa, el coctel de la empresa, la cena de amigos, la de los amigos de tu mujer, con los de la uni, ¡¡¡¡¡¡ la de los vecinos!!!!!! (joder hasta donde hemos llegado, también con los vecinos), etc,  etc, etc, y encima con el consiguiente pago del típico menú que no bajan de 40 pavos y encima con la calidad peor que si no es navidad, sin poder aparcar en los parking o poder coger un taxi, con lo sitios para tomarte la copo de después llenos de gente que no salen nunca y esos días salen y están como elefante en cacharrería (bueno como yo ya), petaos de gente hasta tal punto que para ir al baño y volver te tienes que llevar la copa ya que cuando vuelvas tus compis están poniéndose los abrigos ya que se van a otro sitio del tiempo que tardas.

Bueno en fin, que yo este año he dejado unas pocas de quedadas para después de navidad, ya que si no ahora mucho y luego nada, además que después de la navidad viene ese desierto que son los tres meses hasta semana santa que no hay normalmente una puta fiesta.

El estado del arte actual en el sector de las TIC

Últimamente estoy participando en muchas pre-ventas y en confeccionar las ofertas técnicas para proyectos muy interesantes. El problema es que las empresas y los organismos tienen muy buenas intenciones pero muy pocas pesetes.

Por lo que es muy frustrante preparar una oferta, con el coste de trabajo asociado que conlleva, y que apurando en donde se puede obtener un precio final económico, para que el cliente al final opte por la oferta más económica aún sabiendo que se va al suicidio directamente debido a que la empresa que ha dado esta oferta, o no tiene solvencia técnica o lo ha hecho con el dedo en alto y según soplaba el viento.

En fin, que como sigamos así, los de un taller mecánico, por ejemplo, donde lleve yo el otro día mi coche y me soplaron 50€ por hora de mano de obra, van a cobra la hora trabajada más cara que nosotros.

Y por si no fuera suficiente con las frustración, encima tenemos que tener la presión de que los resultados de nuestras empresas son malos (ahora todos se suben al carro de “que mal vamos ….” y “dame argo payo….”), y a una previsible reducción de plantilla de la cual yo, por mi cambio de empresa recientemente, no estoy a salvo.

Las bondades y penalidades de la tan hablada Oracle Suite SOA

Esta entrada pretende dar una idea del producto Oracle Suite SOA, de sus características y de sus defectos, y que sirve de complemento al anterior post.

En el esquema siguiente podéis ver un diagrama de relación a nivel de mensajería de todos los componentes de la plataforma.

Las principales características de la plataforma son:

· Es extremadamente configurable y escalable a nivel de sistemas.

· Compatible con la especificación BPEL 1.2 aunque la versión 11g será compatible con la BPEL 1.3. También es compatible con XPDL y …..

· Te puedes crear tantos contenedores (oc4j’s) de instancia java como quieras para poder desplegar en estos nuestro procesos BPEL, WS y demás.

· Proporciona todas las funcionalidades de administración de todos los componentes vía web.

· Proporciona SSO (Single-Sing-On) en todos sus sistemas de identificación, además de integración con LDAPs.

· Ofrecen una versión completa de la plataforma para la evaluación sin tiempo de uso determinado a través de www.otn.oracle.com.

· El ESB proporciona la capacidad de recuperación de errores en cada una de las solicitudes o transacciones que pasan por el, por lo que se suele poner como inicio o fin en los procesos empresariales. Esto es posible para todos aquellos procesos que son asíncronos, ya que por definición los asíncronos hacen un rollback y terminan.

· En los procesos ESB hasta que no termina todo el proceso no se hacen un commit en la BBDD.

· Todo proceso desplegado tanto en el ESB como los procesos BPEL, se exponen hacia el exterior mediante un WSDL que representa un WS desplegado en el AS o en el propio ESB.

· Existe un proceso que sirve para importar modelos generados con un BPA a BPEL llamado BluePrint (no lleguemos a utilizarlo).

· Permite el versionado de procesos empresariales BPEL diseñados sobre JDeveloper, publicando un WS por cada versión.

· A nivel de actividades de BPEL, la Oracle Suite SOA incorpora las siguientes extensiones de actividades:

· Decide: Bifurcación condicional.

· Decisión service:

· E-mail:

· Fax:

· FlowN: Ejecuta n veces la actividades que se encuentran en paralelo.

· Human Task:

· Java Embedding: Invocación a procesos Java (no es muy potente)

· Transform: Actibidad para la transformación de datos y mensajes.

· Voice:

· Pager:

· Tiene una gestión de las excepciones muy relacionada a la usada en los lenguajes de programación mediante el uso de scopes (ámbitos).

· Los adapters o conectores a sistemas o recursos de terceros que provee Oracle Suite SOA 10g son:

· De acceso al sistema de ficheros del SO.

· De FTP.

· A servidores de correo corporativos.

· De acceso a BBDD para ejecutar un insert, delete, update, SQL personalizada y procedimientos almacenados.

· Conectores a JDEduars, Siebel, PeopleSoft, Oracle FI, etc.

· Todos los adaptadores que se utilicen en un proceso empresarial, tanto en ESB como en BPEL, se publican como WS.

· Usa el estándar XSLT para la definición de transformaciones tanto en los procesos del ESB como en los de BPEL, así como XPath y XQuery para el acceso a los XML.

· A las transformaciones se le pueden asociar diccionarios de datos para realizar transformaciones masivas automáticamente. Estos diccionarios de datos se pueden sub dividir en dominios para su mejor gestión.

· Los diccionarios se pueden exportar e importar desde/ hacia XML.

· Todas las actividades de BPEL pueden llevar asociado sensores para alimentar al BAM o al BPEL monitor.

· El WSM proporciona entre otras cosas, la parte de seguridad a los procesos y a todos los WS publicados. Esta seguridad se consigue con la definición políticas de seguridad, en donde se define que operaciones y en que condiciones se aplican a cada plantilla, siendo una plantilla el momento en que queremos que se apliquen las políticas, están son: pre-request, request, pre-response, response. Las tareas que proporciona y que son asociadas a las políticas son::

· Autenticación, soporta cualquier forma SAML de autenticación, aq demás de por user/pwd que viene en las cabeceras SOAP.

· Autorización, a nivel de servicio pudiendo acceder a BBDD, LDAP o fichero de autorización, proveedor de seguridad personalizado que signa JAAS y Oracle Indentity Manager.

· Manejador de credenciales, usa los tag user y pwd de la cabecera SOAP para establecer un nivel más de seguridad.

· También se puede hacer mediante certificados X509 v3.

· Cifrado,

· Los algoritmos de firma que soporta son: RSA-SHA1, DSA-SHA1 y RSA-MD5.

· Firmado, permite firma en formato WS-Security. Se puede configurar los algoritmos de transformación y cifrado que deseamos usar para la firma. Se puede seleccionar el almacén de certificados y el certificados que deseamos usar para firmar en este WS.

· Los algoritmos de cifrado que soporta son: 3DES, AES-128 y AES-256.

· Se puede firmar el cuerpo de mensaje también.

· Validación de firmas, se puede configurar los algoritmos de transformación y cifrado que deseamos usar para la validación. También permite validar y requerir que vaya firmado el cuerpo del mensaje (Body).

· Time stamping, validación de sellado de tiempo.

· Log de mensajes, loguea el mensaje.

· Transformación del mensaje, usando transformaciones basadas en XSLT.

· Se puede usar certificados distintos para firmar y para cifrar.

Las principales desventajas de la plataforma son:

· A la hora de dar información de compilación o de ejecución no es muy explicito, siendo a veces tan genérico como “Hay un error”.

· No posibilita la interacción mediante código fuente a bajo nivel para la modificación de WS o por lo menos no nos han contado la forma aunque lo hemos preguntado.

· No permite el cambio de un procedimiento ni en BPEL ni sobre el ESB en caliente, o sea que se modifique los flujos y al salvar los cambios se le pudiera decir que los procesos ya arrancado que hacen si siguen con la anterior versión o con la nueva.

· El BAM de la 10g sólo corre en win 2000 server SP4, no existe versión para Linux ni para Unix. Supuestamente la 11g si va a correr en linux.

· El BAM actual sólo sirve para manejar colas de eventos, por lo que todo sistema que cuya programación de mensajes se haga por colas de mensajes, BAM lo puede monitorizar.

· Todo lo que se puede hacer con el ESB se puede hacer con la modelación de procesos BPEL, menos la gestión de errores en solicitudes asíncronas.

· La interfaz grafica que la actividad Human Task ofrece a los usuarios cuando tienen que interactuar con el proceso es muy pobre. Supuestamente la 11g la va a mejorar bastante.

· No permite una forma de hacer bloque os de procesos ni de semáforos.

· El sistema de reglas no es muy potente, ya que por ejemplo el repositorio de reglas en un fichero plano, y no tiene posibilidad de almacenarlo en un BBDD.

· No permite realizar firma de mensajes según el estándar de firma XML-Dsig. Se podría conseguir desarrollando extensiones que realizarán el firmado con este estándar.

· Sólo permite el uso del algoritmo EXC-C14N para realizar la canonización de mensajes.

· Realmente no he entendido para que sirve el ESB si tenemos la opción de procesos BPEL, ya que se puede hacer todo lo que se hace en ESB sobre BPEL menos los reintentos sobre procesos asíncronos.

· El instalador de la plataforma no está muy logrado, ya que para instalar los modelos de datos se hace mediante un fichero por lotes antes de ejecutar el instalador del paquete software. También el instalador no marca opciones que deben de ir por defecto por que si no, no funciona el sistema.

· Tengo serias dudas de la capacidad de procesamiento sin tener que hacer uso de una configuración de sistema compleja, ya que para procesar una petición los tiempos no son inmediatos.

En siguientes post os iré contando más experiencias con esta plataforma.