Keras: Comment convertir un modèle de café de type Keras ?

Créé le 14 mai 2015  ·  10Commentaires  ·  Source: keras-team/keras

Salut tout le monde,

Je souhaite utiliser Keras pour former un modèle CNN pour la classification. Comme je le sais, il existe de nombreux modèles CNN publics pré-entraînés, comme VGG, ImageNet, etc. Mais malheureusement, ces modèles pré-entraînés sont générés avec d'autres frameworks CNN, comme caffe ou cuda-convnet. Comment pouvons-nous utiliser ces types de modèles ou de poids pré-entraînés pour initialiser un modèle séquentiel Keras, puis effectuer l'entraînement de réglage fin ?

Merci
Dr Wu

stale

Commentaire le plus utile

Nous y travaillons. C'est certainement l'une des fonctionnalités que nous souhaitons ajouter prochainement. https://github.com/fchollet/keras/issues/100

Tous les 10 commentaires

J'espère aussi voir un tutoriel pour illustrer cela.

Nous y travaillons. C'est certainement l'une des fonctionnalités que nous souhaitons ajouter prochainement. https://github.com/fchollet/keras/issues/100

Si quelqu'un est toujours intéressé, vous pouvez utiliser ce fork de Keras qui a un module de conversion :
https://github.com/MarcBS/keras

Meilleur,
Marc

Salut,
J'essayais le module de conversion de caffe en keras que vous avez mentionné, mais j'obtiens cette erreur lorsque j'exécute caffe2keras.py

le nom global 'network_input' n'est pas défini

De l'aide?

@dhruvjain si vous faites référence à cette fourchette, ouvrez un nouveau problème ici , s'il vous plaît.

De plus, il serait très utile d'inclure les fichiers modèles que vous essayez de convertir, ou au moins le fichier .prototxt.

Je l'ai utilisé pour convertir le modèle caffenet, le prototxt est celui-ci :
nom : "CaffeNet"

force_backward : vrai
des données d'entrée"
input_dim : 1
input_dim: 3
input_dim: 227
input_dim: 227

entrée : « étiquette »
input_dim : 1
input_dim : 1
input_dim : 1
input_dim : 1

couche {
nom : "conv1"
tapez: "Convolution"
en bas : "données"
haut : "conv1"
convolution_param {
num_sortie : 96
taille_noyau : 11
foulée : 4
}
}

couche {
nom : "relu1"
tapez : "ReLU"
en bas : "conv1"
haut : "conv1"
}
couche {
nom : "pool1"
tapez : "Mise en commun"
en bas : "conv1"
haut : "pool1"
pooling_param {
piscine : MAXIMUM
taille_noyau : 3
foulée : 2
}
}
couche {
nom : "norme1"
tapez : "LRN"
en bas : "pool1"
haut : "norme1"
lrn_param {
taille_locale : 5
alpha : 0,0001
bêta : 0,75
}
}
couche {
nom : "conv2"
tapez: "Convolution"
en bas : "norm1"
haut : "conv2"
convolution_param {
nombre_sortie : 256
tampon : 2
taille_noyau : 5
groupe : 2
}
}
couche {
nom : "relu2"
tapez : "ReLU"
en bas : "conv2"
haut : "conv2"
}
couche {
nom : "pool2"
tapez : "Mise en commun"
en bas : "conv2"
haut : "pool2"
pooling_param {
piscine : MAXIMUM
taille_noyau : 3
foulée : 2
}
}
couche {
nom : "norme2"
tapez : "LRN"
en bas : "pool2"
haut : "norm2"
lrn_param {
taille_locale : 5
alpha : 0,0001
bêta : 0,75
}
}
couche {
nom : "conv3"
tapez: "Convolution"
en bas : "norm2"
haut : "conv3"
convolution_param {
num_sortie : 384
tampon : 1
taille_noyau : 3
}
}
couche {
nom : "relu3"
tapez : "ReLU"
en bas : "conv3"
haut : "conv3"
}
couche {
nom : "conv4"
tapez: "Convolution"
en bas : "conv3"
haut : "conv4"
convolution_param {
num_sortie : 384
tampon : 1
taille_noyau : 3
groupe : 2
}
}
couche {
nom : "relu4"
tapez : "ReLU"
en bas : "conv4"
haut : "conv4"
}
couche {
nom : "conv5"
tapez: "Convolution"
en bas : "conv4"
haut : "conv5"
convolution_param {
nombre_sortie : 256
tampon : 1
taille_noyau : 3
groupe : 2
}
}
couche {
nom : "relu5"
tapez : "ReLU"
en bas : "conv5"
haut : "conv5"
}
couche {
nom : "pool5"
tapez : "Mise en commun"
en bas : "conv5"
haut : "pool5"
pooling_param {
piscine : MAXIMUM
taille_noyau : 3
foulée : 2
}
}
couche {
nom : "fc6"
tapez : "Produit Intérieur"
en bas : "pool5"
haut : "fc6"
inner_product_param {
nombre_sortie : 4096
}
}
couche {
nom : "relu6"
tapez : "ReLU"
en bas : "fc6"
haut : "fc6"
}
couche {
nom: "drop6"
tapez : "Abandon"
en bas : "fc6"
haut : "fc6"
dropout_param {
dropout_ratio : 0,5
}
}
couche {
nom : "fc7"
tapez : "Produit Intérieur"
en bas : "fc6"
haut : "fc7"
inner_product_param {
nombre_sortie : 4096
}
}

couche {
nom : "relu7"
tapez : "ReLU"
en bas : "fc7"
haut : "fc7"
}

couche {
nom: "drop7"
tapez : "Abandon"
en bas : "fc7"
haut : "fc7"
dropout_param {
dropout_ratio : 0,5
}
}

couche {
nom : "fc8"
tapez : "Produit Intérieur"
en bas : "fc7"
haut : "fc8"
inner_product_param {
nombre_sortie : 1000
}
}

Vraiment une caractéristique importante...

Ce convertisseur de poids Caffe-à-Keras est ce que vous recherchez :

https://github.com/pierluigiferrari/caffe_weight_converter

Il convertit .caffemodel fichiers à .h5 fichiers de poids. Il convertit uniquement les poids, pas la définition du modèle, mais les poids sont vraiment tout ce dont vous avez besoin de toute façon.

Pour un modèle donné, la définition du modèle ne nécessite que des couches de bibliothèque de base Keras, auquel cas il est très facile d'écrire manuellement dans Keras, ou la définition du modèle est complexe et comporte des types de couches personnalisés, auquel cas un convertisseur de définition de modèle échouerait probablement. en tous cas.

quelle entrée de forme est attendue par le nouveau modèle de keras converti ? (3 224 224) ou (224 224,3) ? parce que caffe fonctionne avec (3,224,224) et keras avec (224,224,3)...

Cette page vous a été utile?
0 / 5 - 0 notes