如何为 Keras 准备数据集?
How to prepare a dataset for Keras?
动机
通过Keras神经网络运行一组标记向量。
例子
查看 Keras 数据集示例 mnist:
keras.datasets import mnist
(x_tr, y_tr), (x_te, y_te) = mnist.load_data()
print x_tr.shape
好像是一个 3 维的 numpy 数组:
(60000, 28, 28)
- 第一个维度用于样本
- 每个样本特征的第 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
为什么对于这么简单的数据集我会得到如此糟糕的结果?
我的数据集格式不正确吗?
谢谢!
仅在一个输出节点上的 softmax 没有多大意义。如果将 model.add(Activation('softmax'))
更改为 model.add(Activation('sigmoid'))
,则您的网络运行良好。
或者,您也可以使用两个输出节点,其中 1, 0
表示 True
的情况,0, 1
表示 False
的情况。然后你可以使用 softmax 层。您只需相应地更改 Y_train
和 Y_test
。
动机
通过Keras神经网络运行一组标记向量。
例子
查看 Keras 数据集示例 mnist:
keras.datasets import mnist
(x_tr, y_tr), (x_te, y_te) = mnist.load_data()
print x_tr.shape
好像是一个 3 维的 numpy 数组:
(60000, 28, 28)
- 第一个维度用于样本
- 每个样本特征的第 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
为什么对于这么简单的数据集我会得到如此糟糕的结果? 我的数据集格式不正确吗?
谢谢!
仅在一个输出节点上的 softmax 没有多大意义。如果将 model.add(Activation('softmax'))
更改为 model.add(Activation('sigmoid'))
,则您的网络运行良好。
或者,您也可以使用两个输出节点,其中 1, 0
表示 True
的情况,0, 1
表示 False
的情况。然后你可以使用 softmax 层。您只需相应地更改 Y_train
和 Y_test
。