Caffe: problème avec memory_data_layer en python

Créé le 12 août 2014  ·  6Commentaires  ·  Source: BVLC/caffe

Salut à tous,

J'essaie actuellement d'utiliser memory_data_layer pour alimenter un réseau avec beaucoup d'images en mémoire
car il est plus rapide que de recadrer l'image et de créer une base de données leveldb.
J'utilise donc ce code en python :

caffe_root = 'XXX'
solverPrototxt='/XXX_solver.prototxt'
import numpy as np
import skimage
import time
import os
#make sure that caffe is on the python path:
import sys
sys.path.insert(0, caffe_root + 'python')
import caffe
#choose which GPU we want to use - by default=0
os.environ["CUDA_VISIBLE_DEVICES"] ="1" 
#load one image data
fileProcessesd="/XXX.bmp"
image32=caffe.io.load_image(fileProcessesd)
#crop 640 image from the image loaded and associated it to label 0 
#nb batch=64 for test and train
labels=np.zeros((640),dtype='float32')
imageData=np.zeros((640,3,101,101),dtype='float32')
for i in range(64) :
    for j in range(10) : 
        sys.stdout.flush()
        sys.stdout.write("\ri={0:4d}:j={1:4d}".format(i,j))
        imageData[j+i*10,:,:,:]=np.transpose(image32[i:101+i,j:101+j,:],axes=[2,0,1])
#load solver in GPU mode
solver=caffe.SGDSolver(solverPrototxt)
solver.net.set_mode_gpu()
#set input and solve
solver.net.set_input_arrays(imageData, labels)
solver.solve()

et à la fin j'ai cette erreur que je peux résoudre

I0812 14:55:50.548095 32664 solver.cpp:82] Solving XXX-train
I0812 14:55:50.548144 32664 solver.cpp:135] Iteration 0, Testing net (#0)
F0812 14:55:50.548180 32664 memory_data_layer.cpp:41] Check failed: data_ MemoryDataLayer needs to be initalized by calling Reset
*** Check failure stack trace: ***
Aborted (core dumped)

Une idée? THX.
Henri

Commentaire le plus utile

@hnoel : Il semble que vous utilisiez un réseau de test avec un MemoryDataLayer , qui n'est actuellement pas pris en charge. (Notez que solver.net est le réseau de train.) Vous pouvez supprimer ce réseau de test de votre prototxt de solveur, ou vous pouvez utiliser un réseau de test qui n'utilise pas de MemoryDataLayer , ou vous pouvez écrire code (PR?) pour exposer les réseaux de test dans l'interface Python, vous permettant de tester avec un MemoryDataLayer .

@shelhamer , oui, je vais essayer d'ajouter un exemple pour cela bientôt.

Tous les 6 commentaires

Pour aller plus loin, le problème en fait est que je peux localiser la méthode 'reset' et donc l'utiliser en python.
J'ai lu dans #119 qu'il peut être un problème de changer la taille du lot à la volée mais
ce n'est pas mon idée mais devrait être la raison de l'erreur, est-ce que je me trompe ?
Quelqu'un a-t-il rencontré ce problème ? THX.
Henri

@longjon un autre vote pour un exemple de résolution Python / couche de données en mémoire.
Peut-être que cela pourrait être un ajout intéressant à l'exemple LeNet ?

Le mardi 12 août 2014, hnoel [email protected] a écrit :

Pour aller plus loin, le problème en fait est que je peux localiser la méthode 'reset' et
donc l'utiliser en python.
J'ai lu dans #119 https://github.com/BVLC/caffe/issues/119 qu'il
peut être un problème pour changer la taille du lot à la volée, mais
ce n'est pas mon idée mais devrait être la raison de l'erreur, est-ce que je me trompe ?
Quelqu'un a-t-il rencontré ce problème ? THX.
Henri

-
Répondez directement à cet e-mail ou consultez-le sur GitHub
https://github.com/BVLC/caffe/issues/912#issuecomment-52015234 .

Evan Shelhamer

Merci @shelhamer de lier mon problème à un autre rencontré.
Quant à moi, un problème fort est la gestion des ressources
lorsque vous possédez une grande base de données et que vous souhaitez tester différentes stratégies de pré-traitement.
Cependant, je ne suis pas sûr que ce soit le bon type de couche de données pour cet usage...
Python est un moyen rapide de charger et d'effectuer un pré-traitement des données
sans remplir tout le disque dur avec des images supplémentaires puis
le prochain problème est de savoir comment alimenter le réseau pour la formation/les tests qui ont conduit à mon problème ..
Cette stratégie n'est peut-être pas la plus rapide (nécessité d'effectuer un pré-traitement à chaque fois)
mais cela réduit le besoin de mémoire du disque dur pour enregistrer la base de données (aucune base de données leveldb requise),
ai-je raison ? Par conséquent, un exemple ne doit pas être une perte de temps !
similaire au numéro #701 en fait

@hnoel : Il semble que vous utilisiez un réseau de test avec un MemoryDataLayer , qui n'est actuellement pas pris en charge. (Notez que solver.net est le réseau de train.) Vous pouvez supprimer ce réseau de test de votre prototxt de solveur, ou vous pouvez utiliser un réseau de test qui n'utilise pas de MemoryDataLayer , ou vous pouvez écrire code (PR?) pour exposer les réseaux de test dans l'interface Python, vous permettant de tester avec un MemoryDataLayer .

@shelhamer , oui, je vais essayer d'ajouter un exemple pour cela bientôt.

1196 expose les réseaux de test et permet à ces réseaux de prendre en entrée MemoryDataLayer .

Salut! Cette erreur s'est également produite dans mon code, que j'utilise le MemoryDataLayer comme couche d'entrée dans les phases TRAIN et TEST, mais j'ai constaté que le programme resterait bloqué dans la phase TEST et m'a donné une telle erreur : memory_data_layer. cpp:113 ] Échec de la vérification : data_ MemoryDataLayer doit être initialisé en appelant Reset. Je ne suis pas sûr que ce problème appartienne à develop probblem , mais lorsque je recherche du matériel d'aide sur Internet, j'ai trouvé cette discussion sur ce problème, alors j'ai décidé de poster ma question ici, je suis désolé si cette action n'était pas appropriée ! Vous trouverez ci-dessous le code C++, deploy.prototxt et solver.prototxt. Merci beaucoup!
mon code C++ :
// Copyright 2013 Yangqing Jia
//
// Il s'agit d'un script simple qui permet d'entraîner rapidement un réseau dont
// les paramètres sont spécifiés par des tampons de protocole au format texte.
// Utilisation :
// train_net net_proto_file solver_proto_file [resume_point_file]

comprendre

comprendre

comprendre

comprendre

comprendre

comprendre

comprendre

inclure "caffe/caffe.hpp"

inclure "caffe/util/io.hpp"

inclure "caffe/blob.hpp"

inclure "/usr/local/include/opencv2/core/core.hpp"

inclure "/usr/local/include/opencv2/highgui/highgui.hpp"

en utilisant l'espace de noms caffe ;

int main(int argc, char** argv) {
::google::InitGoogleLogging(argv[0]);
si (argc < 2) {
LOG(ERROR) << "Utilisation : train_net solver_proto_file [resume_point_file]" ;
renvoie 0 ;
}

SolverParameter solver_param;
ReadProtoFromTextFile(argv[1], &solver_param);

LOG(INFO) << "Démarrage de l'optimisation" ;
SGDSolversolveur(solver_param);
si (argc == 3) {
LOG(INFO) << "Reprise de " << argv[2];
solveur.Solve(argv[2]);
} autre {
solveur.Résoudre();
}
LOG(INFO) << "Optimisation terminée.";

renvoie 0 ;
}

delploy.prototxt :
nom : "TestMemoryDataLayer"
couches
{
nom : "données"
tapez : MEMORY_DATA
en haut : "données"
en haut : « étiquette »
memory_data_param
{
taille_lot : 1
canaux : 3
hauteur: 224
largeur: 224
}
transform_param
{
crop_size: 224
miroir : vrai
#mean_file : "/to/caffe-dev/data/ilsvrc12/imagenet_mean.binaryproto"
}
inclure : { phase : ENTRAINER }
}

couches
{
nom : "données"
tapez : MEMORY_DATA
en haut : "données"
en haut : « étiquette »
memory_data_param
{
taille_lot : 1
canaux : 3
hauteur: 224
largeur: 224
}
transform_param
{
crop_size: 224
miroir : vrai
#mean_file : "/to/caffe-dev/data/ilsvrc12/imagenet_mean.binaryproto"
}
inclure : { phase : TEST }
}
couches {
nom : "conv1"
type : CONVOLUTION
en bas : "données"
haut : "conv1"
convolution_param {
num_sortie : 96
taille_noyau : 11
foulée : 4
}
}
couches {
nom : "relu1"
tapez : RELU
en bas : "conv1"
haut : "conv1"
}
couches {
nom : "pool1"
type : MISE EN COMMUN
en bas : "conv1"
haut : "pool1"
pooling_param {
piscine : MAXIMUM
taille_noyau : 3
foulée : 2
}
}
couches {
nom : "norme1"
type : LRN
en bas : "pool1"
haut : "norme1"
lrn_param {
taille_locale : 5
alpha : 0,0001
bêta : 0,75
}
}
couches {
nom : "conv2"
type : CONVOLUTION
en bas : "norm1"
haut : "conv2"
convolution_param {
nombre_sortie : 256
tampon : 2
taille_noyau : 5
groupe : 2
}
}
couches {
nom : "relu2"
tapez : RELU
en bas : "conv2"
haut : "conv2"
}
couches {
nom : "pool2"
type : MISE EN COMMUN
en bas : "conv2"
haut : "pool2"
pooling_param {
piscine : MAXIMUM
taille_noyau : 3
foulée : 2
}
}
couches {
nom : "norme2"
type : LRN
en bas : "pool2"
haut : "norm2"
lrn_param {
taille_locale : 5
alpha : 0,0001
bêta : 0,75
}
}
couches {
nom : "conv3"
type : CONVOLUTION
en bas : "norm2"
haut : "conv3"
convolution_param {
num_sortie : 384
tampon : 1
taille_noyau : 3
}
}
couches {
nom : "relu3"
tapez : RELU
en bas : "conv3"
haut : "conv3"
}
couches {
nom : "conv4"
type : CONVOLUTION
en bas : "conv3"
haut : "conv4"
convolution_param {
num_sortie : 384
tampon : 1
taille_noyau : 3
groupe : 2
}
}
couches {
nom : "relu4"
tapez : RELU
en bas : "conv4"
haut : "conv4"
}
couches {
nom : "conv5"
type : CONVOLUTION
en bas : "conv4"
haut : "conv5"
convolution_param {
nombre_sortie : 256
tampon : 1
taille_noyau : 3
groupe : 2
}
}
couches {
nom : "relu5"
tapez : RELU
en bas : "conv5"
haut : "conv5"
}
couches {
nom : "pool5"
type : MISE EN COMMUN
en bas : "conv5"
haut : "pool5"
pooling_param {
piscine : MAXIMUM
taille_noyau : 3
foulée : 2
}
}
couches {
nom : "fc6"
tapez : INNER_PRODUCT
en bas : "pool5"
haut : "fc6"
inner_product_param {
nombre_sortie : 4096
}
}
couches {
nom : "relu6"
tapez : RELU
en bas : "fc6"
haut : "fc6"
}
couches {
nom: "drop6"
type : ABANDON
en bas : "fc6"
haut : "fc6"
dropout_param {
dropout_ratio : 0,5
}
}
couches {
nom : "fc7"
tapez : INNER_PRODUCT
en bas : "fc6"
haut : "fc7"
inner_product_param {
nombre_sortie : 4096
}
}
couches {
nom : "relu7"
tapez : RELU
en bas : "fc7"
haut : "fc7"
}
couches {
nom: "drop7"
type : ABANDON
en bas : "fc7"
haut : "fc7"
dropout_param {
dropout_ratio : 0,5
}
}
couches {
nom : "fc8"
tapez : INNER_PRODUCT
en bas : "fc7"
haut : "fc8"
inner_product_param {
nombre_sortie : 1000
}
}
couches {
nom: "précision"
type : PRÉCISION
en bas : "fc8" #"prob" #"fc8-new"
en bas : "étiquette"
haut : "précision"
#top_k : 5
inclure : { phase : TEST }
}

couches {
nom: "perte"
tapez : SOFTMAX_LOSS
en bas : "fc8" #étiquette prédite, utilisée dans la passe avant
en bas : "étiquette"
haut : "perte"
}

solveur.prototct :
net : "deploy.prototxt"
test_iter: 1000
intervalle_test : 1000
base_lr : 0,01
lr_policy : "étape"
gamma : 0,1
pas: 100000
affichage : 20
max_iter: 450000
élan : 0.9
weight_decay : 0,0005
instantané : 10000
snapshot_prefix : "caffenet_train"
solver_mode : GPU

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

Questions connexes

snavavf picture snavavf  ·  60Commentaires

TJKlein picture TJKlein  ·  35Commentaires

bcd33bcd picture bcd33bcd  ·  34Commentaires

darshoka picture darshoka  ·  36Commentaires

happyyxw picture happyyxw  ·  45Commentaires