Keras: ¿Cómo convertir un modelo caffe a tipo Keras?

Creado en 14 may. 2015  ·  10Comentarios  ·  Fuente: keras-team/keras

Hola a todos,

Quiero usar Keras para entrenar un modelo de CNN para la clasificación. Como sé, hay muchos modelos de CNN públicos previamente entrenados, como VGG, ImageNet, etc. Pero, desafortunadamente, estos modelos previamente entrenados se generan con otro marco de CNN, como caffe o cuda-convnet. ¿Cómo podemos usar este tipo de modelos o pesos previamente entrenados para inicializar un modelo secuencial de Keras y luego hacer el entrenamiento de ajuste fino?

Gracias
Dr. Wu

stale

Comentario más útil

Estamos trabajando en ello. Esta es definitivamente una de las características que queremos agregar pronto. https://github.com/fchollet/keras/issues/100

Todos 10 comentarios

También espero ver un tutorial para ilustrar esto.

Estamos trabajando en ello. Esta es definitivamente una de las características que queremos agregar pronto. https://github.com/fchollet/keras/issues/100

Si alguien todavía está interesado, puede usar esta bifurcación de Keras que tiene un módulo de conversión:
https://github.com/MarcBS/keras

Mejor,
Bagazo

Hola,
Estaba probando el módulo de conversión de caffe a keras que mencionaste, pero recibo este error cuando ejecuto caffe2keras.py

El nombre global 'network_input' no está definido

¿Alguna ayuda?

@dhruvjain, si se refiere a esta bifurcación , abra una nueva edición aquí , por favor.

Además, sería muy útil si pudiera incluir los archivos del modelo que está intentando convertir, o al menos el .prototxt.

Lo usé para convertir el modelo caffenet, el prototxt es este:
nombre: "CaffeNet"

force_backward: verdadero
datos de entrada"
input_dim: 1
input_dim: 3
input_dim: 227
input_dim: 227

entrada: "etiqueta"
input_dim: 1
input_dim: 1
input_dim: 1
input_dim: 1

capa {
nombre: "conv1"
tipo: "Convolución"
abajo: "datos"
arriba: "conv1"
convolution_param {
num_salida: 96
kernel_size: 11
zancada: 4
}
}

capa {
nombre: "relu1"
tipo: "ReLU"
abajo: "conv1"
arriba: "conv1"
}
capa {
nombre: "pool1"
tipo: "Pooling"
abajo: "conv1"
arriba: "pool1"
pooling_param {
piscina: MAX
kernel_size: 3
zancada: 2
}
}
capa {
nombre: "norm1"
tipo: "LRN"
bottom: "pool1"
arriba: "norm1"
lrn_param {
tamaño_local: 5
alfa: 0.0001
beta: 0,75
}
}
capa {
nombre: "conv2"
tipo: "Convolución"
abajo: "norm1"
arriba: "conv2"
convolution_param {
num_salida: 256
almohadilla: 2
kernel_size: 5
Grupo 2
}
}
capa {
nombre: "relu2"
tipo: "ReLU"
abajo: "conv2"
arriba: "conv2"
}
capa {
nombre: "pool2"
tipo: "Pooling"
abajo: "conv2"
arriba: "pool2"
pooling_param {
piscina: MAX
kernel_size: 3
zancada: 2
}
}
capa {
nombre: "norm2"
tipo: "LRN"
bottom: "pool2"
arriba: "norm2"
lrn_param {
tamaño_local: 5
alfa: 0.0001
beta: 0,75
}
}
capa {
nombre: "conv3"
tipo: "Convolución"
abajo: "norm2"
arriba: "conv3"
convolution_param {
num_salida: 384
almohadilla: 1
kernel_size: 3
}
}
capa {
nombre: "relu3"
tipo: "ReLU"
abajo: "conv3"
arriba: "conv3"
}
capa {
nombre: "conv4"
tipo: "Convolución"
abajo: "conv3"
arriba: "conv4"
convolution_param {
num_salida: 384
almohadilla: 1
kernel_size: 3
Grupo 2
}
}
capa {
nombre: "relu4"
tipo: "ReLU"
abajo: "conv4"
arriba: "conv4"
}
capa {
nombre: "conv5"
tipo: "Convolución"
abajo: "conv4"
arriba: "conv5"
convolution_param {
num_salida: 256
almohadilla: 1
kernel_size: 3
Grupo 2
}
}
capa {
nombre: "relu5"
tipo: "ReLU"
abajo: "conv5"
arriba: "conv5"
}
capa {
nombre: "pool5"
tipo: "Pooling"
abajo: "conv5"
arriba: "pool5"
pooling_param {
piscina: MAX
kernel_size: 3
zancada: 2
}
}
capa {
nombre: "fc6"
tipo: "InnerProduct"
bottom: "pool5"
arriba: "fc6"
inner_product_param {
num_salida: 4096
}
}
capa {
nombre: "relu6"
tipo: "ReLU"
abajo: "fc6"
arriba: "fc6"
}
capa {
nombre: "drop6"
tipo: "Abandono"
abajo: "fc6"
arriba: "fc6"
dropout_param {
dropout_ratio: 0.5
}
}
capa {
nombre: "fc7"
tipo: "InnerProduct"
abajo: "fc6"
arriba: "fc7"
inner_product_param {
num_salida: 4096
}
}

capa {
nombre: "relu7"
tipo: "ReLU"
abajo: "fc7"
arriba: "fc7"
}

capa {
nombre: "drop7"
tipo: "Abandono"
abajo: "fc7"
arriba: "fc7"
dropout_param {
dropout_ratio: 0.5
}
}

capa {
nombre: "fc8"
tipo: "InnerProduct"
abajo: "fc7"
arriba: "fc8"
inner_product_param {
num_salida: 1000
}
}

Realmente una característica importante ...

Este convertidor de peso de Caffe a Keras es lo que está buscando:

https://github.com/pierluigiferrari/caffe_weight_converter

Convierte .caffemodel archivos a .h5 archivos peso. Convierte solo pesos, no la definición del modelo, pero los pesos son realmente todo lo que necesita de todos modos.

Para cualquier modelo dado, la definición del modelo requiere solo las capas de la biblioteca central de Keras, en cuyo caso es muy fácil escribir en Keras manualmente, o la definición del modelo es compleja y tiene tipos de capa personalizados, en cuyo caso un convertidor de definición de modelo probablemente fallaría de todos modos.

¿Qué entrada de forma se espera del nuevo modelo de keras convertido? (3,224,224) o (224,224,3)? porque caffe funciona con (3,224,224) y keras con (224,224,3) ...

¿Fue útil esta página
0 / 5 - 0 calificaciones