Como usar Keras' vários perceptron de camada para a classificação multi-classe

votos
1

Tentei seguir as instruções aqui , onde ele afirmou que ele usa Reuter conjunto de dados .

from keras.datasets import reuters

(X_train, y_train), (X_test, y_test) = reuters.load_data(path=reuters.pkl,
                                                         nb_words=None,
                                                         skip_top=0,
                                                         maxlen=None,
                                                         test_split=0.1)
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.optimizers import SGD

model = Sequential()
# Dense(64) is a fully-connected layer with 64 hidden units.
# in the first layer, you must specify the expected input data shape:
# here, 20-dimensional vectors.
model.add(Dense(64, input_dim=20, init='uniform'))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(64, init='uniform'))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(10, init='uniform'))
model.add(Activation('softmax'))

sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy',
              optimizer=sgd,
              metrics=['accuracy'])

#breaks here
model.fit(X_train, y_train,
          nb_epoch=20,
          batch_size=16)

score = model.evaluate(X_test, y_test, batch_size=16)

Mas o código de quebra do modelo adequado. Como posso resolver o problema?

Atualização : Este é o erro que eu tenho.

In [21]: model.fit(X_train, y_train,
   ....:           nb_epoch=20,
   ....:           batch_size=16)
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
<ipython-input-21-4b227e56e5a9> in <module>()
      1 model.fit(X_train, y_train,
      2           nb_epoch=20,
----> 3           batch_size=16)

//anaconda/lib/python2.7/site-packages/keras/models.pyc in fit(self, x, y, batch_size, nb_epoch, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, **kwargs)
    400                               shuffle=shuffle,
    401                               class_weight=class_weight,
--> 402                               sample_weight=sample_weight)
    403
    404     def evaluate(self, x, y, batch_size=32, verbose=1,

//anaconda/lib/python2.7/site-packages/keras/engine/training.pyc in fit(self, x, y, batch_size, nb_epoch, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight)
    969                                                            class_weight=class_weight,
    970                                                            check_batch_dim=False,
--> 971                                                            batch_size=batch_size)
    972         # prepare validation data
    973         if validation_data:

//anaconda/lib/python2.7/site-packages/keras/engine/training.pyc in _standardize_user_data(self, x, y, sample_weight, class_weight, check_batch_dim, batch_size)
    909                           in zip(y, sample_weights, class_weights, self.sample_weight_modes)]
    910         check_array_lengths(x, y, sample_weights)
--> 911         check_loss_and_target_compatibility(y, self.loss_functions, self.internal_output_shapes)
    912         if self.stateful and batch_size:
    913             if x[0].shape[0] % batch_size != 0:

//anaconda/lib/python2.7/site-packages/keras/engine/training.pyc in check_loss_and_target_compatibility(targets, losses, output_shapes)
    182             if y.shape[1] == 1:
    183                 raise Exception('You are passing a target array of shape ' + str(y.shape) +
--> 184                                 ' while using as loss `categorical_crossentropy`. '
    185                                 '`categorical_crossentropy` expects '
    186                                 'targets to be binary matrices (1s and 0s) '

Exception: You are passing a target array of shape (10105, 1) while using as loss `categorical_crossentropy`. `categorical_crossentropy` expects targets to be binary matrices (1s and 0s) of shape (samples, classes). If your targets are integer classes, you can convert them to the expected format via:
```
from keras.utils.np_utils import to_categorical
y_binary = to_categorical(y_int)
```

Alternatively, you can use the loss function `sparse_categorical_crossentropy` instead, which does expect integer targets.
Publicado 28/04/2016 em 22:16
fonte usuário
Em outras línguas...                            


1 respostas

votos
11

Este é um erro de iniciante bastante comum com Keras. Ao contrário de outras estruturas aprendizagem profunda, Keras não usa rótulos inteiros para a perda crossentropy de costume, em vez disso, espera um vetor binário (chamado "one-quente"), onde o vector é apenas 0 e um 1 sobre o índice da classe direita.

Você pode facilmente converter seus rótulos para este formato com o seguinte código:

from keras.utils.np_utils import to_categorical
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)

Antes model.fit. Uma alternativa é mudar a perda de "sparse_categorical_crossentropy", o que faz esperar rótulos inteiros.

Respondeu 29/04/2016 em 07:58
fonte usuário

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