2017-02-24 8 views
2

私は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) 
+0

あなたは2つのレイヤーを持ち、出力します。 Dense(nb_classes、input_dim =(32 * 32 * 3))のようなものだけを指定してください。私は1Dベクトルなのでシェイプを指定する必要はないと思います。 – Atirag

+0

Uはkeras flattenの使い方を教えてくれる回答をアップアップします。 – Pinocchio

答えて

1

あなたは右のすべてをやっている、これはあなたが唯一の緻密層をしたい場合の方法です。 1Dテンソルしか受け入れないので、あなたはうまく形を変えました。

softmaxは、トレーニングするウェイトやパラメータがないため、レイヤと見なされません。

ちょっと好奇心から、なぜ入力にreluを使用しますか?彼らはすでに0と1の間にあるはずですか?

+0

私はいくつかの非線形レイヤが必要だったのでreluを置いた。そうでなければ、ネットワークは些細な線形のものしか計算できないようだ。私はSigmoidsなどを使用することができたが、それはreluのメソッドのような(確率的)勾配降下でより良い訓練のプロパティを持っているようだ。 – Pinocchio

+0

reluはあなたの変数をまったく混ぜていませんし、訓練もしていません。スマートなレイヤーではないのは、非線形であるため、負の値を0に置き換えるだけで入力を変更し、他はすべて変更しないということです。もっと複雑な関係が必要な場合は、単純にレイヤーを追加する必要があります。 –

+0

私は、レイヤードReLuネットを2層ReLuネットと比較したいと思います。その比較をするために、私は定義上少なくとも1つの非線形性の層が必要です。非線形層を持つことは、それを非普遍的近似器にするので、それでも関数を表現することができます。 – Pinocchio