Keras: Como converter um modelo caffe para o tipo Keras?

Criado em 14 mai. 2015  ·  10Comentários  ·  Fonte: keras-team/keras

Olá a todos,

Quero usar Keras para treinar um modelo da CNN para classificação. Como eu sei, existem muitos modelos públicos pré-treinados da CNN, como VGG, ImageNet etc. Mas, infelizmente, esses modelos pré-treinados são gerados com outro framework CNN, como caffe ou cuda-convnet. Como podemos usar esses tipos de modelos ou pesos pré-treinados para inicializar um modelo sequencial Keras e, em seguida, fazer o treinamento de ajuste fino?

Obrigado
Dr. Wu

stale

Comentários muito úteis

Estamos trabalhando nisso. Este é definitivamente um dos recursos que queremos adicionar em breve. https://github.com/fchollet/keras/issues/100

Todos 10 comentários

Também espero ver um tutorial para ilustrar isso.

Estamos trabalhando nisso. Este é definitivamente um dos recursos que queremos adicionar em breve. https://github.com/fchollet/keras/issues/100

Se alguém ainda estiver interessado, você pode usar este fork do Keras que tem um módulo de conversão:
https://github.com/MarcBS/keras

melhor,
Marc

Oi,
Eu estava tentando o módulo de conversão do caffe em keras que você mencionou, mas estou recebendo este erro quando executo o caffe2keras.py

nome global 'network_input' não está definido

Qualquer ajuda?

@dhruvjain se você está se referindo a esta bifurcação , abra um novo problema aqui , por favor.

Além disso, seria muito útil se você pudesse incluir os arquivos de modelo que está tentando converter, ou pelo menos o .prototxt.

Usei para converter o modelo caffenet, o prototxt é este aqui:
nome: "CaffeNet"

force_backward: true
entrada: "dados"
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

camada {
nome: "conv1"
tipo: "Convolução"
inferior: "dados"
topo: "conv1"
convolution_param {
num_output: 96
kernel_size: 11
passo: 4
}
}

camada {
nome: "relu1"
tipo: "ReLU"
inferior: "conv1"
topo: "conv1"
}
camada {
nome: "pool1"
tipo: "Pooling"
inferior: "conv1"
topo: "pool1"
pooling_param {
piscina: MAX
kernel_size: 3
passo: 2
}
}
camada {
nome: "norm1"
tipo: "LRN"
inferior: "pool1"
topo: "norm1"
lrn_param {
local_size: 5
alfa: 0,0001
beta: 0,75
}
}
camada {
nome: "conv2"
tipo: "Convolução"
inferior: "norm1"
topo: "conv2"
convolution_param {
num_output: 256
pad: 2
kernel_size: 5
grupo: 2
}
}
camada {
nome: "relu2"
tipo: "ReLU"
inferior: "conv2"
topo: "conv2"
}
camada {
nome: "pool2"
tipo: "Pooling"
inferior: "conv2"
topo: "pool2"
pooling_param {
piscina: MAX
kernel_size: 3
passo: 2
}
}
camada {
nome: "norm2"
tipo: "LRN"
inferior: "pool2"
topo: "norm2"
lrn_param {
local_size: 5
alfa: 0,0001
beta: 0,75
}
}
camada {
nome: "conv3"
tipo: "Convolução"
inferior: "norm2"
topo: "conv3"
convolution_param {
num_output: 384
pad: 1
kernel_size: 3
}
}
camada {
nome: "relu3"
tipo: "ReLU"
inferior: "conv3"
topo: "conv3"
}
camada {
nome: "conv4"
tipo: "Convolução"
inferior: "conv3"
topo: "conv4"
convolution_param {
num_output: 384
pad: 1
kernel_size: 3
grupo: 2
}
}
camada {
nome: "relu4"
tipo: "ReLU"
inferior: "conv4"
topo: "conv4"
}
camada {
nome: "conv5"
tipo: "Convolução"
inferior: "conv4"
topo: "conv5"
convolution_param {
num_output: 256
pad: 1
kernel_size: 3
grupo: 2
}
}
camada {
nome: "relu5"
tipo: "ReLU"
inferior: "conv5"
topo: "conv5"
}
camada {
nome: "pool5"
tipo: "Pooling"
inferior: "conv5"
topo: "pool5"
pooling_param {
piscina: MAX
kernel_size: 3
passo: 2
}
}
camada {
nome: "fc6"
tipo: "InnerProduct"
inferior: "pool5"
topo: "fc6"
inner_product_param {
num_output: 4096
}
}
camada {
nome: "relu6"
tipo: "ReLU"
inferior: "fc6"
topo: "fc6"
}
camada {
nome: "drop6"
tipo: "Dropout"
inferior: "fc6"
topo: "fc6"
dropout_param {
dropout_ratio: 0,5
}
}
camada {
nome: "fc7"
tipo: "InnerProduct"
inferior: "fc6"
topo: "fc7"
inner_product_param {
num_output: 4096
}
}

camada {
nome: "relu7"
tipo: "ReLU"
inferior: "fc7"
topo: "fc7"
}

camada {
nome: "drop7"
tipo: "Dropout"
inferior: "fc7"
topo: "fc7"
dropout_param {
dropout_ratio: 0,5
}
}

camada {
nome: "fc8"
tipo: "InnerProduct"
inferior: "fc7"
topo: "fc8"
inner_product_param {
num_output: 1000
}
}

Realmente um recurso importante ...

Este conversor de peso Caffe-to-Keras é o que você está procurando:

https://github.com/pierluigiferrari/caffe_weight_converter

Ele converte .caffemodel arquivos em .h5 weight files. Ele converte apenas os pesos, não a definição do modelo, mas os pesos são realmente tudo que você precisa de qualquer maneira.

Para qualquer modelo, a definição do modelo requer apenas camadas da biblioteca central Keras, caso em que é muito fácil escrever em Keras manualmente, ou a definição do modelo é complexa e tem tipos de camada personalizados, caso em que um conversor de definição de modelo provavelmente falharia de qualquer forma.

que forma de entrada é esperada pelo novo modelo keras convertido? (3.224.224) ou (224.224,3)? porque caffe trabalha com (3.224.224) e keras com (224.224,3) ...

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

somewacko picture somewacko  ·  3Comentários

snakeztc picture snakeztc  ·  3Comentários

anjishnu picture anjishnu  ·  3Comentários

nryant picture nryant  ·  3Comentários

zygmuntz picture zygmuntz  ·  3Comentários