[PYTHON] [Rabbit Challenge (E-Qualifikation)] Deep Learning (Tag 4)

Einführung

Dies ist ein Lernrekord, als ich die Rabbit Challenge mit dem Ziel absolvierte, die Qualifikation der Japan Deep Learning Association (JDLA) E zu bestehen, die am 19. und 20. Januar 2021 stattfinden wird.

Rabbit Challenge ist ein Kurs, der die Unterrichtsmaterialien verwendet, die aus dem aufgezeichneten Video des Schulbesuchskurses "Deep Learning-Kurs, der vor Ort vernichtet werden kann" bearbeitet wurden. Es gibt keine Unterstützung für Fragen, aber es ist ein billiger Kurs (der niedrigste Preis ab Juni 2020) für die E-Qualifikationsprüfung.

Bitte überprüfen Sie die Details über den unten stehenden Link.

Liste der Themen

Angewandte Mathematik Maschinelles Lernen Deep Learning (Tag 1) Deep Learning (Tag 2) Deep Learning (Tag 3) Deep Learning (Tag 4)

Abschnitt 1: Umsetzungsübung

Tensorflow

Lineare Regression

--Ändern Sie die Funktion $ d $ in $ d = -6x + 3 $ und ändern Sie den Rauschwert image.png

→ Es wurde bestätigt, dass der Fehler umso größer und die Vorhersagegenauigkeit umso geringer ist, je größer der Rauschwert ist.

Nichtlineare Regression

--Ändern Sie die Funktion $ d $ in $ d = 2.1x ^ 3-1.2x ^ 2-4.8x + 2 $ und ändern Sie den Rauschwert image.png

→ Es wurde bestätigt, dass der Fehler umso größer und die Vorhersagegenauigkeit umso geringer ist, je größer der Rauschwert ist.

Klassifizierung 1 Schicht (mnist)

image.png

Klassifizierung 3 Schichten (Mnist)

Klassifikation CNN (mnist)

image.png

keras

Lineare Regression

image.png

Einfaches Perceptron

Simple_perceptron


#Modul laden
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import SGD
 
#Initialisieren Sie eine Zufallszahl mit einem festen Wert
np.random.seed(0)

#Erstellen eines einfachen Perzeptrons für Sigmoid
model = Sequential()
model.add(Dense(input_dim=2, units=1))
model.add(Activation('sigmoid'))
model.summary()

model.compile(loss='binary_crossentropy', optimizer=SGD(lr=0.1))
 
#Trainingseingabe X und korrekte Antwortdaten T.
X = np.array( [[0,0], [0,1], [1,0], [1,1]] )
T = np.array( [[0], [1], [1], [1]] )
 
#Ausbildung
model.fit(X, T, epochs=30, batch_size=1)
 
#Tatsächliche Klassifizierung durch Umleiten des Trainingseingangs
Y = model.predict_classes(X, batch_size=1)

print("TEST")
print(Y == T)

--Np.random.seed (0) in np.random.seed (1) geändert

Da die generierten Zufallszahlen wie unten gezeigt auf unterschiedliche Werte festgelegt sind, ändert sich auch das Lernergebnis.

python:np.random.seed()


import numpy as np
 
#Initialisieren Sie eine Zufallszahl mit einem festen Wert
np.random.seed(0)
print(np.random.randn()) -> 1.764052345967664
#Initialisieren Sie eine Zufallszahl mit einem festen Wert
np.random.seed(1)
print(np.random.randn()) -> 1.6243453636632417

Es wurde bestätigt, dass eine Erhöhung der Anzahl der Epochen den Verlust verringerte.

Es wurde bestätigt, dass die ODER-Schaltung und die UND-Schaltung linear getrennt werden können, aber das XOR kann nicht gelernt werden, da es nicht linear getrennt werden kann.

Es wurde bestätigt, dass der Verlust mit zunehmender Chargengröße zunahm.

Es wurde bestätigt, dass eine Erhöhung der Anzahl der Epochen den Verlust verringerte.

Klassifikation (Iris)

classifiy_iris


import matplotlib.pyplot as plt
from sklearn import datasets
iris = datasets.load_iris()
x = iris.data
d = iris.target

from sklearn.model_selection import train_test_split
x_train, x_test, d_train, d_test = train_test_split(x, d, test_size=0.2)

from keras.models import Sequential
from keras.layers import Dense, Activation
# from keras.optimizers import SGD

#Modelleinstellungen
model = Sequential()
model.add(Dense(12, input_dim=4))
model.add(Activation('relu'))
# model.add(Activation('sigmoid'))
model.add(Dense(3, input_dim=12))
model.add(Activation('softmax'))
model.summary()

model.compile(optimizer='sgd', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

history = model.fit(x_train, d_train, batch_size=5, epochs=20, verbose=1, validation_data=(x_test, d_test))
loss = model.evaluate(x_test, d_test, verbose=0)

#Accuracy
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.ylabel('accuracy', fontsize=14)
plt.xlabel('epoch', fontsize=14)
plt.legend(['train', 'test'], loc='lower right', fontsize=14)
plt.ylim(0, 1.0)
plt.show()

image.png

→ Eine Abnahme der Genauigkeit wurde bestätigt.

image.png

→ Es scheint, dass die Variation der Genauigkeit für jede Epoche zugenommen hat.

image.png

Klassifikation (mnist)

classify_mnist


#Importieren Sie die erforderlichen Bibliotheken
import sys, os
sys.path.append(os.pardir)  #Einstellungen zum Importieren von Dateien in das übergeordnete Verzeichnis
import keras
import matplotlib.pyplot as plt
from data.mnist import load_mnist

(x_train, d_train), (x_test, d_test) = load_mnist(normalize=True, one_hot_label=True)

#Verwenden Sie Adam zum Importieren und Optimieren der erforderlichen Bibliotheken
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import Adam

#Modellieren
model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='softmax'))
model.summary()

#Chargengröße, Anzahl der Epochen
batch_size = 128
epochs = 20

model.compile(loss='categorical_crossentropy', 
              optimizer=Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False), 
              metrics=['accuracy'])

history = model.fit(x_train, d_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, d_test))
loss = model.evaluate(x_test, d_test, verbose=0)
print('Test loss:', loss[0])
print('Test accuracy:', loss[1])

# Accuracy
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
# plt.ylim(0, 1.0)
plt.show()

image.png

CNN-Klassifikation (mnist)

classify_mnist_with_CNN


#Importieren Sie die erforderlichen Bibliotheken
import sys, os
sys.path.append(os.pardir)  #Einstellungen zum Importieren von Dateien in das übergeordnete Verzeichnis
import keras
import matplotlib.pyplot as plt
from data.mnist import load_mnist

(x_train, d_train), (x_test, d_test) = load_mnist(normalize=True, one_hot_label=True)


#Verarbeitung zur Eingabe als Matrix
batch_size = 128
num_classes = 10
epochs = 20

img_rows, img_cols = 28, 28

x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)


#Verwenden Sie Adam zum Importieren und Optimieren der erforderlichen Bibliotheken
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.optimizers import Adam

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
                 activation='relu',
                 input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
model.summary()

#Chargengröße, Anzahl der Epochen
batch_size = 128
epochs = 20

model.compile(loss='categorical_crossentropy', optimizer=Adam(), metrics=['accuracy'])
history = model.fit(x_train, d_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, d_test))

# Accuracy
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
# plt.ylim(0, 1.0)
plt.show()

image.png

→ CNN hat bestätigt, dass eine sehr hohe Vorhersagegenauigkeit von 99% oder mehr erzielt werden kann.

CIFAR-10

classify_cifar10


#CIFAR-Importieren Sie 10 Datensätze
from keras.datasets import cifar10
(x_train, d_train), (x_test, d_test) = cifar10.load_data()

#CIFAR-10 Normalisierung
from keras.utils import to_categorical
  
#Funktionsnormalisierung
x_train = x_train/255.
x_test = x_test/255.
 
#Klassenetikett 1-heiße Vektorisierung
d_train = to_categorical(d_train, 10)
d_test = to_categorical(d_test, 10)
 
#CNN bauen
import keras
from keras.models import Sequential
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.layers.core import Dense, Dropout, Activation, Flatten
import numpy as np
 
model = Sequential()
 
model.add(Conv2D(32, (3, 3), padding='same',input_shape=x_train.shape[1:]))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
 
model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
 
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(10))
model.add(Activation('softmax'))
 
#kompilieren
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
 
#Ausbildung
history = model.fit(x_train, d_train, epochs=20)
tf.executing_eagerly()

#Auswertung&Ausgabe des Bewertungsergebnisses
print(model.evaluate(x_test, d_test))

# Accuracy
plt.plot(history.history['accuracy'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.show()

#Modell speichern
# model.save('./CIFAR-10.h5')

image.png

RNN (Vorhersage der binären Addition)

RNN (Vorhersage der binären Addition)


# import tensorflow as tf
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

#Ändern Sie die Protokollierungsstufe
tf.logging.set_verbosity(tf.logging.ERROR)

import numpy as np
import matplotlib.pyplot as plt

import keras
from keras.models import Sequential
from keras.layers.core import Dense, Dropout,Activation
from keras.layers.wrappers import TimeDistributed
from keras.optimizers import SGD
from keras.layers.recurrent import SimpleRNN, LSTM, GRU


#Daten vorbereiten
#Anzahl der Binärziffern
binary_dim = 8
#Maximalwert+ 1
largest_number = pow(2, binary_dim)

# largest_Bereiten Sie Binärzahlen bis zur Nummer vor
binary = np.unpackbits(np.array([range(largest_number)], dtype=np.uint8).T,axis=1)[:, ::-1]


# A,B-Initialisierung(a + b = d)
a_int = np.random.randint(largest_number/2, size=20000)
a_bin = binary[a_int] # binary encoding
b_int = np.random.randint(largest_number/2, size=20000)
b_bin = binary[b_int] # binary encoding

x_int = []
x_bin = []
for i in range(10000):
    x_int.append(np.array([a_int[i], b_int[i]]).T)
    x_bin.append(np.array([a_bin[i], b_bin[i]]).T)

x_int_test = []
x_bin_test = []
for i in range(10001, 20000):
    x_int_test.append(np.array([a_int[i], b_int[i]]).T)
    x_bin_test.append(np.array([a_bin[i], b_bin[i]]).T)

x_int = np.array(x_int)
x_bin = np.array(x_bin)
x_int_test = np.array(x_int_test)
x_bin_test = np.array(x_bin_test)


#Richtige Antwortdaten
d_int = a_int + b_int
d_bin = binary[d_int][0:10000]
d_bin_test = binary[d_int][10001:20000]

model = Sequential()

model.add(SimpleRNN(units=16,
               return_sequences=True,
               input_shape=[8, 2],
               go_backwards=False,
               activation='relu',
               # dropout=0.5,
               # recurrent_dropout=0.3,
               # unroll = True,
            ))
#Ausgabeschicht
model.add(Dense(1, activation='sigmoid', input_shape=(-1,2)))
model.summary()
model.compile(loss='mean_squared_error', optimizer=SGD(lr=0.1), metrics=['accuracy'])
# model.compile(loss='mse', optimizer='adam', metrics=['accuracy'])

history = model.fit(x_bin, d_bin.reshape(-1, 8, 1), epochs=5, batch_size=2)

#Ausgabe des Testergebnisses
score = model.evaluate(x_bin_test, d_bin_test.reshape(-1,8,1), verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

Epoch 1/5 10000/10000 [==============================] - 28s 3ms/step - loss: 0.0810 - accuracy: 0.9156 Epoch 2/5 10000/10000 [==============================] - 28s 3ms/step - loss: 0.0029 - accuracy: 1.0000 Epoch 3/5 10000/10000 [==============================] - 28s 3ms/step - loss: 9.7898e-04 - accuracy: 1.0000 Epoch 4/5 10000/10000 [==============================] - 28s 3ms/step - loss: 4.8765e-04 - accuracy: 1.0000 Epoch 5/5 10000/10000 [==============================] - 28s 3ms/step - loss: 3.3379e-04 - accuracy: 1.0000 Test loss: 0.0002865186012966387 Test accuracy: 1.0

Abschnitt 2: Stärkung des Lernens

Was ist Bestärkungslernen?

Ein Bereich des maschinellen Lernens, der darauf abzielt, Agenten zu erstellen, die ihre Aktionen in der Umgebung auswählen können, um ihre Belohnungen langfristig zu maximieren. → Ein Mechanismus zur Verbesserung des Prinzips der Bestimmung von Maßnahmen auf der Grundlage der Vorteile (Belohnungen), die sich aus Maßnahmen ergeben.

Beim überwachten und unbeaufsichtigten Lernen besteht das Ziel darin, Vorhersagen aus den Daten zu treffen und die in den Daten enthaltenen Muster zu finden. Andererseits ist es beim verstärkten Lernen das Ziel, hervorragende Maßnahmen zu finden. Es ist möglich, das optimale Verhalten vorherzusagen und zu bestimmen, wenn Sie im Voraus über perfekte Kenntnisse der Umgebung verfügen. Bei intensivem Lernen können Sie jedoch Daten sammeln und das optimale Verhalten finden, während Sie auf der Grundlage unvollständigen Wissens handeln. Ich werde gehen.

Der Kompromiss zwischen Exploration und Nutzung

Wenn Sie immer nur die besten Aktionen basierend auf historischen Daten ausführen, können Sie keine anderen besten Aktionen finden. (Unzureichende Suche) $ \ Longleftrightarrow $ Wenn Sie immer nur unbekannte Aktionen ausführen, können Sie Ihre bisherigen Erfahrungen nicht nutzen (Zustand unzureichender Nutzung).

Bild des verstärkenden Lernens

image.png

Aktionswertfunktion

Es gibt zwei Arten von Funktionen, die Werte ausdrücken: die Statuswertfunktion (wenn Sie sich auf einen bestimmten Status konzentrieren) und die Aktionswertfunktion (wenn Sie sich auf den Wert konzentrieren, der Status und Wert kombiniert).

Richtlinienfunktion

Eine Richtlinienfunktion ist eine Funktion, die eine Wahrscheinlichkeit angibt, welche Art von Aktion in einem bestimmten Zustand in einer auf Richtlinien basierenden Lernmethode zur Verstärkung durchgeführt werden soll.

Richtliniengradientenmethode

\theta^{(t+1)} = \theta^{(t)}+\epsilon \nabla J(\theta)

Recommended Posts

[Rabbit Challenge (E-Qualifikation)] Deep Learning (Tag 3)
[Rabbit Challenge (E-Qualifikation)] Deep Learning (Tag 4)
[Rabbit Challenge (E-Qualifikation)] Angewandte Mathematik
Maschinelles Lernen Kaninchen Herausforderung
<Kurs> Tiefes Lernen: Day2 CNN
<Kurs> Tiefes Lernen: Tag 1 NN
Themen> Deep Learning: Tag 3 RNN
[Deep Learning Association E-Qualifikation] Was tun, um zu erhalten?
Studiere gründlich Deep Learning [DW Tag 0]
<Kurs> Deep Learning Day4 Stärkung des Lernens / Tensorflusses
Deep Learning Memorandum
Starten Sie Deep Learning
Python-Lerntag 4
Python Deep Learning
Deep Learning × Python
Erstes tiefes Lernen ~ Kampf ~
Python: Deep Learning-Praxis
Deep Learning / Aktivierungsfunktionen
Deep Learning von Grund auf neu
Lernrekord 4 (8. Tag)
Lernrekord 3 (7. Tag)
Deep Learning / Cross Entropy
Lernrekord 5 (9. Tag)
Lernrekord 6 (10. Tag)
Erstes tiefes Lernen ~ Vorbereitung ~
Programmieren des Lernprotokolls 2. Tag
Lernrekord 8 (12. Tag)
[AI] Deep Metric Learning
Lernrekord 1 (4. Tag)
Lernrekord 7 (11. Tag)
Python: Deep Learning Tuning
Lernrekord 2 (6. Tag)
Lernrekord 16 (20. Tag)
Lernrekord 22 (26. Tag)
Deep Learning / Softmax-Funktion
[Deep Learning] Bildklassifizierung mit Faltungsnetz [DW Tag 4]
Selbstgesteuertes Lied durch tiefes Lernen (gestapelte LSTM-Ausgabe) [DW Tag 6]