[PYTHON] Lua-Version Deep Learning von Grund auf neu Teil 6 [Inferenzverarbeitung für neuronale Netze]

Frühere Artikel

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]

Inferenzverarbeitung für neuronale Netze

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.

abschließend

Diese Zeit ist vorbei.

Das nächste Mal werde ich versuchen, die Stapelverarbeitung in dieser Inferenzverarbeitung zu implementieren.   Vielen Dank.   Nachtrag (24.06.2017)

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

Lua-Version Deep Learning von Grund auf neu Teil 6 [Inferenzverarbeitung für neuronale Netze]
Lua-Version Deep Learning von Grund auf neu Teil 5.5 [Bereitstellung von pkl-Dateien in Lua Torch]
"Deep Learning from Grund" Memo zum Selbststudium (Teil 12) Deep Learning
[Deep Learning von Grund auf neu] Implementieren Sie die Backpropagation-Verarbeitung in einem neuronalen Netzwerk mithilfe der Fehler-Back-Propagation-Methode
Deep Learning von Grund auf neu
[Deep Learning von Grund auf neu] Informationen zu den Ebenen, die für die Implementierung der Backpropagation-Verarbeitung in einem neuronalen Netzwerk erforderlich sind
Deep Learning von Grund auf 1-3 Kapitel
Python vs Ruby "Deep Learning von Grund auf neu" Kapitel 3 Implementierung eines dreischichtigen neuronalen Netzwerks
[Deep Learning von Grund auf neu] Beschleunigen des neuronalen Netzwerks Ich erklärte die Verarbeitung der Rückausbreitung
[Deep Learning] Führen Sie die neuronale SONY-Netzwerkkonsole über CUI aus
[Deep Learning von Grund auf neu] Anfangswert des Gewichts des neuronalen Netzwerks unter Verwendung der Sigmoid-Funktion
[Deep Learning von Grund auf neu] Anfangsgewicht des neuronalen Netzwerks bei Verwendung der Relu-Funktion
Ich habe versucht, Perceptron Teil 1 [Deep Learning von Grund auf neu] zu implementieren.
Tiefes Lernen von Grund auf neu (Kostenberechnung)
Deep Learning Memo von Grund auf neu gemacht
Kapitel 3 Neuronales Netz Schneiden Sie nur die guten Punkte des Deeplearning aus, die von Grund auf neu erstellt wurden
[Lernnotiz] Deep Learning von Grund auf neu gemacht [Kapitel 7]
Tiefes Lernen von Grund auf neu (Vorwärtsausbreitung)
Tiefes Lernen / Tiefes Lernen von Grund auf 2-Versuchen Sie, GRU zu bewegen
Deep Learning / Deep Learning von Grund auf neu Kapitel 6 Memo
[Lernnotiz] Deep Learning von Grund auf neu gemacht [Kapitel 5]
[Lernnotiz] Deep Learning von Grund auf neu gemacht [Kapitel 6]
"Deep Learning von Grund auf neu" mit Haskell (unvollendet)
Deep Learning / Deep Learning von Grund auf neu Kapitel 7 Memo
[Windows 10] Aufbau einer "Deep Learning from Scratch" -Umgebung
Lernbericht über das Lesen von "Deep Learning von Grund auf neu"
[Deep Learning von Grund auf neu] Über die Optimierung von Hyperparametern
[Lernnotiz] Deep Learning von Grund auf neu gemacht [~ Kapitel 4]
Selbststudien-Memo "Deep Learning from Grund" (unlesbares Glossar)
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 9) MultiLayerNet-Klasse
Deep Learning von Grund auf neu ① Kapitel 6 "Lerntechniken"
GitHub des guten Buches "Deep Learning von Grund auf neu"
Deep Learning von Grund auf neu Kapitel 2 Perceptron (Memo lesen)
[Lernnotiz] Deep Learning von Grund auf ~ Implementierung von Dropout ~
Python vs Ruby "Deep Learning von Grund auf neu" Zusammenfassung
"Deep Learning from Grund" Memo zum Selbststudium (10) MultiLayerNet-Klasse
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 11) CNN
[Python] [Verarbeitung natürlicher Sprache] Ich habe Deep Learning ausprobiert (auf Japanisch von Grund auf neu erstellt)
[Deep Learning von Grund auf neu] Ich habe die Affine-Ebene implementiert
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 19) Datenerweiterung
Anwendung von Deep Learning 2 von Grund auf neu Spam-Filter
Implementieren Sie das neuronale Netzwerk von Grund auf neu
Deep Learning 2 von Grund auf 1.3 Verarbeitung natürlicher Sprache 1.3 Zusammenfassung
Deep Learning aus den mathematischen Grundlagen Teil 2 (während der Teilnahme)
Lernmethode zum Lernen von maschinellem Lernen von Grund auf neu (Version März 2020)
Ich habe versucht, Dropout zu erklären
"Deep Learning from Grund" Memo zum Selbststudium (Teil 8) Ich habe die Grafik in Kapitel 6 mit matplotlib gezeichnet
[Deep Learning von Grund auf neu] Implementierung der Momentum-Methode und der AdaGrad-Methode
[Teil 4] Verwenden Sie Deep Learning, um das Wetter anhand von Wetterbildern vorherzusagen
Ein Amateur stolperte in Deep Learning von Grund auf neu Hinweis: Kapitel 1
[Teil 1] Verwenden Sie Deep Learning, um das Wetter anhand von Wetterbildern vorherzusagen
[Teil 3] Verwenden Sie Deep Learning, um das Wetter anhand von Wetterbildern vorherzusagen
Ein Amateur stolperte über Deep Learning ❷ von Grund auf neu Hinweis: Kapitel 2
Erstellen Sie mit Docker eine Umgebung für "Deep Learning von Grund auf neu"
Ein Amateur stolperte in Deep Learning von Grund auf neu Hinweis: Kapitel 3
Ein Amateur stolperte in Deep Learning von Grund auf neu. Hinweis: Kapitel 7
Ein Amateur stolperte in Deep Learning von Grund auf neu Hinweis: Kapitel 5
Ein Amateur stolperte über Deep Learning ❷ von Grund auf neu Hinweis: Kapitel 1