[PYTHON] Ich habe keine GPU, aber ich werde Deep Learning ausprobieren

Vorwort

Mit dem Konzept "Sie können Deep-Learning-Tutorials durchführen, ohne eine komplizierte Umgebung zu erstellen" können Sie es versuchen, indem Sie einfach den Code in diesem Artikel kopieren und einfügen. (Ich meine, klone es einfach von GitHub und starte es)

Umgebung macOS Mojave version 10.14.6 python3.6.5

Einfach ausgedrückt ist der R ^ 2-Score eine Bewertungsfunktion, die ausdrückt, wie nahe die Regressionskurve (vorhergesagt) an der korrekten Kurve um 0 zu 1 liegt. MSE wird als durchschnittliche Summe der Fehlerquadrate bezeichnet. Dies ist der Durchschnittswert der Summe der Fehlerquadrate des korrekten Antwortwerts und des vorhergesagten Werts.

Problemstellung

Vorhersage der SinCos-Kurve aus zwei Eingabewerten (x1, x2)

Das Bild sieht so aus. Wir werden überprüfen, wie sich die Genauigkeit in Abhängigkeit von der Anzahl der ausgeblendeten Ebenen und der Anzahl der Einheiten in jeder Ebene ändert.

Screen Shot 2019-12-10 at 11.31.12.png

Umgebung

#Führen Sie zur Vereinfachung die folgenden Schritte aus, um das Repository zu klonen, an dem ich gearbeitet habe.

$ git clone https://github.com/keroido/DNN-learning-Sin-Cos-wave.git
$ cd DNN-learning-Sin-Cos-wave

#Erstellen Sie eine virtuelle Umgebung und betreten Sie die virtuelle Umgebung. (Irgendein)
$ pip install virtualenv
$ virtualenv venv
$ . venv/bin/activate

#Installieren Sie alle für die virtuelle Umgebung erforderlichen Bibliotheken.
(venv)$ pip install -r requirements.txt

#Beim Verlassen der virtuellen Umgebung venv$ deactivate

Trainingsdaten erstellen

Führen Sie die folgenden Schritte aus, um ein Dataset zu erstellen. Erzeugt Daten von 4 Spalten mit Sin- und Cos x 1000-Zeilen, wenn die Eingabewerte x0, x1 und die beiden hinzugefügt werden.
Sagen Sie Sin und Cos aus diesen x0 und x1 voraus.

Bild

index x0 x1 Sin Cos
0 50.199163279521 17.5983756102216 0.925854354002364 0.377880556756848
1 127.726947420807 116.093208916234 -0.897413633456196 -0.441190174966475
2 54.2208002632216 116.589734921833 0.159699676625697 -0.987165646325705
3 156.256738791155 8.64049515860479 0.260551118156132 -0.965460053460312
: ... ... ... ...
: ... ... ... ...
999 23.2978504439148 109.826906405408 0.72986697370653 -0.683589204634239

(0 <= x1, x2 <= 180)


Führen Sie das Programm, das das Dataset generiert, im folgenden Verzeichnis aus. Erstellen Sie hier auch eine Speichereingabe für den Trainingsdatensatz und eine Ausgabe für das Ausgabeergebnis.

#Überprüfen Sie das aktuelle Verzeichnis.
$ pwd
 [out]: .../DNN-learning-Sin-Cos-wave/code

#Erstellen Sie einen Ort für Eingabedaten und einen Ort für Ausgabedaten.
$ mkdir ../input ../output

#Führen Sie das Programm aus, das das Dataset generiert
$ python make_dataset.py
# make_dataset.py

import numpy as np
import pandas as pd
import math

x0 = np.random.rand(1000) * 180
x1 = np.random.rand(1000) * 180
s = [math.sin(math.radians(i+s)) for i, s in zip(x0, x1)]
c = [math.cos(math.radians(i+s)) for i, s in zip(x0, x1)]

df = pd.DataFrame({'x0':x0, 'x1':x1, 'sin':s, 'cos':c})
df.to_csv('../input/data.csv')

Dann wird data.csv im Eingabeverzeichnis generiert.

Versuchen Sie es mit tiefem Lernen

Lassen Sie uns endlich tiefes Lernen machen. Das Thema dieses Artikels ist Deep Learning ohne Verwendung einer GPU, daher werden wir es mit Scicit-Learn implementieren.
Obwohl train.py steht, bewerten wir jedes Modell gleichzeitig.

$ pwd
 [out]: .../DNN-learning-Sin-Cos-wave/code

$ python train.py
# train.py
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split #Teilen Sie die Daten in Trainingssätze und Testsätze ein.
from sklearn.neural_network import MLPRegressor #Es ist eine Funktion eines neuronalen Netzwerks, das auf sklearn ausgeführt wird.
from sklearn.metrics import mean_squared_error # MSE(Durchschnittliche Summe der Fehlerquadrate)

#Liest die Daten im Eingabeverzeichnis.
df = pd.read_csv('../input/data.csv')
df = df.drop('Unnamed: 0', axis=1)

#X für x0 und x1, y für SinCos
X = df.iloc[:, :2]
y = df.iloc[:, 2:]

#Teilen Sie in ein Trainingsset und ein Testset.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

#2 versteckte Schichten,3,4 Die Anzahl der Einheiten beträgt 10,50,100,150,200 Probieren Sie alle Kombinationen aus.
hidden_layer_sizes = [(10, 10,), (50, 50,), (100, 100,), (150, 150,), (200, 200,),
                      (10, 10, 10,), (50, 50, 50,), (100, 100, 100,), (150, 150, 150,), (200, 200, 200,),
                      (10, 10, 10, 10,), (50, 50, 50, 50,), (100, 100, 100, 100,), (150, 150, 150, 150,), (200, 200, 200, 200,)]
ln = list(range(len(hidden_layer_sizes))) 

# Sin,Cos MSE bzw. R.^2 Erstellen Sie einen Datenrahmen, um die Partitur zu schreiben
score_df = pd.DataFrame(columns={'sin_mse', 'cos_mse', 'r^2_score'})

for i, hidden_layer_size in zip(ln, hidden_layer_sizes):
    #Modelldetails(https://scikit-learn.org/stable/modules/generated/sklearn.neural_network.MLPRegressor.html)
    #Wenn Sie ausführlich in True ändern und es ausführen, können Sie den Lernfortschritt sehen.
    model = MLPRegressor(activation='relu', alpha=0, batch_size=100,
                         hidden_layer_sizes=hidden_layer_size, learning_rate_init=0.03,
                         random_state=0, verbose=False, solver='adam')
    #Füttere das Modell mit einem Trainingsdatensatz.
    model.fit(X_train, y_train)
    #Testsatz x0,x1 zu Sin,Cos vorhersagen.
    pred = model.predict(X_test)
    #Ab hier ist die Formatierung des Datenrahmens, der das vorhergesagte Ergebnis in das Ausgabeverzeichnis usw. ausgibt, abwärts.
    pred = pd.DataFrame(pred)
    x = pd.DataFrame({'x':(X_test['x0'] + X_test['x1']).tolist()})
    tes = y_test.rename(columns={'sin': 'sin(label)', 'cos': 'cos(label)'}).reset_index(drop=True)
    pre = pred.rename(columns={0: 'sin(prediction)', 1: 'cos(prediction)'}).reset_index(drop=True)
    ans_df = pd.concat([x, tes, pre], axis=1)
    ans_df = ans_df[['x', 'sin(label)', 'sin(prediction)', 'cos(label)', 'cos(prediction)']]
    ans_df.to_csv('../output/result_{}_{}_{}.csv'.format(str(i).zfill(2), len(hidden_layer_size), hidden_layer_size[0]))
    sin_mse = mean_squared_error(tes['sin(label)'].tolist(), pre['sin(prediction)'].tolist())
    cos_mse = mean_squared_error(tes['cos(label)'].tolist(), pre['cos(prediction)'].tolist())
    r2 = model.score(X_test, y_test)
    score_df.loc['{}'.format(i), 'sin_mse'] = sin_mse
    score_df.loc['{}'.format(i), 'cos_mse'] = cos_mse
    score_df.loc['{}'.format(i), 'r^2_score'] = r2

col = ['sin_mse', 'cos_mse', 'r^2_score']
score_df = score_df[col]
#Ausgabe in das Ausgabeverzeichnis
score_df.to_csv('../output/score.csv')

Kommentar

(Entschuldigung für den schmutzigen Code ...) Schauen Sie sich hidden_layer_sizes an. Hier werden die Anzahl der Schichten (Anzahl der verborgenen Schichten) und die Anzahl der Einheiten des neuronalen Netzwerks auf verschiedene Arten geändert, wie unten gezeigt, damit Sie versuchen können, Fehler zu machen, welche Kombination eine gute Genauigkeit erzeugen kann.

Anzahl der Schichten\Anzahl der Einheiten 10 50 100 150 200
2 Geist Jedes Mal Aber Gut Ku
3 Nana Ru einstellen Nur Gehen
4 Beeindruckend einstellen Ist Was

Bewerten und visualisieren

Das Jupyter-Notebook eignet sich zur Visualisierung. Verwenden wir es also.

$ pip install jupyter

$ pwd
 [out]: .../DNN-learning-Sin-Cos-wave/code

$ ls
 [out]: make_dataset.py train.py viewer.ipynb

$ jupyter notebook

Öffnen Sie viewer.ipynb, wenn das Jupiter-Notizbuch in Ihrem Browser gestartet wird. Mit diesem Notizbuch können Sie die Daten auswerten und visualisieren, indem Sie sie einfach von oben ausführen. https://github.com/keroido/DNN-learning-Sin-Cos-wave/blob/master/code/viewer.ipynb Das Folgende ist die Ausführung auf Jupiter. (Code, der keiner Erklärung bedarf, wird weggelassen)

Im Ausgabeverzeichnis gibt es 15 CSV-Dateien mit Namen wie "Ergebnis_00_2_10.csv". Am Beispiel von 'result_00_2_10.csv' lautet der Name dieser Datei 00, wobei 2 die Anzahl der Ebenen und 10 die Anzahl der Einheiten ist. Daher wird diese CSV-Datei als "Ergebnis des Lernens mit dem neuronalen Netzwerk der 0. 2-Schicht-10-Einheit" bezeichnet.

!ls ../output

[out]:
result_00_2_10.csv  result_04_2_200.csv result_08_3_150.csv result_12_4_100.csv
result_01_2_50.csv  result_05_3_10.csv  result_09_3_200.csv result_13_4_150.csv
result_02_2_100.csv result_06_3_50.csv  result_10_4_10.csv  result_14_4_200.csv
result_03_2_150.csv result_07_3_100.csv result_11_4_50.csv  score.csv

1, Überprüfen Sie die Punktzahl jedes neuronalen Netzwerks

score_df = pd.read_csv('../output/score.csv')
score_df = score_df.drop('Unnamed: 0', axis=1)
score_df

Lassen Sie uns überprüfen, unter welchen Bedingungen der R ^ 2-Score-Wert gut ist. Wenn man sich die Ergebnisse ansieht, liefert das 9. neuronale Netzwerk mit 3 Schichten und 200 Einheiten von result_09_3_200.csv das beste Ergebnis. (Kann sich je nach Einstellung ändern) Sie können sehen, dass es nicht nur darum geht, eine tiefe Schicht zu haben.

index sin_mse cos_mse r^2_score
0 0.118307 0.272191 0.551913
1 0.071344 0.174416 0.717997
2 0.101467 0.269444 0.574389
3 0.053282 0.022353 0.913211
4 0.374317 0.242327 0.292416
5 0.127534 0.274327 0.538875
6 0.061558 0.163282 0.742001
7 0.195692 0.262261 0.474512
8 0.034099 0.010542 0.948776
9 0.006197 0.004922 0.987241
10 0.512035 0.361053 -0.001846
11 0.116843 0.099484 0.751770
12 0.013951 0.029560 0.950072
13 0.009213 0.009595 0.978419
14 0.005862 0.006255 0.986096

2, Überprüfen Sie die CSV-Datei, die die beste Punktzahl ergab

tmp = pd.read_csv('../output/result_09_3_200.csv')
tmp = tmp.drop('Unnamed: 0', axis=1)
tmp

(Label) ist das richtige Label und (Vorhersage) ist der vorhergesagte Wert des neuronalen Netzwerks. Sie können sehen, dass Sie einen Wert vorhersagen können, der relativ nahe ist.

x sin(label) sin(prediction) cos(label) cos(prediction)
0 271.800382 -0.999506 -0.912688 0.031417
1 133.334658 0.727358 0.722477 -0.686258
2 136.451163 0.688973 0.656727 -0.724787
3 187.429195 -0.129301 -0.182335 -0.991605
4 229.748855 -0.763220 -0.801409 -0.646139
... ... ... ... ...

3, tatsächlich visualisieren

files = glob.glob('../output/result*.csv')
files.sort()
csvs = []
t = []
for i in range(1, 16):
    t.append(files[i-1])
    if i%5 == 0:
        csvs.append(t)
        t = []

Sin

fig, axes = plt.subplots(3, 5, figsize=(15, 10))
fig.subplots_adjust(hspace=0.3, wspace=0.3)
for i in range(3):
    for j in range(5):
        tmp = pd.read_csv(csvs[i][j])
        axes[i, j].scatter(tmp.loc[:, 'x'], tmp.loc[:, 'sin(label)'], c='b')
        axes[i, j].scatter(tmp.loc[:, 'x'], tmp.loc[:, 'sin(prediction)'], c='r', alpha=0.5)
        axes[i, j].set_title('layer:{}, unit:{}'.format(csvs[i][j][20], csvs[i][j][22:-4]))
        plt.xlim(-5, 365)
Screen Shot 2019-12-10 at 10.49.03.png

cos

fig, axes = plt.subplots(3, 5, figsize=(15, 10))
fig.subplots_adjust(hspace=0.3, wspace=0.3)
for i in range(3):
    for j in range(5):
        tmp = pd.read_csv(csvs[i][j])
        axes[i, j].scatter(tmp.loc[:, 'x'], tmp.loc[:, 'cos(label)'], c='b')
        axes[i, j].scatter(tmp.loc[:, 'x'], tmp.loc[:, 'cos(prediction)'], c='r', alpha=0.5)
        axes[i, j].set_title('layer:{}, unit:{}'.format(csvs[i][j][20], csvs[i][j][22:-4]))
        plt.xlim(-5, 365)
Screen Shot 2019-12-10 at 10.49.20.png

Es macht Spaß, auf einen Blick zu sehen, wie das neuronale Netzwerk vorausgesagt hat, wenn Sie es visualisieren. Dies ist das Ende von "Ich habe keine GPU, aber ich werde Deep Learning ausprobieren". Danke für deine harte Arbeit.

Recommended Posts

Ich habe keine GPU, aber ich werde Deep Learning ausprobieren
Ich habe den Deep Learning Framework Chainer installiert
Ich habe versucht, tief zu lernen
Eine Szene, in der GPU für tiefes Lernen nützlich ist?
Versuchen Sie es mit TensorFlow
Versuchen Sie, ein Deep Learning / Neuronales Netzwerk mit Scratch aufzubauen
Deep Learning Gaiden ~ GPU-Programmierung ~
(Jetzt) Erstellen Sie eine GPU Deep Learning-Umgebung mit GeForce GTX 960
Versuchen Sie Deep Learning mit FPGA
Ich habe versucht, ein Deep-Learning-Modell von TensorFlow mit TensorFlow Serving zu hosten
Ich habe versucht, in einem tief erlernten Sprachmodell zu schreiben
Ich suchte mit Deep Learning nach einer ähnlichen Karte von Hearthstone
Ich habe eine C ++ - Lernseite erstellt
Probieren Sie Deep Learning mit FPGA-Select-Gurken aus
Versuchen Sie es mit TensorFlow Part 2
Ich habe eine Frage zu Leerzeichen
Tiefes Lernen, um ohne GPU zu beginnen
Ich habe versucht, mit Theano tief zu lernen
Ich habe weder die Fähigkeiten noch die Stärke, aber ich habe meinen eigenen Compiler erstellt
[Windows Edition] Keras-Kurs, eine Bibliothek, in der Sie Deep Learning sofort ausprobieren können - Teil 2
Probieren Sie die Bitcoin-Preisprognose mit Deep Learning aus
Versuchen Sie es mit Chainer Deep Q Learning - Launch
Ich habe eine Frage! (Python, Django) Einfach
Versuchen Sie mit Kipoi tiefes Erlernen der Genomik
[Python] Deep Learning: Ich habe versucht, Deep Learning (DBN, SDA) ohne Verwendung einer Bibliothek zu implementieren.
Ich habe keine Zeit, kann ich also einfach eine Frage stellen? feat. COTOHA API
Ich habe versucht, die Strichzeichnung mit Deep Learning aus dem Bild zu extrahieren