cifar データ セットと keras フレームワークを使用して、単層ニューラル ネットワークをトレーニングしたいと考えていました。データ セットの各画像は 32 x 32 x 3 であるため、畳み込みのない単層ネットワークを使用して画像を処理する方法がよくわかりませんでした。形状のデータセットを持つために各画像を平坦化することN by 32*32*3
は正しいことだと思います。したがって、私は次のことを行いました:
#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))
次に、入力次元に一致する単一の層状ネットワークを作成しました。
model.add(Dense(units_single_layer, input_shape=(32*32*3,)))
model.add(Activation('relu'))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))
コードは正常にコンパイルされているようです。したがって、これは畳み込みなしで画像データセットで単一層のニューラルネットワークをトレーニングする正しい方法ですか? 私をうんざりさせている主なことは、画像が3Dテンソルであるが、単一レイヤーネットは、その形状に関係なく、それを1Dベクトルとして扱うことだと思います. 右?
また、Keras はflatten()
関数を提供していたので、それが効率性やその他の理由で使用するのに適した方法であったかどうかは不明でした。しかし、私はそれを機能させることができませんでした。
また、これは言うまでもありませんが、ソフトマックスレイヤーは実際には別のレイヤーとしてカウントされません。右?単層にしたい。
コード全体:
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)