Керас правильная форма ввода для многослойного персептрона

Я пытаюсь сделать базовый пример MLP в keras. Мои входные данные имеют форму train_data.shape = (2000,75,75), а мои данные тестирования имеют форму test_data.shape = (500,75,75). 2000 и 500 - это номера выборок обучающих и тестовых данных (другими словами, форма данных (75,75), но есть 2000 и 500 частей обучающих и тестовых данных). На выходе должно быть два класса.

Я не уверен, какое значение использовать для параметра input_shape на первом уровне сети. Используя код из примера mnist в репозитории keras, у меня есть (обновлено):

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)

Любые идеи?


person 20XX    schedule 14.02.2017    source источник
comment
Можете ли вы показать больше своего кода? В частности, включая ту строку, которая дает вам эту ошибку? Вы упоминаете две переменные train_data и test_data, но я не вижу, чтобы они использовались в коде, поэтому я не уверен, как они повлияют на ситуацию, в которой вы оказались. Есть ли полный минимальный образец кода, который генерирует эту ошибку? ?   -  person onlynone    schedule 14.02.2017
comment
вам может просто потребоваться изменить форму test_data и train_data, чтобы они соответствовали 5625 , с X.reshape(-1,75*75)   -  person toine    schedule 14.02.2017


Ответы (1)


Из примера MLP keras, 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,)))
person maz    schedule 14.02.2017