Python Keras rede neural (Théano) pacote retorna um erro de cerca de dimensões de dados

votos
2

Eu tenho esse código:

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)

Retorna este erro:

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']

Qual é o problema?

Publicado 21/05/2015 em 20:45
fonte usuário
Em outras línguas...                            


1 respostas

votos
6

Você especificou as dimensões de saída erradas para as suas camadas internas. Ver, por exemplo este exemplo a partir da documentação 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'))

Note-se como o tamanho de uma camada de saída corresponda ao tamanho da entrada do próximo:

20x64 -> 64x64 -> 64x2

O primeiro número é sempre o tamanho da entrada (número de neurónios na camada anterior), o segundo número ao tamanho de saída (número de neurónios na camada seguinte). Portanto, neste exemplo, você tem quatro camadas:

  • uma camada de entrada com 20 neurónios
  • uma camada oculta com 64 neurónios
  • uma camada oculta com 64 neurónios
  • uma camada de saída com 2 neurónios

A única restrição duro que você tem é que a primeira camada (entrada) precisa ter tantos neurônios quanto você tem recursos, e a última camada (saída) precisa ter tantos neurônios quanto você precisa para a sua tarefa.

Para o seu exemplo, desde que você tem três características, você precisa alterar o tamanho da camada de entrada para 3, e você pode manter os dois neurônios de saída a partir deste exemplo para fazer classificação binária (ou usar um, como você fez, com a perda de logística).

Respondeu 21/05/2015 em 22:27
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more