2017-03-01 1 views
1

Je suis très nouveau à l'apprentissage en profondeur et j'essaie d'obtenir une classification avec lua.Classification avec le modèle de la torche exporté de chiffres - lua 5.1

J'ai installé chiffres avec torche et Lua 5.1 et j'ai former le modèle suivant:

image of the model

Après cela, je l'ai fait une classification avec le serveur chiffres pour tester la et exemple voici le résultat: result of classification

J'ai exporté le modèle et maintenant je suis en train de faire une classification avec le code Lua suivant:

local image_url = '/home/delpech/mnist/test/5/04131.png' 
local network_url = '/home/delpech/models/snapshot_30_Model.t7' 
local network_name = paths.basename(network_url) 

print '==> Loading network' 
local net = torch.load(network_name) 

--local net = torch.load(network_name):unpack():float() 
net:evaluate() 
print(net) 

print '==> Loading synsets' 
print 'Loads mapping from net outputs to human readable labels' 
local synset_words = {} 
--for line in io.lines'/home/delpech/models/labels.txt' do table.insert(synset_words, line:sub(11)) end 
for line in io.lines'/home/delpech/models/labels.txt' do table.insert(synset_words, line) end 

print 'synset words' 
for line in io.lines'/home/delpech/models/labels.txt' do print(line) end 

print '==> Loading image and imagenet mean' 
local im = image.load(image_url) 

print '==> Preprocessing' 
local I = image.scale(im,28,28,'bilinear'):float() 

print 'Propagate through the network, sort outputs in decreasing order and show 10 best classes' 
local _,classes = net:forward(I):view(-1):sort(true) 

for i=1,10 do 
    print('predicted class '..tostring(i)..': ', synset_words[classes[i]]) 
end 

Mais voici la sortie:

[email protected]:~/models$ lua classify.lua 

==> Downloading image and network 
==> Loading network 
nn.Sequential { 
    [input -> (1) -> (2) -> (3) -> (4) -> (5) -> (6) -> (7) -> (8) -> (9) -> (10) -> output] 
    (1): nn.MulConstant 
    (2): nn.SpatialConvolution(1 -> 20, 5x5) 
    (3): nn.SpatialMaxPooling(2x2, 2,2) 
    (4): nn.SpatialConvolution(20 -> 50, 5x5) 
    (5): nn.SpatialMaxPooling(2x2, 2,2) 
    (6): nn.View(-1) 
    (7): nn.Linear(800 -> 500) 
    (8): nn.ReLU 
    (9): nn.Linear(500 -> 10) 
    (10): nn.LogSoftMax 
} 
==> Loading synsets 
Loads mapping from net outputs to human readable labels 
synset words 
0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
==> Loading image and imagenet mean 
==> Preprocessing 
Propagate through the network, sort outputs in decreasing order and show 5 best classes 
predicted class 1: 4 
predicted class 2: 8 
predicted class 3: 0 
predicted class 4: 1 
predicted class 5: 9 
predicted class 6: 6 
predicted class 7: 7 
predicted class 8: 2 
predicted class 9: 5 
predicted class 10:  3 

Et cela est en fait pas le classement fourni par des chiffres ...

+0

Demandez-vous la même pré-traitement à l'image comme ils l'ont fait pendant la formation du réseau? En soustrayant les valeurs moyennes de chaque pixel? –

+0

Non je ne suis pas mais je d'ont savoir comment l'extraire ... dans le premier exemple https://github.com/torch/tutorials/blob/master/7_imagenet_classification/classify.lua j'ai vu qu'ils ont utilisé la propriété network.transform dans l'objet réseau chargé mais je l'ai (valeur nulle retournée ...) dans mon modèle chargé à partir de chiffres ... – CoDel

+0

On dirait que vous devrez coder une méthode qui prétraite l'image comme il le fait à https://github.com/torch/tutorials/blob/master/7_imagenet_classification/classify.lua#L43. Ils doivent indiquer les paramètres qu'ils ont utilisés pour pré-traiter l'ensemble de données sur la page Web source où vous avez obtenu le modèle. –

Répondre

0

OK, après la recherche dans la source de code chiffres, il avait l'air comme je l'ai raté deux choses:

  • vous devez obtenir l'image moyenne dans le dossier de l'emploi et faire le pré-processus suivant:

    print '==> Prétraitement' pour i = 1, im_mean: taille (1) faire im [i]: CSUB ([i] im_mean) fin

  • et le fait que je devais charger mon les images de cette façon et multiplier chaque pixel à 255.

im = image.load local (image_url): type ('torch.FloatTensor'): contigu(); im: Mul (255)

Voici le anwser total:

require 'image' 
require 'nn' 
require 'torch' 
require 'paths' 

local function main() 

print '==> Downloading image and network' 
local image_url = '/home/delpech/mnist/test/7/03079.png' 
local network_url = '/home/delpech/models/snapshot_30_Model.t7' 
local mean_url = '/home/delpech/models/mean.jpg' 

print '==> Loading network' 
local net = torch.load(network_url) 
net:evaluate(); 

print '==> Loading synsets' 
print 'Loads mapping from net outputs to human readable labels' 
local synset_words = {} 
for line in io.lines'/home/delpech/models/labels.txt' do table.insert(synset_words, line) end 

print '==> Loading image and imagenet mean' 
local im = image.load(image_url):type('torch.FloatTensor'):contiguous();--:contiguous() 
im:mul(255) 
local I = image.scale(im,28,28,'bilinear'):float() 


local im_mean = image.load(mean_url):type('torch.FloatTensor'):contiguous(); 
im_mean:mul(255) 
local Imean = image.scale(im,28,28,'bilinear'):float() 

print '==> Preprocessing' 
for i=1,im_mean:size(1) do 
    im[i]:csub(im_mean[i]) 
end 

local _,classes = net:forward(im):sort(true); 
for i=1,10 do 
    print('predicted class '..tostring(i)..': ', synset_words[classes[i]]) 
end 

end 


main()