Umformung von Daten für Deep Learning mit Keras

10

Ich bin ein Anfänger von Keras und habe mit dem MNIST-Beispiel begonnen, um zu verstehen, wie die Bibliothek tatsächlich funktioniert. Das Codefragment des MNIST-Problems im Keras-Beispielordner lautet wie folgt:

import numpy as np
np.random.seed(1337)  # for reproducibility

from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten  
from keras.layers import Convolution2D, MaxPooling2D
from keras.utils import np_utils

batch_size = 128
nb_classes = 10
nb_epoch = 12

# input image dimensions
img_rows, img_cols = 28, 28
# number of convolutional filters to use
nb_filters = 32
# size of pooling area for max pooling
nb_pool = 2
# convolution kernel size
nb_conv = 3

# the data, shuffled and split between train and test sets
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], 1, img_rows, img_cols)
X_test = X_test.reshape(X_test.shape[0], 1, img_rows, img_cols)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
..........

Ich kann die Umformfunktion hier nicht verstehen. Was macht es und warum haben wir es angewendet?

enterML
quelle

Antworten:

8

mnist.load_data()liefert die MNIST-Ziffern mit einer Struktur, (nb_samples, 28, 28)dh mit 2 Dimensionen pro Beispiel, die ein Graustufenbild 28x28 darstellen.

Die Convolution2D-Ebenen in Keras sind jedoch so konzipiert, dass sie mit drei Dimensionen pro Beispiel arbeiten. Sie haben 4-dimensionale Ein- und Ausgänge. Dies deckt Farbbilder ab (nb_samples, nb_channels, width, height), aber was noch wichtiger ist, es deckt tiefere Schichten des Netzwerks ab, in denen jedes Beispiel zu einer Reihe von Feature-Maps geworden ist, d (nb_samples, nb_features, width, height). H.

Das Graustufenbild für die Eingabe von MNIST-Ziffern würde entweder ein anderes CNN-Layer-Design benötigen (oder einen Parameter für den Layer-Konstruktor, um eine andere Form zu akzeptieren), oder das Design könnte einfach ein Standard-CNN verwenden, und Sie müssen die Beispiele explizit als 1-Kanal ausdrücken Bilder. Das Keras-Team entschied sich für den letzteren Ansatz, der neu gestaltet werden muss.

Neil Slater
quelle
Können Sie bitte die Logik hinter dem im Code verwendeten "np.random.seed (1337)" erklären? Warum 1337?
EnterML
2
Nichts Besonderes über 1337 für die Zwecke des Skripts außer Wiederholbarkeit. Es ist empfehlenswert, Ihr RNG zu setzen, damit Sie Ihre erfolgreiche Arbeit genau bei einer anderen Gelegenheit wiederholen können. Die Nummer ist ein Insider-Witz für Hacker - urbandictionary.com/define.php?term=1337
Neil Slater