Cómo entrenar clasificador lineal paso a paso con Caffe, utilizando las respuestas de la última capa completamente conectada del modelo AlexNet como características

Gracias por el A2A.

He hecho algo muy similar pero no exactamente lo que estás buscando. Primero, utilicé una red Caffe VGG-CNN, no una AlexNet. En segundo lugar, el clasificador lineal que entrené a partir de la salida del VGG-CNN no vino de Caffe, utilicé un SVM de Scikit-Learn. Pero ninguno de estos cambia drásticamente el enfoque que se describe a continuación, por lo que espero que mi respuesta sea útil.

Tomé la red VGG-CNN del Caffe Model Zoo. El modelo se empaqueta como un archivo protobuf (.prototxt) que contiene la arquitectura de red, un archivo de modelo (.caffemodel) que contiene los pesos de las capas y una imagen media que se debe restar de la imagen de entrada cuando se envía para la predicción.

Las capas completamente conectadas en esta red son de fc6 a fc8. Eliminé todas las capas después de fc6 eliminando las líneas del archivo .prototxt. Entonces, si miras la esencia del prototipo en la página de VGG-CNN en Caffe Model Zoo, eliminé todo desde la línea 151 hasta el final. Esto me da una red que lee una imagen de forma (3, 224, 224) y genera un vector de forma (4096,).

Luego cargué esta red usando la API PyCaffe y ejecuté las imágenes a través de ella para obtener los vectores para las imágenes. Las imágenes deben ser preprocesadas; por lo general, las leerá como (alto, ancho, canal = 3), por lo que deben cambiar su tamaño a (224, 224, 3) porque ese es el tamaño que la red espera. También debe reordenar las dimensiones a (3, 224, 224). Finalmente, la red realmente espera un lote de imágenes y el tamaño de lote predeterminado es 10. Entonces, si pasa un tensor de forma (10, 3, 224, 224) obtendrá el mejor rendimiento (velocidad) ya que se ejecutarán en paralelo, pero puede enviarle tensores con una primera dimensión más pequeña. Entonces, para un lote de una imagen, la red tomará un tensor de forma (1, 3, 224, 224).

A continuación, debe restar la imagen media de este tensor. La imagen media tiene forma (1, 3, 224, 224), por lo que si el tamaño de su lote es 1, todo lo que tiene que hacer es restarlo. De lo contrario, debe replicar la imagen media al tamaño requerido y restar la imagen media replicada de su tensor por lotes.

Luego ejecuta predic en la red y le devuelve un vector de (4096,). Solo lo escribo en un archivo. Entonces, dado que mis datos de entrenamiento eran una imagen (nombre) y 1 etiqueta categórica, ahora tengo nuevos datos de entrenamiento de 4096 características y 1 etiqueta (categórica).

Usando estos datos, luego entrena un clasificador lineal como Naive Bayes o SVM para predecir las etiquetas. Si desea continuar usando Caffe para esto, tiene los componentes para construir un clasificador, aunque creo que el enfoque protobuf es un poco complicado en comparación con los marcos más recientes como Tensorflow o Keras. Pero no hice esto porque estaba obteniendo buenos resultados con el clasificador SVM de Scikit-Learn.