2017-02-24 1 views
2

Ich wollte ein einlagiges neuronales Netzwerk mit dem Cifar-Datensatz und dem Keras-Framework trainieren. Da jedes Bild für den Datensatz 32 mal 32 mal 3 ist, war ich nicht sicher, wie das Bild unter Verwendung eines einlagigen Netzwerks ohne Faltung zu verarbeiten ist. Ich denke, dass jedes Bild flattern, um einen Datensatz der Form N by 32*32*3 zu haben, ist das Richtige zu tun. So habe ich die folgende:Wie trainiert man ein einlagiges Neuronales Netz in Keras mit Cifar?

#Flatten 
X_train = X_train.reshape((X_train.shape[0],32*32*3)) 
X_test = X_test.reshape((X_test.shape[0],32*32*3)) 

dann habe ich nur ein einziges geschichtetes Netzwerk hergestellt, den den Eingang Dimension angepasst:

model.add(Dense(units_single_layer, input_shape=(32*32*3,))) 
model.add(Activation('relu')) 
model.add(Dense(nb_classes)) 
model.add(Activation('softmax')) 

der Code scheint in Ordnung und alles zu kompilieren. Ist das der richtige Weg, ein einzelnes neuronales Netzwerk auf einem Bilddatensatz ohne Faltung zu trainieren? Ich schätze, die Hauptsache, die mich abstößt, ist, dass das Bild ein 3D-Tensor ist, aber ein Netz mit einer einzelnen Ebene würde es einfach als einen 1D-Vektor behandeln, ungeachtet seiner Form. Recht?

Auch, da Keras eine flatten() Funktion zur Verfügung stellte, schien es mir unklar, ob das eine bevorzugte Methode war, wegen der Effizienz oder eines anderen Grundes zu verwenden. Allerdings konnte ich das nicht funktionieren lassen.

Auch das ist selbstverständlich, aber die softmax Schicht zählt nicht wirklich als eine andere Schicht. Recht? I wollen es, um einzelne Schicht zu sein.


ganze Code:

from __future__ import print_function 
from keras.datasets import cifar10 
from keras.preprocessing.image import ImageDataGenerator 
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 = 32 
nb_classes = 10 
units_single_layer = 100 
nb_epoch = 200 
data_augmentation = False 

# input image dimensions 
img_rows, img_cols = 32, 32 
# The CIFAR10 images are RGB. 
img_channels = 3 
# The data, shuffled and split between train and test sets: 
(X_train, y_train), (X_test, y_test) = cifar10.load_data() 
#Flatten 
X_train = X_train.reshape((X_train.shape[0],32*32*3)) 
X_test = X_test.reshape((X_test.shape[0],32*32*3)) 

# Convert class vectors to binary class matrices. 
Y_train = np_utils.to_categorical(y_train, nb_classes) 
Y_test = np_utils.to_categorical(y_test, nb_classes) 

model = Sequential() 

#model.add(Flatten(input_shape=32*32*3)) 
#model.add(Flatten()) 
#model.add(Flatten(100, input_shape=(32*32*3,))) 
model.add(Dense(units_single_layer, input_shape=(32*32*3,))) 
model.add(Activation('relu')) 
model.add(Dense(nb_classes)) 
model.add(Activation('softmax')) 

# Let's train the model using RMSprop 
model.compile(loss='categorical_crossentropy', 
       optimizer='rmsprop', 
       metrics=['accuracy']) 

X_train = X_train.astype('float32') 
X_test = X_test.astype('float32') 
X_train /= 255 
X_test /= 255 

print('Not using data augmentation.') 
model.fit(X_train, Y_train, 
      batch_size=batch_size, 
      nb_epoch=nb_epoch, 
      validation_data=(X_test, Y_test), 
      shuffle=True) 
+0

Sie haben 2 Schichten, Eingang und Ausgang. Gib einfach einen wie Dense an (nb_classes, input_dim = (32 * 32 * 3)). Ich glaube nicht, dass Sie die Form angeben müssen, da es sich um einen 1D-Vektor handelt. – Atirag

+0

U wird noch upvote Antworten, die mir sagen, wie Keras flatten verwenden. – Pinocchio

Antwort

1

Sie alles richtig zu machen, das ist die Art und Weise, wenn Sie nur eine dichte Schicht soll. Es akzeptiert nur 1D Tensoren, so dass Sie gut umgestalten konnten.

Der Softmax wird nicht als Layer betrachtet, da er keine Gewichte oder Parameter zum Trainieren hat.

Nur aus Neugier, warum verwenden Sie Relust auf die Eingänge? Sind sie nicht schon zwischen 0 und 1?

+0

Ich setze die Reluums, weil ich eine nichtlineare Schicht wollte, sonst würde es scheinen, dass das Netzwerk nur triviale lineare Dinge berechnen kann. Ich hätte Sigmoids usw. verwenden können, aber es scheint, dass Reloads bessere Trainingseigenschaften mit (stochastischen) Gradientenabstiegsmethoden haben. – Pinocchio

+0

Das Relog vermischt Ihre Variablen überhaupt nicht und trainiert auch nicht. Es ist keine intelligente Ebene, nur weil es nicht linear ist, es ändert nur Ihre Eingabe, indem es die negativen Werte durch 0 ersetzt und alle anderen unverändert lässt. Wenn Sie komplexere Beziehungen wünschen, müssen Sie einfach mehr Ebenen hinzufügen. –

+0

Ich möchte ein einlagiges ReLu-Netz mit einem 2-lagigen ReLu-Netz vergleichen. Um diesen Vergleich zu machen, brauche ich definitionsgemäß mindestens eine Schicht von Nichtlinearität. Eine nichtlineare Schicht macht es zu einem nicht-universellen Approximator, so dass es immer noch jede Funktion ausdrücken kann. – Pinocchio

Verwandte Themen