2015-05-21 4 views
2

У меня есть этот код:Python keras нейронной сети пакет (Theano) возвращает ошибку о размерах данных

import numpy as np 
from keras.models import Sequential 
from keras.layers.core import Dense, Dropout, Activation 
from keras.optimizers import SGD 
from sklearn import datasets 
import theano 

iris = datasets.load_iris() 
X = iris.data[:,0:3] # we only take the first two features. 
Y = iris.target 

X = X.astype(theano.config.floatX) 
Y = Y.astype(theano.config.floatX) 


model = Sequential() 
model.add(Dense(150, 1, init='uniform')) 
model.add(Activation('tanh')) 
model.add(Dropout(0.5)) 
model.add(Dense(150, 1, init='uniform')) 
model.add(Activation('tanh')) 
model.add(Dropout(0.5)) 
model.add(Dense(150, 1, init='uniform')) 
model.add(Activation('softmax')) 

sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True) 
model.compile(loss='mean_squared_error', optimizer=sgd) 

model.fit(X, Y, nb_epoch=20, batch_size=150) 


score = model.evaluate(X_train, y_train, batch_size=16) 

возвращает эту ошибку:

ValueError: Shape mismatch: x has 3 cols (and 150 rows) but y has 150 rows (and 1 cols) 
Apply node that caused the error: Dot22(<TensorType(float64, matrix)>, <TensorType(float64, matrix)>) 
Inputs types: [TensorType(float64, matrix), TensorType(float64, matrix)] 
Inputs shapes: [(150L, 3L), (150L, 1L)] 
Inputs strides: [(24L, 8L), (8L, 8L)] 
Inputs values: ['not shown', 'not shown'] 

В чем проблема?

+0

В какой строке вашей программы вы получаете сообщение об ошибке? – cfh

+0

'---> 29 model.fit (X, Y, nb_epoch = 20, batch_size = 150)' – user2991243

ответ

6

Вы указали неправильные размеры вывода для ваших внутренних слоев. Смотри, например, этот пример из документации Keras:

model = Sequential() 
model.add(Dense(20, 64, init='uniform')) 
model.add(Activation('tanh')) 
model.add(Dropout(0.5)) 
model.add(Dense(64, 64, init='uniform')) 
model.add(Activation('tanh')) 
model.add(Dropout(0.5)) 
model.add(Dense(64, 2, init='uniform')) 
model.add(Activation('softmax')) 

Обратите внимание, как размер выходного одного слоя соответствует размеру входной следующему:

20x64 -> 64x64 -> 64x2 

Первое число всегда размер входа (количество нейронов на предыдущем слое), второе число - размер выхода (количество нейронов на следующем слое). Таким образом, в этом примере у Вас есть четыре слоя:

  • входной слой с 20 нейронами
  • скрытый слой с 64 нейронами
  • скрытый слой с 64 нейронами
  • выходной слой с 2 ​​нейронов

Единственное жесткое ограничение, которое у вас есть, это то, что на первом (входном) слое должно быть столько нейронов, сколько у вас есть, а на последнем (выходном) уровне должно быть столько нейронов, сколько вам нужно для вашей задачи.

Для вашего примера, поскольку у вас есть три функции, вам необходимо изменить размер входного слоя на 3, и вы можете сохранить два выходных нейрона из этого примера, чтобы выполнить двоичную классификацию (или использовать один, как и вы, с логистическая потеря).

+0

Спасибо за ответ. Мой вход имеет 150 образцов (строк) безумных 3 функций (столбцов). Выход имеет один столбец (+150 выборок). Какая правильная форма выше для этих данных? и где я должен установить количество нейронов в каждом слое? – user2991243

+0

+ Что такое 'batch_size'? – user2991243

+1

@ user2991243: Я продлил ответ. – cfh

 Смежные вопросы

  • Нет связанных вопросов^_^