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)
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
U wird noch upvote Antworten, die mir sagen, wie Keras flatten verwenden. – Pinocchio