Comment alimenter les données caffe multi label au format HDF5?
Je veux utiliser caffe avec un vecteur étiquette, pas entier. J'ai vérifié quelques réponses, et il semble HDF5 est une meilleure façon. Mais là je suis coincé avec une erreur de ce type:
accuracy_layer.rpc:34] échec de la Vérification:
outer_num_ * inner_num_ == bottom[1]->count()
(50 vs 200) Nombre d'étiquettes doivent correspondre nombre de prédictions; par exemple, si l'étiquette de l'axe == 1 et la prédiction de la forme (N, C, H, l), étiquette de comptage (nombre d'étiquettes) doit êtreN*H*W
avec des valeurs de type entier dans {0, 1, ..., C-1}.
avec HDF5 créé:
f = h5py.File('train.h5', 'w')
f.create_dataset('data', (1200, 128), dtype='f8')
f.create_dataset('label', (1200, 4), dtype='f4')
Mon réseau est générée par:
def net(hdf5, batch_size):
n = caffe.NetSpec()
n.data, n.label = L.HDF5Data(batch_size=batch_size, source=hdf5, ntop=2)
n.ip1 = L.InnerProduct(n.data, num_output=50, weight_filler=dict(type='xavier'))
n.relu1 = L.ReLU(n.ip1, in_place=True)
n.ip2 = L.InnerProduct(n.relu1, num_output=50, weight_filler=dict(type='xavier'))
n.relu2 = L.ReLU(n.ip2, in_place=True)
n.ip3 = L.InnerProduct(n.relu1, num_output=4, weight_filler=dict(type='xavier'))
n.accuracy = L.Accuracy(n.ip3, n.label)
n.loss = L.SoftmaxWithLoss(n.ip3, n.label)
return n.to_proto()
with open(PROJECT_HOME + 'auto_train.prototxt', 'w') as f:
f.write(str(net('/home/romulus/code/project/train.h5list', 50)))
with open(PROJECT_HOME + 'auto_test.prototxt', 'w') as f:
f.write(str(net('/home/romulus/code/project/test.h5list', 20)))
Il semble que je devrais augmenter numéro de l'étiquette et de mettre les choses en entier plutôt que de tableau, mais si je fais cela, caffe se plaint nombre de données et l'étiquette n'est pas égal, alors il existe.
Alors, qu'est-ce que le format correct pour nourrir multi les données de l'étiquette?
Aussi, je suis si vous vous demandez pourquoi personne n'a juste suffit d'écrire le format de données comment HDF5 cartes de caffe gouttes?
source d'informationauteur Romulus Urakagi Ts'ai
Vous devez vous connecter pour publier un commentaire.
Réponse à cette question du titre:
La HDF5 fichier doit avoir deux dataset dans la racine, nommé "data" et "étiquette", respectivement. La forme est (
data amount
dimension
). Je suis à l'aide d'un seul-données de dimension, donc je ne sais pas quel est l'ordre dechannel
width
etheight
. Peut-être qu'il n'a pas d'importance.dtype
doit être de type float ou double.Un exemple de code permettant de créer train avec
h5py
est:Aussi, la précision de la couche n'est pas nécessaire, il suffit de l'enlever de l'amende. Un autre problème est la perte de la couche. Depuis
SoftmaxWithLoss
a qu'une seule sortie (l'indice de la dimension avec une valeur max), il ne peut pas être utilisé pour le multi-étiquette problème. Merci à Adian et Shai, je trouveSigmoidCrossEntropyLoss
est bonne dans ce cas.Ci-dessous le code complet, de la création de données, réseau de formation et de prise en résultat du test:
h5list fichiers contiennent simplement des chemins de h5 fichiers dans chaque ligne:
et le solveur:
Convergent graphique:
Dernier lot résultat:
Je pense que ce code a encore beaucoup de choses à améliorer. Toute suggestion est apprécié.
Votre précision de la couche n'a pas de sens.
Le chemin de la précision de la couche d'œuvres: dans café la précision de la couche attend deux entrées
(i) une probabilité prédite vecteur et
(ii) à la réalité de terrain correspondant scalaire entier étiquette.
L'exactitude de la couche de contrôle si la probabilité de la prédite de l'étiquette est en effet le maximum (ou dans
top_k
).Donc si vous avez de classer
C
différentes classes, vos données vont êtreN
parC
(oùN
est la taille du lot) entrée probabilités prédites pourN
échantillons appartenant à chacune desC
classes, etN
étiquettes.La façon dont il est défini dans votre net: Vous avez une précision d'entrée de la couche de
N
-par-4 prédictions etN
-par-4 étiquettes, cela n'a aucun sens pour caffe.