[Deep Learning] 2-4 Neuronales Netzwerk – Erkennung handschriftlicher Zahlen

Bei der Klassifizierung handgeschriebener digitaler Bilder kann davon ausgegangen werden, dass das Lernen abgeschlossen ist, und wir verwenden die gelernten Parameter, um die „Begründungsverarbeitung“ des neuronalen Netzwerks zu realisieren. Dieser Vorgang wird auch als Vorwärtsdurchlauf des neuronalen Netzwerks bezeichnet .

Ebenso wie die Schritte zur Lösung von Problemen des maschinellen Lernens (unterteilt in zwei Lern- und Argumentationsphasen)
müssen bei der Verwendung neuronaler Netze zur Lösung von Problemen zunächst Trainingsdaten (Lerndaten) zum Erlernen von Gewichtsparametern und zur Klassifizierung von Parametern verwendet werden Eingabedaten .

MNIST-Datensatz
MNIST ist einer der bekanntesten Datensätze im maschinellen Lernen. Er wird bei verschiedenen Gelegenheiten verwendet, von einfachen Experimenten bis hin zu veröffentlichten Forschungsarbeiten. Beim Lesen von Artikeln über Bilderkennung oder maschinelles Lernen wird der MNIST-Datensatz häufig als verwendet Experiment. Daten werden angezeigt.
Der MINIST-Datensatz besteht aus digitalen Bildern von 0 bis 9. Die Methode zur Verwendung des MNIST-Datensatzes besteht darin, zuerst das Trainingsbild zum Lernen zu verwenden und dann das gelernte Modell zu verwenden, um zu messen, inwieweit das Testbild korrekt sein kann klassifiziert .

Die Bilddaten von MNIST sind ein Graustufenbild (1 Kanal) mit 28 Pixel x 28 Pixel, und der Wert jedes Pixels liegt zwischen 0 und 255. Alle Bilddaten sind entsprechend mit „7“, „2“, „1“ usw. gekennzeichnet.

Hier können Sie über das Python-Skript mnist.py vom Herunterladen des MNIST-Datensatzes bis zur Konvertierung dieser Daten in NumPy-Arrays usw. mithilfe der Funktion „load_mnist()“ in mnistpy die MNIST-Daten einfach wie folgt einlesen.

Beachten Sie, dass mnist.py hier nicht universell ist und nur in Lernprojekten zum Lernen und Verstehen verwendet werden kann (Einzelheiten finden Sie im Online-Wissen, auf das hier nicht näher eingegangen wird).

Python verfügt über die Funktion „pickle“ , mit der Objekte im laufenden Programm als Dateien gespeichert werden können. Wenn Sie die gespeicherte Pickle-Datei hinzufügen, können Sie die Objekte im laufenden Programm sofort wiederherstellen. Mit der Pickle-Funktion kann die Aufbereitung von MINIST-Daten effizient abgeschlossen werden.pickle.load(f)

Beispiel für die Erkennung handschriftlicher Ziffern

# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定
import numpy as np
from dataset.mnist import load_mnist

(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)

# 输出各个数据的形状
print(x_train.shape)   # (60000784)
print(t_train.shape)  # (60000,)
print(x test.shape)   #(10000784)
print(t_test.shape)   # (10000,)


Im obigen Code ist der Anführer die Funktion „load_mnist“ in dataset/mnist.py. Die Load-Mnist-Funktion gibt die gelesenen MNIST-Daten in der Form (Trainingsbild, Trainingslabel), (Testbild, Testlabel) “ zurück.
Denken Sie dann load_mnist(normalize=True,flatten=True,one_hot_label=False)so : Stellen Sie 3 Parameter ein.
normalisieren legt fest, ob das Eingabebild auf einen Wert von 0,0 bis 1,0 normalisiert werden soll .
Flatten legt fest, ob das Eingabebild erweitert werden soll ( in ein eindimensionales Array ). Wenn es auf „True“ gesetzt ist, wird das Eingabebild als eindimensionales Array mit 784 Elementen gespeichert.
one_hot_label legt fest, ob das Label als One-Hot-Darstellung gespeichert werden soll. One-Hot bedeutet, dass nur die richtige Lösungsbezeichnung 1 ist und der Rest alle 0-Arrays sind, genau wie [0,0,1,0,0,0,0,0,0,0]. Wenn one_hot_label True ist, wird die Beschriftung als One-Hot-Darstellung gespeichert.

Das MINIST-Bild wird später angezeigt und die Daten werden ebenfalls bestätigt. Bilder werden mit dem PIL-Modul (Python Image Library) erstellt. Nach Ausführung des folgenden Codes wird das erste Trainingsbild angezeigt

# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定
import numpy as np
from dataset.mnist import load_mnist
from PIL import Image


def img_show(img):
    pil_img = Image.fromarray(np.uint8(img))
    pil_img.show()

(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)

img = x_train[0]
label = t_train[0]
print(label)  # 5

print(img.shape)  # (784,)
img = img.reshape(28, 28)  # 把图像的形状变为原来的尺寸
print(img.shape)  # (28, 28)

img_show(img)

Es ist zu beachten, dass bei flatten=True das Bild des Lesers in Form eines spaltenförmigen (eindimensionalen) NumPy-Arrays gespeichert wird. Daher muss das Bild bei der Anzeige in seine ursprüngliche Form von 28 x 28 Pixel geändert werden. Die gewünschte Form kann über den Parameter der reshape ()-Methode angegeben werden. . Darüber hinaus müssen die als NumPy-Array gespeicherten Bilddaten in ein Datenobjekt für PIL konvertiert werden, und dieser Konvertierungsprozess Image.fromarray()ist abgeschlossen.

Inferenzverarbeitung neuronaler Netzwerke
Implementieren Sie die Inferenzverarbeitung neuronaler Netzwerke für den MNIST-Datensatz.

Die Eingabeschicht des neuronalen Netzwerks besteht aus 784 Neuronen und die Ausgabeschicht aus 10 Neuronen.
Die Zahl 784 in der Eingabeebene ergibt sich aus der Bildgröße 28x28=784, und
die Zahl 10 in der Ausgabeebene ergibt sich aus 10 Kategorien (Zahlen 0 bis 9, insgesamt 10 Kategorien).
Außerdem hat dieses neuronale Netzwerk zwei verborgene Schichten , die erste verborgene Schicht hat 50 Neuronen und die zweite verborgene Schicht hat 100 Neuronen .

Definieren Sie zunächst die drei Funktionen get_data() , init_network() und Predict()

def get data():
	(x_train,t_train),(x_test,t_test) = load_mnist(normalize=True,flatten=True,one_hot_label=False)
	return x_test, t_test

def init_network():
	with open("sample_weight.pkl",'rb') as f:
		network = pickle.load(f)
	return netwrok

def predict(network, x):
	W1,W2,w3 = network['W1'], network['W2'], network['w3']
	bl,b2, b3 = network['b1'],network['b2'], network['b3']
	a1 = np.dot(x,W1)+b1
	z1 = sigmoid(a1)
	a2 = np.dot(a1,W2) +b2
	z2 = sigmoid(a2)
	a3=np.dot(a2,W3)+b3
	y = sigmoid(a3)

	reutrn y

init_network() liest die gelernten Gewichtsparameter ein, die in der Pickle-Datei „sample_weight.pkl“ gespeichert sind
. Verwenden Sie nun diese drei Funktionen, um die Inferenzverarbeitung des neuronalen Netzwerks zu implementieren. Bewerten Sie dann die Erkennungsgenauigkeit , das heißt, inwieweit es korrekt klassifiziert werden kann.

# 获取数据
x, t = get_data()
# 初始化network
network =init_network()

accuracy_cnt =0
for i in range(len(x)):
	y = predict(network,x[i]) # predict()函数以NumPy数组的形式输出各个标签对应的概率
	p=np.argmax(y)  # 获取概率最高的元素的索引
	if p == t[i]:
		accuracy_cnt += 1
print("Accuracy:" + str(float(accuracy_cnt) / len(x)))  # 比较神经网络所测的答案和正确解标签,将回答正确的概率作为识别精度。

Derzeit ist die Genauigkeit dieses Codes nicht sehr hoch, und die Struktur und Lernmethode des neuronalen Netzwerks wird in Zukunft optimiert, um diese Genauigkeit zu verbessern.

Setzen Sie den Parameter normalize der Funktion „load_mnist“ auf „True“. Nachdem „normalize“ auf „True“ gesetzt wurde, führt die Funktion eine interne Konvertierung durch und dividiert jeden Pixelwert des Bildes durch 255, sodass der Datenwert im Bereich von 0,0 bis 1,0 liegt. Der Vorgang, Daten auf einen bestimmten Bereich zu beschränken, wird als Normalisierung bezeichnet . Diese Art der vorgegebenen Transformation der Eingangsdaten des neuronalen Netzwerks wird als Vorverarbeitung bezeichnet .

Die Vorverarbeitung ist in neuronalen Netzen (Deep Learning) sehr praktisch. Tatsächlich wird bei vielen Vorverarbeitungen die Gesamtverteilung der Daten berücksichtigt, z Die Daten sind um 0 verteilt.

おすすめ

転載: blog.csdn.net/loyd3/article/details/130595135