web-dev-qa-db-ja.com

Kerasのデータセットを準備する方法は?

動機

Keras ニューラルネットワークを介して一連のラベル付きベクトルを実行します。

Kerasデータセットの例mnistを見てください。

keras.datasets import mnist
(x_tr, y_tr), (x_te, y_te) = mnist.load_data()
print x_tr.shape

それは3次元の派手な配列のようです:

(60000, 28, 28)
  • 1次元目はサンプル用です
  • 各サンプル機能の2番目と3番目

試み

ラベル付けされたベクトルを構築する:

X_train = numpy.array([[1] * 128] * (10 ** 4) + [[0] * 128] * (10 ** 4))
X_test = numpy.array([[1] * 128] * (10 ** 2) + [[0] * 128] * (10 ** 2))

Y_train = numpy.array([True] * (10 ** 4) + [False] * (10 ** 4))
Y_test = numpy.array([True] * (10 ** 2) + [False] * (10 ** 2))

X_train = X_train.astype("float32")
X_test = X_test.astype("float32")

Y_train = Y_train.astype("bool")
Y_test = Y_test.astype("bool")

トレーニングコード

model = Sequential()
model.add(Dense(128, 50))
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(50, 50))
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(50, 1))
model.add(Activation('softmax'))

rms = RMSprop()
model.compile(loss='binary_crossentropy', optimizer=rms)

model.fit(X_train, Y_train, batch_size=batch_size, nb_Epoch=nb_Epoch,
          show_accuracy=True, verbose=2, validation_data=(X_test, Y_test))

score = model.evaluate(X_test, Y_test, show_accuracy=True, verbose=0)
print('Test score:', score[0])
print('Test accuracy:', score[1])

結果

Test score: 13.9705320154
Test accuracy: 1.0

このような単純なデータセットでなぜこのような悪い結果が得られるのですか?データセットの形式が間違っていますか?

ありがとう!

16
Michael

1つの出力ノードだけのソフトマックスはあまり意味がありません。 model.add(Activation('softmax'))model.add(Activation('sigmoid'))に変更すると、ネットワークのパフォーマンスが向上します。

または、2つの出力ノードを使用することもできます。ここで、1, 0Trueの場合を表し、0, 1Falseの場合を表します。次に、softmaxレイヤーを使用できます。それに応じてY_trainY_testを変更するだけです。

8
aleju