[PYTHON] Tiefes Lernen! Die Geschichte der Daten selbst, die gelesen werden, wenn sie nach der handschriftlichen Nummernerkennung nicht folgen

Tiefes Lernen! Es ist künstliche Intelligenz! Maschinelles Lernen!

Begeisterung als Ingenieur Ich denke, ich kann etwas Erstaunliches tun! Mit der Unterstützung meines Chefs Durchsuchen Sie tiefe Studienbücher und Qiita-Artikel. Wir stellen vor: TensorFlow und Chainer. Sammeln Sie Tugend mit der Kopie des Tutorials Die für das Spiel verwendete GPU war auch unter Lerngründen voll funktionsfähig ...

Accuracy 99.23%

Diesmal ein Ingenieur, der mit der Implementierung einer Engine zufrieden war, die MNIST und IRIS mit mehr als 99% identifiziert ** Eine Geschichte, um MNIST zu kennen, um aus MNIST herauszukommen **

Bekannt, welche Art von Daten ist "MNIST"?

28 Zeilen und 28 Spalten Bild → Richtig, aber jetzt nicht da. Als Datensatz 70.000 Zeilen und 784 Spalten, 70000 ist die Anzahl der Abtastwerte, 784 ist die Anzahl der Dimensionen, wenn 28 * 28 in einen Vektor umgewandelt wird. Wenn Sie der Meinung sind, dass die Gesamtzahl der Daten, die Sie in einer Zeile analysieren möchten, und alle Daten, die Sie in einer Spalte analysieren möchten, bis zum nächsten Schritt (RNN oder so?) Kein Problem besteht, können SupportVectorMachine und K-means auf dieselbe Weise verwendet werden.

Weitere Beobachtung von MNIST ...

Die handschriftlichen Zahlen scheinen zufällig angeordnet zu sein.

Dies ist auch wichtig, und beim Sammeln von Lehrerdaten in der Praxis ist es einfach, eine große Menge von 1 und eine große Menge von 2 vorzubereiten. Sie müssen es richtig mischen, bevor Sie anfangen zu lernen. Versuchen Sie, nur die Zahlen von 0 bis 8 zu lernen, um festzustellen, ob Sie 9 identifizieren können. Ich bin mir sicher, dass es viele Nullen und Vierer geben wird.

Es gibt nichts als Zahlen.

Was für ein Ideal. Beim Versuch, Daten in der Praxis zu sammeln, ist manchmal "A" oder "-" enthalten, obwohl es sich aufgrund von Problemen um einen numerischen Datensatz handelt. Die Daten, die im Voraus richtig sortiert und gekennzeichnet werden können, sind äußerst wertvoll.

Sie können sie auch durch Cloud-Finanzierung kennzeichnen lassen. Verwenden Sie sie daher nach Bedarf. Die Zeichensammlung mit Captcha war auch eine Zeit lang ein Thema. Luis von Arn "Groß angelegte Zusammenarbeit über das Netz" https://www.youtube.com/watch?v=-Ht4qiDRZE8

Datenmenge von 70000

Rund 200 MB. Wenn Sie es im Speicher eines modernen PCs bereitstellen möchten, ist es genau richtig. Selbst wenn Sie es implementieren, während Sie Qiita in Firefox ansehen und plötzlich ausführen, können Sie das Verhalten mit realistischer Speichernutzung überprüfen. Darüber hinaus kann die Identifizierungsleistung, die mehr als genug ist, um erstaunlich zu sein, selbst mit einem gewöhnlichen dreischichtigen Perzeptron realisiert werden.

Schwarz und Weiß 255 Schichten

Es ist keine große und spärliche Prozession wie der Verarbeitungsbereich für natürliche Sprachen, sie ist nicht unterschiedlich lang und kann nicht wie eine Stimme übersehen werden, und es ist nicht notwendig, mit Farben und drei Farben gut umzugehen. Es ist wunderbar, dass Sie anhand des Putt beurteilen können, auch wenn Sie mehrere Ergebnisse erzielen. Sie können verstehen, welche Funktionen in der mittleren Ebene hervorragend sind.

Welche Art von Daten möchten Sie ausgeben?

Was möchten Sie mit MNIST tun, nachdem Sie MNIST gelobt haben? Denk an. Dieses Mal besteht der Zweck darin, die Form der Ausgabedaten und die Form des Etiketts zu verstehen, das an die Lehrerdaten angehängt ist.

Im MNIST-Beispiel

1,2,3,4,5,6,7,8,9,0

Lösche einen von ihnen. Welche Art von Ausdruck würden Sie gerne sehen? Beispiel 1. Ausgabe in 1 Dimension: 6 => 5,5 oder mehr und 6,4 oder weniger 7 => 6,5 oder mehr und 7,4 oder weniger

Beispiel 2. Ausgabe in 10 Dimensionen: 6 => [0,0,0,0,0,1,0,0,0,0] 7 => [0,0,0,0,0,0,1,0,0,0] 8 => [0,0,0,0,0,0,0,1,0,0] In MNIST, einer Klassifizierung mit mehreren Klassen, gibt es in Beispiel 2 viele geeignete Tutorials. Wenn Sie hier einen Fehler machen, wählen Sie möglicherweise die falsche Fehlerfunktion aus. Es gibt eine Fehlerfunktion, die gute Arbeit leistet. Wenn dies jedoch nicht häufig vorkommt, müssen Sie möglicherweise die Bezeichnung der Lehrerdaten ändern ... Wenn Sie die Ausgabe dieses Bereichs nicht klarstellen, können Sie mit einer Klassifizierung und Regression in zwei Klassen usw. verwechselt werden.

Immerhin, was Sie beim Umgang mit Daten interessiert

Bei Anwendung auf MNIST

Stellen Sie sicher, dass Sie sich wirklich interessieren.

WhatMnist.py


import pandas as pd
import numpy as np
# Chainer
import chainer
import chainer.functions as F
import chainer.links as L
from chainer import optimizers
from chainer import serializers, Variable
#Visualisierung(Jupyter Annahme)
%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib.cm as cm

Für PKL

WhatMnist.py


# http://deeplearning.net/data/mnist/mnist.pkl.gz
#Mit Tapple(train, valid, test)
# train -> (data, label)
# valid -> (data, label)Es ist zu nett und sogar die Validierungsdaten werden getrennt
# test -> (data, label)
#Lesen Sie Daten mit Pandas
mnist = pd.read_pickle('mnist.pkl')

http://deeplearning.net/tutorial/gettingstarted.html Klicken Sie hier für den Datensatz.

Für CSV

WhatMnist.py


if(0):
    # Pandas +Für csv
    mnist = pd.read_csv('mnist.csv') 
    # Numpy +Für csv
    mnist = np.loadtxt('mnist.csv')
    #Trennung von Beschriftungsspalten(Angenommen, die erste Zeile ist das Etikett)
    mnist_data, mnist_label = np.split(mnist, [1], axis=1)
    #Aufteilung zwischen Studien- und Testlinien
    x_train,x_test = np.split(mnist_data, [50000])
    y_train,y_test = np.split(mnist_label, [50000])

Überprüfen Sie das Datenformat

WhatMnist.py


print('##Dimension und Menge')
print("train.data:{0}, train.label:{1}".format(mnist[0][0].shape, mnist[0][1].shape))
print("valid.data:{0}, valid.label:{1}".format(mnist[1][0].shape, mnist[1][1].shape))
print("test.data:{0}, test.label:{1}".format(mnist[2][0].shape, mnist[2][1].shape))

print('##Wertebereich und Einheit')
print("train.data.max:{0}, train.data.min:{1}".format(np.max(mnist[0][0]), np.min(mnist[0][0])))
print("train.label.max:{0}, train.label.min:{1}".format(np.max(mnist[0][1]), np.min(mnist[0][1])))

print('##Anordnung und Ausgabemethode')
print("head -n 30 label: {0}".format(mnist[0][1][:30]))

print('##Eingabe Methode(Sofort lesen und np.Ich stecke im Array fest)')
fig = plt.figure()
ax1 = fig.add_subplot(2,1,1)
ax2 = fig.add_subplot(2,1,2)
print('##Bestätigungsmethode')
print('Ich habe versucht, einen geeigneten als Vertreter anzuzeigen.')
ax1.imshow(mnist[0][0][40].reshape((28,28)), cmap = cm.Greys_r)

print('##Art und Natur')
print('Hier habe ich versucht, die Häufigkeit jeder Klasse mit einem Histogramm zu visualisieren.')
ax2.hist(mnist[0][1], bins=range(11), alpha=0.9, color='b', normed=True)

Dimension und Menge

train.data:(50000, 784), train.label:(50000,) valid.data:(10000, 784), valid.label:(10000,) test.data:(10000, 784), test.label:(10000,)

Wertebereich und Einheiten

train.data.max:0.99609375, train.data.min:0.0 train.label.max:9, train.label.min:0

Sortier- und Ausgabemethode

head -n 30 label: [5 0 4 1 9 2 1 3 1 4 3 5 3 6 1 7 2 8 6 9 4 0 9 1 1 2 4 3 2 7]

Eingabemethode (sofort lesen und in np.array eintauchen)

So überprüfen Sie

Ich habe versucht, einen geeigneten als Vertreter anzuzeigen.

Typ und Art

Hier habe ich versucht, die Häufigkeit jeder Klasse mit einem Histogramm zu visualisieren. (array([ 0.09864, 0.11356, 0.09936, 0.10202, 0.09718, 0.09012, 0.09902, 0.1035 , 0.09684, 0.09976]), array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), mnisthist.png

Geben Sie ihm einen Namen, der für die Zukunft leicht zu nennen ist

In Chainer werden Daten als float32, int32 behandelt und als Array (auf der CPU) behandelt.

WhatMnist.py


x_train = np.array(mnist[0][0], dtype=np.float32)
y_train = np.array(mnist[0][1], dtype=np.int32)
x_test = np.array(mnist[2][0], dtype=np.float32)
y_test = np.array(mnist[2][1], dtype=np.int32)
print('x_train:' + str(x_train.shape))
print('y_train:' + str(y_train.shape))
print('x_test:' + str(x_test.shape))
print('y_test:' + str(y_test.shape))

x_train:(50000, 784) y_train:(50000,) x_test:(10000, 784) y_test:(10000,)

Der Rest ist ein bekanntes Tutorial

WhatMnist.py


#Prädiktorklasse
class MLP(chainer.Chain):
    def __init__(self):
        super(MLP, self).__init__(
            l1=L.Linear(784, 100),
            l2=L.Linear(100, 100),
            l3=L.Linear(100, 10),
        )
    
    def __call__(self, x):
        h1 = F.relu(self.l1(x))
        h2 = F.relu(self.l2(h1))
        y = self.l3(h2)
        return y
    
#Verlust und Genauigkeit berechnen
class Classifier(chainer.Chain):
    def __init__(self, predictor):
        super(Classifier, self).__init__(predictor=predictor)
        
    def __call__(self, x, t):
        y = self.predictor(x)
        self.loss = F.softmax_cross_entropy(y, t)
        self.accuracy = F.accuracy(y, t)
        return self.loss

model = Classifier(MLP())
optimizer = optimizers.SGD()
optimizer.setup(model)

batchsize = 100
datasize = 50000
for epoch in range(20):
    print('epoch %d' % epoch)
    indexes = np.random.permutation(datasize)
    for i in range(0, datasize, batchsize):
        x = Variable(x_train[indexes[i : i + batchsize]])
        t = Variable(y_train[indexes[i : i + batchsize]])
        optimizer.update(model, x, t)

Verwenden Sie Lernergebnisse

(Ich persönlich halte dieses Gerät für wichtig.)

WhatMnist.py


n = 10
x = Variable(x_test[n:n+1])
v = model.predictor(x)
plt.imshow(x_test[n:n+1].reshape((28,28)), cmap = cm.Greys_r)
print(np.argmax(v.data))

0 show.png

abschließend

Vor langer Zeit, als die Welle des tiefen Lernens kam. Wenn ich als Doktorand von kleinen Fischen im Detail maschinelles Lernen machte, konzentrierte ich mich eher auf Algorithmen und Codierung und verlor oft die Natur der Daten selbst aus den Augen. Mit zunehmender Menge wird es notwendig, Dinge zu beobachten, die schwer zu beobachten sind, und das Verständnis der Eigenschaften wirkt sich stark auf die Leistung aus. ** Wenn Sie sich verlaufen, sehen Sie sich die Daten an. ** ** **

** Nun, jenseits des Tutorials **

Recommended Posts

Tiefes Lernen! Die Geschichte der Daten selbst, die gelesen werden, wenn sie nach der handschriftlichen Nummernerkennung nicht folgen
Es scheint, dass die Version von Pyflakes nicht die neueste ist, wenn flake8 installiert ist
Eine Geschichte, die blau wird, wenn die von Pillow gelesenen Daten konvertiert werden, damit sie von OpenCV verarbeitet werden können
Beim Inkrementieren des Werts eines Schlüssels, der nicht vorhanden ist
[Verifikation] Nur weil es tiefes Lernen gibt, bedeutet dies nicht, dass die Wiederherstellungsrate bei Pferderennen leicht 100% überschreiten kann.
Die Geschichte der Release-Arbeit der Anwendung, die Google nicht erzählt
Beurteilung, ob es sich um mein Kind handelt oder nicht, nach dem Bild des Shiba-Hundes durch tiefes Lernen (2) Datenerhöhung, Transferlernen, Feinabstimmung
Die Geschichte des tiefen Lernens mit TPU
Es wird gesagt, dass libmysqlclient.so.18 nicht existiert
Es ist eine Huckepack-Geschichte über den Dienst, der "Nyan" zurückgibt, wenn Sie Ping drücken
[Python Data Frame] Wenn der Wert leer ist, füllen Sie ihn mit dem Wert einer anderen Spalte.
Zählen Sie die Anzahl der Parameter im Deep-Learning-Modell
Nach dem Bild des Shiba-Hundes zu urteilen, indem man tief lernt, ob es mein Kind ist (1)
Über die Angelegenheit, dass Nosetests nicht bestanden werden, wenn __init__.py im Projektverzeichnis erstellt wird
Die Geschichte, dass pyenv den Python-Ausführungsbefehl PATH nicht bestanden hat
Verändert TensorFlow das Bild des tiefen Lernens? Was ich dachte, nachdem ich ein wenig berührt hatte
Grep, damit grep zum Zeitpunkt von grep nicht angezeigt wird
Eine Geschichte, die bestätigte, ob die Zahl der Coronas bei jungen Menschen wirklich schnell zunimmt
Warum ist die Gleitkommazahl von 0,1 größer als 0,1, aber wenn sie zehnmal addiert wird, ist sie kleiner als 1,0 [Teil 1]
Warum ist die Gleitkommazahl von 0,1 größer als 0,1, aber wenn sie zehnmal addiert wird, ist sie kleiner als 1,0 [Teil 2]