2017-02-14 99 views
1

我想在keras做一个基本的MLP示例。我的输入数据的形状为train_data.shape = (2000,75,75),我的测试数据的形状为test_data.shape = (500,75,75)2000500是训练和测试数据的样本数量(换句话说,数据的形状是(75,75),但有2000和500件训练和测试数据)。输出应该有两个类。Keras正确的输入形状为多层感知器

我不确定在网络的第一层上使用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) 

任何想法?

+0

你能展示更多的代码吗?具体包括那条给你那个错误的线?你提到了两个变量'train_data'和'test_data',但是我没有看到它们在代码中使用,所以我不确定它们将如何影响你发现的情况。是否有完整的,最小的代码示例产生这个错误? – onlynone

+0

你可能只需要改变'test_data'和'train_data'来匹配'5625',用'X.reshape(-1,75 * 75)' – toine

回答

0

从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,))) 
+0

这对我有用。谢谢! – 20XX