Error de desajuste de la forma de Caffe con el modelo VGG-16 pretrasado

Estoy usando PyCaffe para implementar una neural network inspirada en la red de 16 capas VGG. Quiero usar el modelo pre-entrenado disponible en su página de GitHub . En general, esto funciona haciendo coincidir los nombres de las capas.

Para mi capa "fc6" tengo la siguiente definición en mi archivo train.prototxt:

 layer { name: "fc6" type: "InnerProduct" bottom: "pool5" top: "fc6" inner_product_param { num_output: 4096 } } 

Aquí está el archivo de prototxt para la architecture de implementación VGG-16. Tenga en cuenta que el "fc6" en su prototexto es idéntico al mío (excepto por la velocidad de aprendizaje, pero eso es irrelevante). También vale la pena señalar que las entradas son todas del mismo tamaño en mi modelo: imágenes de 3 canales de 224x224px.

He estado siguiendo este tutorial muy de cerca, y el bloque de código que me está dando un problema es el siguiente:

 solver = caffe.SGDSolver(osp.join(model_root, 'solver.prototxt')) solver.net.copy_from(model_root + 'VGG_ILSVRC_16_layers.caffemodel') solver.test_nets[0].share_with(solver.net) solver.step(1) 

La primera línea carga mi prototexto solucionador y luego la segunda línea copia los pesos del modelo pre-entrenado ( VGG_ILSVRC_16_layers.caffemodel ). Cuando se ejecuta el solucionador, me sale este error:

 Cannot copy param 0 weights from layer 'fc6'; shape mismatch. Source param shape is 1 1 4096 25088 (102760448); target param shape is 4096 32768 (134217728). To learn this layer's parameters from scratch rather than copying from a saved net, rename the layer. 

Lo esencial es que su modelo espera que la capa tenga un tamaño de 1x1x4096, mientras que el mío es solo de 4096. ¿Pero no entiendo cómo puedo cambiar esto?

Encontré esta respuesta en el grupo de usuarios de Google que me indicaba que me hiciera una cirugía de red para remodelar el modelo pre-entrenado antes de copiar, pero para hacerlo necesito los archivos lmdb de las capas de datos de la architecture original, que no tengo ( arroja un error cuando bash ejecutar el script de net Surgery).

El problema no es con 4096, sino con 25088. Debe calcular los mapas de características de salida para cada capa de su red basándose en los mapas de características de entrada. Tenga en cuenta que la capa fc toma una entrada de tamaño fijo, por lo que la salida de la capa conv anterior debe coincidir con el tamaño de entrada requerido por la capa fc . Calcule el tamaño del mapa de entidades de entrada de fc6 (este es el mapa de entidades de salida de la capa conv anterior) usando el tamaño del mapa de entidades de entrada de la capa conv anterior. Aquí está la fórmula:

 H_out = ( H_in + 2 x Padding_Height - Kernel_Height ) / Stride_Height + 1 W_out = (W_in + 2 x Padding_Width - Kernel_Width) / Stride_Width + 1 

Este error aparece si está recortando las imágenes a 224, en lugar de las 227 que se hicieron con el conjunto de datos original. Ajusta eso y deberías estar listo para ir.