私はcifarデータセットとkerasフレームワークを使って単層のニューラルネットワークを訓練したがっていました。データセットの各画像は32×32×3であるため、畳み込みのない単一のレイヤードネットワークを使用して画像をどのように処理するかについてはあまりよく分かりませんでした。私は、各画像を平らにして、形状がN by 32*32*3
のデータセットを持つことが正しいことだと思います。ケファでシファールを使って1層のニューラルネットを訓練するにはどうすればよいですか?
model.add(Dense(units_single_layer, input_shape=(32*32*3,)))
model.add(Activation('relu'))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))
コードは罰金とすべてコンパイルしているようだ:
#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))
が、私はちょうど入力次元にマッチした単層のネットワークを作った。したがって、私は次のようでした。したがって、これは畳み込みのない画像データセットで単一層のニューラルネットワークを訓練する正しい方法ですか?私は、イメージが3Dのテンソルですが、単層のネットはその形状にかかわらず1Dのベクトルとして扱うということです。右?
また、Kerasがflatten()
機能を提供して以来、効率やその他の理由により使用するのが好ましい方法であるかどうかは不明でした。しかし、私はそれを実現することができませんでした。
また、これは言うまでもないが、softmax層は実際に別の層としてカウントされない。右? I は、それが単層であることをしたい。
全体コード:
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)
あなたは2つのレイヤーを持ち、出力します。 Dense(nb_classes、input_dim =(32 * 32 * 3))のようなものだけを指定してください。私は1Dベクトルなのでシェイプを指定する必要はないと思います。 – Atirag
Uはkeras flattenの使い方を教えてくれる回答をアップアップします。 – Pinocchio