Keras 为多层感知器正确输入形状

Posted

技术标签:

【中文标题】Keras 为多层感知器正确输入形状【英文标题】:Keras correct input shape for multilayer perceptron 【发布时间】:2017-07-03 05:42:16 【问题描述】:

我正在尝试在 keras 中制作一个基本的 MLP 示例。我的输入数据的形状为train_data.shape = (2000,75,75),我的测试数据的形状为test_data.shape = (500,75,75)2000500是训练和测试数据的样本数(也就是说数据的形状是(75,75),但是训练和测试数据有2000条和500条)。输出应该有两个类。

我不确定为网络第一层的input_shape 参数使用什么值。使用 keras 存储库中 mnist 示例中的代码,我有(更新):

from six.moves    import cPickle
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.utils  import np_utils
from keras.optimizers import RMSprop

# Globals
NUM_CLASSES = 2
NUM_EPOCHS  = 10
BATCH_SIZE  = 250

def loadData():
    fData = open('data.pkl','rb')
    fLabels = open('labels.pkl','rb')
    data = cPickle.load(fData)
    labels = cPickle.load(fLabels)

    train_data = data[0:2000]
    train_labels = labels[0:2000]
    test_data = data[2000:]
    test_labels = labels[2000:]
    return (train_data, train_labels, test_data, test_labels)

# Load data and corresponding labels for model
train_data, train_labels, test_data, test_labels = loadData()

train_labels = np_utils.to_categorical(train_labels, NUM_CLASSES)
test_labels  = np_utils.to_categorical(test_labels, NUM_CLASSES)

print(train_data.shape)
print(test_data.shape)

model = Sequential()
model.add(Dense(512, input_shape=(5625,)))
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(2))
model.add(Activation('softmax'))

model.summary()

model.compile(loss='categorical_crossentropy',
              optimizer=RMSprop(),
              metrics=['accuracy'])

history = model.fit(train_data, train_labels, validation_data=(test_data, test_labels), 
                    batch_size=BATCH_SIZE, nb_epoch=NUM_EPOCHS,
                    verbose=1)
score = model.evaluate(test_data, test_labels, verbose=0)
print('Test score:', score[0])
print('Test accuracy:', score[1])

其中5625 是 75 * 75(模拟 MNIST 示例)。我得到的错误是:

Error when checking model input: expected dense_input_1 to have 2 dimensions, but got array with shape (2000, 75, 75)

有什么想法吗?

【问题讨论】:

你能展示更多你的代码吗?特别包括给你那个错误的那一行?您提到了两个变量 train_datatest_data,但我没有看到它们在代码中使用,所以我不确定它们将如何影响您发现自己所处的情况。是否有完整的、最小的代码示例会产生这个错误? 您可能只需要重塑 test_datatrain_data 以匹配 5625 X.reshape(-1,75*75) 【参考方案1】:

来自 keras MLP 示例,https://github.com/fchollet/keras/blob/master/examples/mnist_mlp.py

# the data, shuffled and split between train and test sets
(X_train, y_train), (X_test, y_test) = mnist.load_data()

X_train = X_train.reshape(60000, 784)
X_test = X_test.reshape(10000, 784)

以及模型输入

model = Sequential()
model.add(Dense(512, input_shape=(784,)))

所以你应该重塑你的火车和测试到 (2000,75*75) 和 (500,75*75)

train_data = train_data.reshape(2000, 75*75)
test_data = test_data.reshape(500, 75*75)

然后像你一样设置模型输入形状

model.add(Dense(512, input_shape=(75*75,)))

【讨论】:

以上是关于Keras 为多层感知器正确输入形状的主要内容,如果未能解决你的问题,请参考以下文章

keras基于多层感知器的softmax多分类

多层感知器 (MLP) Keras 张量流模型

Keras 使用多层感知器 预测泰坦尼克 乘客 生还概率

halcon多层感知器MLP的使用

正确训练多层感知器的功率为2

TFboy养成记 多层感知器 MLP