如何为Keras准备数据集?

16

动机

通过Keras神经网络运行一组带标签的向量。

示例

观察Keras数据集示例mnist:

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

看起来是一个三维的numpy数组:

(60000, 28, 28)
  • 第一维是样本
  • 第二维和第三维是每个样本的特征

尝试

构建标记向量:

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

为什么一个如此简单的数据集给出了这样糟糕的结果?我的数据集格式有问题吗?

谢谢!

1个回答

8

仅对一个输出节点进行softmax并没有太多意义。如果你将model.add(Activation('softmax'))改为model.add(Activation('sigmoid')),你的神经网络表现会更好。

或者你也可以使用两个输出节点,其中1, 0表示True的情况,0, 1表示False的情况。然后你可以使用softmax层。你只需要相应地更改你的Y_trainY_test即可。


1
@c0d3rman:“如果你把5、6、7输入softmax函数,你会得到它们分别除以它们的和- 5/18、6/18、7/18。”这是不正确的。请参见https://en.wikipedia.org/wiki/Softmax_function。 - Jorge Leitao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接