Lua-Version Deep Learning von Grund auf neu 1 [Implementierung von Perceptron] Lua-Version Deep Learning von Grund auf neu 2 [Aktivierungsfunktion] Lua-Version Deep Learning von Grund auf neu Teil 3 [Implementierung eines 3-Schicht-Neuronalen Netzwerks] [Lua-Version Deep Learning von Grund auf neu 4 [Implementierung der Softmax-Funktion]] (http://qiita.com/Kazuki-Nakamae/items/20e53a02a8b759583d31) Lua-Version Deep Learning von Grund auf neu Teil 5 [Anzeige des MNIST-Bildes] Lua-Version Deep Learning von Grund auf neu Teil 5.5 [Bereitstellung von pkl-Dateien in Lua Torch]
Dieses Mal wird eine NN-Inferenzverarbeitung von MNIST-Bilddaten durchgeführt. Im Originaldokument wird die pkl-Datei gelesen, deren Gewicht und Abweichung im Voraus bestimmt wurden. Daher wurde dieses Mal dieselbe Verarbeitung mit Torch unter Verwendung dieser pkl-Datei durchgeführt. Informationen zum Lesen der pkl-Datei finden Sie unter Deep Learning von Grund auf für Lua Version 5.5 [Verwenden der pkl-Datei mit Lua Torch]. Siehe. Das Skript sieht folgendermaßen aus:
neuralnet_mnist.lua
require './activationFunc.lua'
require './softmax.lua'
require './exTorch.lua'
require 'image'
npy4th = require 'npy4th' --https://github.com/htwaijry/npy4th (Author:Hani Altwaijry)
---Datenerfassungsfunktion
--MNIST-Daten abrufen.
-- @Testdatenbild zurückgeben,Datenetikett testen{Type:ByteTensor}
function get_data()
--download
local tar = 'http://torch7.s3-website-us-east-1.amazonaws.com/data/mnist.t7.tgz'
if not paths.dirp('mnist.t7') then
os.execute('wget ' .. tar)
os.execute('tar xvf ' .. paths.basename(tar))
end
--get data
local test_file = 'mnist.t7/test_32x32.t7'
local testData = torch.load(test_file,'ascii')
return testData['data'], testData['labels']
end
---Netzwerkgenerierungsfunktion.
--Gibt ein 3-Schicht-NN mit bestimmten Gewichten und Vorspannungen zurück. Dieses Mal werden wir die in pkl beschriebenen Gewichte verwenden
-- @Rückgabe 3 Schicht NN(Type:table)
function init_network()
local network = npy4th.loadnpz('sample_weight.npz')
return network
end
---Klassifizierungsfunktion.
--Die Klassifizierungsberechnung wird gemäß dem Netzwerk durchgeführt.
-- @param Netzwerkeingang(Type:torch.table)
-- @param x Eingabe
-- @Ausgabe zurückgeben(Type:torch.DoubleTensor)
function predict(network, x)
local W1, W2, W3 = network['W1'], network['W2'], network['W3']
local b1, b2, b3 = network['b1'], network['b2'], network['b3']
--Die erste Eingabe macht den Tensor eindimensional, um dem Numpy-Format zu entsprechen
local a1 = mulTensor(x:resize(1,W1:size()[1]), W1) + b1:double()
local z1 = sigmoid(a1)
local a2 = mulTensor(z1,W2) + b2:double()
local z2 = sigmoid(a2)
local a3 = mulTensor(z2,W3) + b3:double()
local y = softmax(a3)
return y
end
local x, t = get_data()
local network = init_network()
local accuracy_cnt = 0
for i = 1, x:size()[1] do
scaledx = image.scale(x[i],28,28) --Reduzieren Sie 32x32 auf 28x28
local y = predict(network, scaledx)
local value, indices = torch.max(y, 2) -- torch.max( , 2)Holen Sie sich den Maximalwert in Zeilenrichtung mit
local p = tensor2scalar(indices) --Da es sich um einen Tensor handelt, wird er in einen Skalar umgewandelt
if p == t[i] then
accuracy_cnt = accuracy_cnt + 1
end
end
print("Accuracy:"..(accuracy_cnt/x:size()[1]))
Im Originaldokument waren es 28x28 MMIST-Daten, aber das diesmal verwendete Bild ist 32x32. Daher werden die reduzierten Daten wie image.scale (Bilddaten, 28, 28) einer Inferenzverarbeitung unterzogen. Bitte beachten Sie, dass das Ergebnis vom Original abweicht. activityFunc.lua, softmax.lua bitte beziehen Sie sich auf. exTorch.lua enthält zusätzliche definierte Funktionen zur Verbesserung der Lesbarkeit.
exTorch.lua
---Berechnungsfunktion des Produkts zwischen Tensoren
--Führen Sie das Produkt AB der Tensoren aus, die jeder Dimension entsprechen.
-- @param A A (Type:Tensor)
-- @param B B (Type:Tensor)
-- @return AB (Type:torch.DoubleTensor)
function mulTensor(A, B)
A = A:double()
B = B:double()
local AB = nil;
if (A:dim() == 1 and B:dim() ~= 1) then
--1Dvektor ・ Matrix
AB = torch.mv(B:t(), A)
else
--others
AB = A*B
end
return AB
end
---Skalare Konvertierungsfunktion für Tensor
--Konvertieren Sie den 1x1-Tensor in einen Skalar.
-- @Param Tensor 1x1 Tensor(Type:Tensor)
-- @Skalar zurückgeben(Type:number)
function tensor2scalar(tensor)
return tensor[1]
end
Ausführungsbeispiel
$ th neuralnet_mnist.lua
Accuracy:0.8616
Da es reduziert ist, unterscheidet es sich vom Ergebnis in Python, aber es scheint, dass die Inferenz selbst richtig gemacht wird. Dieses Mal gibt es viele Prozesse, die gezwungen sind, mit den Python-Daten übereinzustimmen, aber ohne sie denke ich, dass der Inferenzprozess mit dem gleichen Aufwand wie das Original durchgeführt werden kann. Das einzige, was zu beachten ist, ist, dass die Typbehandlung möglicherweise vorsichtiger ist als Python. In Python wird stattdessen die implizite Typkonvertierung verwendet, aber die Behandlung von Typen durch Lua ist ziemlich Standard. Wenn sie sich also unterscheiden, wird ein Fehler zurückgegeben. Wenn Sie wissen, dass der Typ eine Ganzzahlberechnung ist, verwenden Sie einen Ganzzahltyp wie Byte oder Long. Wenn Sie mit Brüchen rechnen, verwenden Sie den Doppeltyp. Grundsätzlich sind Computerfraktionsberechnungen immer fehleranfällig, daher sollten Float-Typen so weit wie möglich vermieden werden. Wenn Sie es nicht wissen, versuchen Sie es mit dem folgenden Code.
cancellation.lua
local floatT = torch.Tensor(1):fill(0):float()
for i = 1, 1000000 do
floatT = floatT + torch.Tensor(1):fill(0.000001):float()
end
local doubleT = torch.Tensor(1):fill(0):double()
for i = 1, 1000000 do
doubleT = doubleT + torch.Tensor(1):fill(0.000001):double()
end
print("float : ")
print(floatT)
print("double : ")
print(doubleT)
Ausführungsbeispiel
$ th cancellation.lua
float :
1.0090
[torch.FloatTensor of size 1]
double :
1.0000
[torch.DoubleTensor of size 1]
Ursprünglich ist die korrekte Berechnung, dass beide 1 sind, aber das Ergebnis wird aufgrund eines Fehlers im Float unterschiedlich sein. Double verursacht ebenfalls einen solchen Fehler, ist jedoch sicherer als float.
Diese Zeit ist vorbei.
Es ist unangenehm, dies mit dem reduzierten Ergebnis zu tun. Extrahieren wir also auch die MMIST-Daten aus Python. Kopieren Sie das Dataset-Verzeichnis aus den Dateien im Anhang des Originaldokuments in das aktuelle Verzeichnis und führen Sie das folgende Skript aus.
saveMMISTtest.py
# coding: utf-8
import sys, os
import numpy as np
import pickle
from dataset.mnist import load_mnist
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False)
np.save("x_test",x_test)
np.save("t_test",t_test)
Ausführungsbeispiel
$ python3 saveMMISTtest.py
Da x_test.npy und t_test.npy ausgegeben werden, lesen Sie sie mit get_data ().
neuralnet_mnist2.lua
require './activationFunc.lua'
require './softmax.lua'
require './exTorch.lua'
npy4th = require 'npy4th' --https://github.com/htwaijry/npy4th (Author:Hani Altwaijry)
---Datenerfassungsfunktion
--MNIST-Daten abrufen.
-- @Testdatenbild zurückgeben,Datenetikett testen{Type:ByteTensor}
function get_data()
--Bilddaten
local x_test = npy4th.loadnpy('x_test.npy')
--Daten beschriften
local t_test = npy4th.loadnpy('t_test.npy')
return x_test, t_test
end
---Netzwerkgenerierungsfunktion.
--Gibt ein 3-Schicht-NN mit bestimmten Gewichten und Vorspannungen zurück. Dieses Mal werden wir die in pkl beschriebenen Gewichte verwenden
-- @Rückgabe 3 Schicht NN(Type:table)
function init_network()
local network = npy4th.loadnpz('sample_weight.npz')
return network
end
---Klassifizierungsfunktion.
--Die Klassifizierungsberechnung wird gemäß dem Netzwerk durchgeführt.
-- @param Netzwerkeingang(Type:torch.table)
-- @param x Eingabe
-- @Ausgabe zurückgeben(Type:torch.DoubleTensor)
function predict(network, x)
local W1, W2, W3 = network['W1'], network['W2'], network['W3']
local b1, b2, b3 = network['b1'], network['b2'], network['b3']
--Die erste Eingabe macht den Tensor eindimensional, um dem Numpy-Format zu entsprechen
local a1 = mulTensor(x, W1) + b1:double()
local z1 = sigmoid(a1)
local a2 = mulTensor(z1,W2) + b2:double()
local z2 = sigmoid(a2)
local a3 = mulTensor(z2,W3) + b3:double()
local y = softmax(a3)
return y
end
local x, t = get_data()
local network = init_network()
local accuracy_cnt = 0
for i = 1, x:size()[1] do
local y = predict(network, x[i])
local value, indices = torch.max(y, 1) -- torch.max( , 1)Holen Sie sich den Maximalwert in Richtung col mit
local p = tensor2scalar(indices) -1 --Da es sich um eine Python-Ausgabe handelt, ist der Anfang des Arrays 0, das Array von Lua(Tabellentyp)Beginnt bei 1, also um 1 verschieben
if p == t[i] then
accuracy_cnt = accuracy_cnt + 1
end
end
print("Accuracy:"..(accuracy_cnt/x:size()[1]))
Ausführungsbeispiel
$ th neuralnet_mnist2.lua
Accuracy:0.9352
Damit konnte ich die gleiche Ausgabe wie das Original ausgeben.
Recommended Posts