[PYTHON] "Deep Learning from Grund" Memo zum Selbststudium (Nr. 16) Ich habe versucht, SimpleConvNet mit Keras zu erstellen

Während ich "Deep Learning von Grund auf neu" lese (geschrieben von Yasuki Saito, veröffentlicht von O'Reilly Japan), werde ich die Websites notieren, auf die ich verwiesen habe. Teil 15 ← → Teil 17

Da Google Colab normal verwendet werden kann, werde ich den Inhalt dieses Buches mit TensorFlow testen.

Ich glaube, ich konnte das fünfte Kapitel des Buches mit dem Tutorial "First Neural Network" für Anfänger auf der TensorFlow-Website https://www.tensorflow.org/?hl=ja abdecken. Daher werde ich versuchen, das Äquivalent von SimpleConvNet in Kapitel 7 mit Keras zu erstellen.

Conv1D ? 2D ? 3D ? Ich kann mir vorstellen, dass Conv Nantoka zum Falten verwendet wird, aber es gibt Typen wie 1D 2D 3D, und D ist wahrscheinlich dimensional dimensioniert, sodass 2D 2D für die Bildverarbeitung in Ordnung ist. Bedeutet das? Wenn das der Fall ist, ist das in Ordnung,

Aber

Was ist eine Dimension? Was ist 3D? Ich mache mir darüber Sorgen.

1D sind Zeitreihendaten usw.

Aus der Keras-Dokumentation Wenn Sie diese Ebene als erste Ebene verwenden, geben Sie input_shape (Integer Taple oder None) ein. Beispiel: Für 10 128-dimensionale Vektoren (10, 128), für eine beliebige Anzahl von 128-dimensionalen Vektoren (None, None,) Bitte geben Sie 128)) an.

darüber Es gab so ein Beispiel. Lösen von Zeitreihenvorhersagen mithilfe eindimensionaler Faltung Visualisieren Sie die Ausgabe der eindimensionalen Faltungsschicht für Zeitreihendaten

2D ist ein Bild usw.

Wenn Sie diese Ebene als erste Ebene des Modells verwenden, geben Sie das Schlüsselwortargument input_shape an (ausgenommen ganzzahlige Taples und Beispielachsen). Wenn beispielsweise data_format = "channel_last" ist, ist input_shape = (128, 128, 3) für ein 128 x 128 RGB-Bild.

3D ist ein Raum einschließlich Höhe

Wenn Sie diese Ebene als erste Ebene des Modells verwenden, geben Sie das Schlüsselwortargument input_shape an (ohne ganzzahlige Taples und Beispielachsen). Im Fall von data_format = "channel_last" ist der Einzelkanal 128x128x128 solid input_shape = (128, 128, 128, 1).

Es gab ein solches Beispiel, weil die Daten der Bewegungsrichtung im Raum ebenfalls dreidimensional sind. Verhaltensklassifizierung nach Beschleunigungssensor

Conv2D Convolution2D Parameter Filter, Anzahl der Ausgangsfilter in Faltung kernel_size gibt die Breite und Höhe des Faltungsfilters an. Bei einer einzelnen Ganzzahl handelt es sich um einen quadratischen Kernel Sie können Schritte = (1, 1), vertikale und horizontale Schritte für die Faltung angeben. Für eine einzelne Ganzzahl sind Breite und Höhe ähnliche Schritte padding = 'valid', geben Sie entweder "valid" oder "same" an data_format=None, dilation_rate=(1, 1), groups=1, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None, **kwargs

data_format Geben Sie entweder "canal_last" (Standard) oder "channel_first" an. Dies ist die Reihenfolge der Abmessungen in der Eingabe. Im Fall von "channel_last" ist die Eingabeform "(Stapel, Höhe, Breite, Kanäle)" und im Fall von "channel_first" "(Stapel, Kanäle, Höhe, Breite)".

Wenn Sie umgekehrt darüber nachdenken, sagt Keras, dass die Standardform der Eingabe "customers_last" (Stapel, Höhe, Breite, Kanäle) ist.

damit

Es ist zu beachten, dass die MNIST-Daten, die von "Deep Learning von Grund auf neu" verarbeitet werden, (Stapel, Kanäle, Höhe, Breite) channel_first sind. Selbst wenn ich für diesen Parameter "channel_first" angebe, wird eine Fehlermeldung angezeigt. Immerhin habe ich beschlossen, die Daten zur Verarbeitung in channel_last zu konvertieren.

Informationen zum Auffüllen finden Sie hier → Tensorflow - Auffüllen = Unterschied zwischen GÜLTIG / GLEICH

SimpleConvNet

Erstellen wir SimpleConvNet mit Keras, wie auf Seite 229 des Buches beschrieben.

Da wir in Google Drive gespeicherte MNIST-Daten verwenden, definieren wir die Laufwerksbereitstellung und den Pfad zum Ordner auf dem Laufwerk.

from google.colab import drive
drive.mount('/content/drive')

import sys, os
sys.path.append('/content/drive/My Drive/Colab Notebooks/deep_learning/common')
sys.path.append('/content/drive/My Drive/Colab Notebooks/deep_learning/dataset')
#TensorFlow und tf.Keras importieren
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from keras.layers import Dense, Activation, Flatten, Conv2D, MaxPooling2D

#Hilfsbibliothek importieren
import numpy as np
import matplotlib.pyplot as plt

Lesen Sie die im Laufwerk gespeicherten MNIST-Daten.

from mnist import load_mnist
#Daten lesen
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=False)
x_train.shape

(60000, 1, 28, 28)

(Stapel, Kanäle, Höhe, Breite) Es hat das Format channel_first. Konvertieren Sie dies in (Stapel, Höhe, Breite, Kanäle) channel_last.

X_train = x_train.transpose(0,2,3,1)
X_test = x_test.transpose(0,2,3,1)

X_train.shape

(60000, 28, 28, 1)

Es wurde channel_last. Da das Label t_train ein ganzzahliges Ziel ist, verwenden Sie sparse_categorical_crossentropy für die Verlustfunktion.

"Deep Learning von Grund auf neu" P230 Wie in Abbildung 7-23 dargestellt, lautet die Netzwerkkonfiguration "Convolution --ReLU --Pooling --Affine --ReLU --Affine --Softmax". g7-23.jpg

Ich habe das mit Keras gebaut. Da relu für die Aktivierungsfunktion verwendet wird, wird he_normal als Anfangswert des Gewichts verwendet.

input_shape=(28,28,1)
filter_num = 30
filter_size = 5
filter_stride = 1
pool_size_h=2
pool_size_w=2
pool_stride=2
hidden_size=100
output_size=10

model = keras.Sequential(name="SimpleConvNet")
model.add(Conv2D(filter_num, filter_size, activation="relu", strides=filter_stride, kernel_initializer='he_normal', input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(pool_size_h, pool_size_w),strides=pool_stride))
model.add(Flatten())
model.add(Dense(hidden_size, activation="relu", kernel_initializer='he_normal')) 
model.add(keras.layers.Dense(output_size, activation="softmax"))

#Modell kompilieren
model.compile(loss="sparse_categorical_crossentropy", 
              optimizer="adam", 
              metrics=["accuracy"])

model.summary()

Model: SimpleConvNet Layer     (type)      Output Shape     Param


conv2d     (Conv2D)    (None, 24, 24, 30)   780
max_pooling2d (MaxPooling2D) (None, 12, 12, 30)    0
flatten     (Flatten)    (None, 4320)       0
dense      (Dense)     (None, 100)     432100
dense_1     (Dense)     (None, 10)       1010


Total params: 433,890 Trainable params: 433,890 Non-trainable params: 0

Trainiere das Modell.

model.fit(X_train, t_train,  epochs=5, batch_size=128)

Epoch 1/5 469/469 [==============================] - 27s 58ms/step - loss: 0.2050 - accuracy: 0.9404 Epoch 2/5 469/469 [==============================] - 27s 57ms/step - loss: 0.0614 - accuracy: 0.9819 Epoch 3/5 469/469 [==============================] - 26s 56ms/step - loss: 0.0411 - accuracy: 0.9875 Epoch 4/5 469/469 [==============================] - 27s 58ms/step - loss: 0.0315 - accuracy: 0.9903 Epoch 5/5 469/469 [==============================] - 27s 57ms/step - loss: 0.0251 - accuracy: 0.9927 tensorflow.python.keras.callbacks.History at 0x7f5167581748

Es wurde eine ziemlich hohe Genauigkeitsrate.

#Vorhersagen
predictions = model.predict(X_test)

class_names = ['0', '1', '2', '3', '4', 
               '5', '6', '7', '8', '9']

def plot_image(i, predictions_array, t_label, img):
    predictions_array = predictions_array[i]
    img = img[i].reshape((28, 28))
    true_label = t_label[i]
    plt.grid(False)
    plt.xticks([])
    plt.yticks([])

    plt.imshow(img, cmap=plt.cm.binary)

    predicted_label = np.argmax(predictions_array)
    if predicted_label == true_label:
        color = 'blue'
    else:
        color = 'red'

    plt.xlabel("{} {:2.0f}% ({})".format(class_names[predicted_label],
                                    100*np.max(predictions_array),
                                    class_names[true_label]),
                                    color=color)

def plot_value_array(i, predictions_array, t_label):
    predictions_array = predictions_array[i]
    true_label = t_label[i]
    plt.grid(False)
    plt.xticks([])
    plt.yticks([])
    thisplot = plt.bar(range(10), predictions_array, color="#777777")
    plt.ylim([0, 1]) 
    predicted_label = np.argmax(predictions_array)

    thisplot[predicted_label].set_color('red')
    thisplot[true_label].set_color('blue')

#Zeigt X Testbilder, vorhergesagte Beschriftungen und korrekte Beschriftungen an.
#Richtige Vorhersagen werden blau und falsche Vorhersagen rot angezeigt.
num_rows = 5
num_cols = 3
num_images = num_rows*num_cols
plt.figure(figsize=(2*2*num_cols, 2*num_rows))
for i in range(num_images):
    plt.subplot(num_rows, 2*num_cols, 2*i+1)
    plot_image(i, predictions, t_test, X_test)
    plt.subplot(num_rows, 2*num_cols, 2*i+2)
    plot_value_array(i, predictions, t_test)
plt.show()

g7-24.jpg

Ich konnte die 9. 5 richtig identifizieren, was ziemlich schwierig ist.

Es gibt auch eine Möglichkeit zum Schreiben, indem Ebenen einzeln gestapelt werden.

model = keras.Sequential(name="SimpleConvNet")
model.add(keras.Input(shape=input_shape))
model.add(keras.layers.Convolution2D(filter_num, filter_size, strides=filter_stride, kernel_initializer='he_normal'))
model.add(keras.layers.Activation(tf.nn.relu)) 
model.add(keras.layers.MaxPooling2D(pool_size=(pool_size_h, pool_size_w),strides=pool_stride))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(hidden_size))
model.add(keras.layers.Activation(tf.nn.relu)) 
model.add(keras.layers.Dense(output_size))
model.add(keras.layers.Activation(tf.nn.softmax)) 

Teil 15 ← → Teil 17 Klicken Sie hier, um eine Liste der Memos usw. anzuzeigen. Unlesbares Glossar

Recommended Posts

"Deep Learning from Grund" Memo zum Selbststudium (Nr. 16) Ich habe versucht, SimpleConvNet mit Keras zu erstellen
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 17) Ich habe versucht, DeepConvNet mit Keras zu erstellen
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 11) CNN
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 19) Datenerweiterung
Ich habe versucht, Dropout zu erklären
Selbststudien-Memo "Deep Learning from Grund" (Nr. 18) Eins! Miau! Grad-CAM!
Ich habe versucht, Perceptron Teil 1 [Deep Learning von Grund auf neu] zu implementieren.
Selbststudien-Memo "Deep Learning from Grund" (Nr. 15) TensorFlow-Anfänger-Tutorial
"Deep Learning from Grund" Memo zum Selbststudium (Teil 12) Deep Learning
Ich habe versucht, Deep Learning mit Spark × Keras × Docker skalierbar zu machen
Selbststudien-Memo "Deep Learning from Grund" (Nr. 13) Verwenden Sie Google Colaboratory
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 10-2) Anfangswert des Gewichts
"Deep Learning from Grund" Memo zum Selbststudium (Teil 8) Ich habe die Grafik in Kapitel 6 mit matplotlib gezeichnet
Selbststudien-Memo "Deep Learning from Grund" (unlesbares Glossar)
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 9) MultiLayerNet-Klasse
"Deep Learning from Grund" Memo zum Selbststudium (10) MultiLayerNet-Klasse
[Deep Learning von Grund auf neu] Ich habe versucht, Sigmoid Layer und Relu Layer zu implementieren
Ich habe versucht, die Strichzeichnung mit Deep Learning aus dem Bild zu extrahieren
Ich habe versucht, Deep Learning mit Spark × Keras × Docker 2 Multi-Host-Edition skalierbar zu machen
Versuchen Sie, ein Deep Learning / Neuronales Netzwerk mit Scratch aufzubauen
Ich habe versucht, in einem tief erlernten Sprachmodell zu schreiben
[Deep Learning von Grund auf neu] Ich habe versucht, die Gradientenbestätigung auf leicht verständliche Weise zu erklären.
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 14) Führen Sie das Programm in Kapitel 4 in Google Colaboratory aus
[Lernnotiz] Deep Learning von Grund auf neu gemacht [Kapitel 7]
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 / Deep Learning von Grund auf neu Kapitel 7 Memo
[Lernnotiz] Deep Learning von Grund auf neu gemacht [~ Kapitel 4]
Ich habe versucht, Deep Learning zu implementieren, das nicht nur mit NumPy tiefgreifend ist
Ich habe versucht, GAN (mnist) mit Keras zu bewegen
Deep Learning von Grund auf neu ① Kapitel 6 "Lerntechniken"
Deep Learning von Grund auf neu Kapitel 2 Perceptron (Memo lesen)
Ich habe versucht, Keras in TFv1.1 zu integrieren
[Lernnotiz] Deep Learning von Grund auf ~ Implementierung von Dropout ~
Deep Learning von Grund auf neu
[Python] [Verarbeitung natürlicher Sprache] Ich habe Deep Learning ausprobiert (auf Japanisch von Grund auf neu erstellt)
Ich habe versucht, tief zu lernen
Ich habe versucht, Cifar10 mit der SONY Deep Learning Library NNabla [Nippon Hurra] zu implementieren.
[Python] Ich habe die gleiche Berechnung versucht wie die Vorhersage von LSTM von Grund auf [Keras]
[Deep Learning von Grund auf neu] Ich habe die Affine-Ebene implementiert
Ich habe versucht, maschinelles Lernen (Objekterkennung) mit TouchDesigner zu verschieben
Ich habe versucht, eine ML-Pipeline mit Cloud Composer zu erstellen
Ich habe versucht, Grad-CAM mit Keras und Tensorflow zu implementieren
Ich habe versucht, Pferderennen vorherzusagen, indem ich alles von der Datenerfassung bis zum tiefen Lernen getan habe
Wagen Sie es, mit Ruby zu lernen "Deep Learning from Grund von Grund auf neu" Importieren von Pickle-Dateien aus verbotenem PyCall
Ich habe versucht, mit Python (Mac OS X) eine Umgebung für maschinelles Lernen zu erstellen.
Deep Learning von Grund auf 1-3 Kapitel
Erstellen Sie mit Docker eine Umgebung für "Deep Learning von Grund auf neu"
Mayungos Python Learning Episode 3: Ich habe versucht, Zahlen zu drucken
Ich habe versucht, ListNet of Rank Learning mit Chainer zu implementieren
Ich habe das Toho-Projekt mit Deep Learning aufgenommen ... ich wollte.
Ich habe versucht, Othello AI zu machen, dass ich 7,2 Millionen Hände durch tiefes Lernen mit Chainer gelernt habe
Ein Memo bei der Ausführung des Beispielcodes von Deep Learning, der mit Google Colaboratory von Grund auf neu erstellt wurde
Ich habe versucht, Deep VQE zu implementieren
Deep Learning / Deep Learning von Grund auf neu Kapitel 3 Memo
Deep Learning / Deep Learning von Null 2 Kapitel 5 Memo
Ich habe maschinelles Lernen mit liblinear versucht