2017-10-18 11 views
0

Je construis un ConvNet pour la reconnaissance des chiffres manuscrits en utilisant le jeu de données MNIST. Mon code est écrit dans Keras en utilisant le backend Theano. Je veux former mon ConvNet afin qu'il puisse identifier un sous-ensemble de classes (par exemple, les chiffres '1' et '2' seulement) et en sortir un autre comme une classe générique 'inconnue'. Je sais que cela peut être fait sur Theano puisqu'il est décrit sur "Distributed Neural Networks for Internet of Things: The Big-Little Approach", mais je ne trouve pas de documentation ou d'exemples sur ce sujet.Agrégation des classes de sortie dans une catégorie dans Theano/Keras

Répondre

0

Modifiez les sorties de votre fonction d'objectif (Y_train) pour convertir 0, 1, 2, 3, 4, 5, etc. en 0, 1, 2 (où 2 représente "autre"). Notez que si vous voulez réellement prédire, disons, les chiffres 5 et 6, et tout le reste comme autre, vous devrez réindexer vos classes pour commencer à 0, de sorte que 0 devienne le chiffre 5, 1 devient le chiffre 6, et 2 devient "autre".

est ici une version modifiée du Keras MNIST example, essentiellement directement à partir de la prise en pension avec seulement quelques lignes supplémentaires:

'''Trains a simple convnet on the MNIST dataset. 

Gets to 99.25% test accuracy after 12 epochs 
(there is still a lot of margin for parameter tuning). 
16 seconds per epoch on a GRID K520 GPU. 
''' 

from __future__ import print_function 
import keras 
from keras.datasets import mnist 
from keras.models import Sequential 
from keras.layers import Dense, Dropout, Flatten 
from keras.layers import Conv2D, MaxPooling2D 
from keras import backend as K 
import numpy as np 

batch_size = 128 
epochs = 1 

# input image dimensions 
img_rows, img_cols = 28, 28 

# the data, shuffled and split between train and test sets 
(x_train, y_train), (x_test, y_test) = mnist.load_data() 

############################### 
# This is the key... order is important! 
y_train[y_train<=4]=2 
y_train[y_train==5]=0 
y_train[y_train==6]=1 
y_train[y_train>=7]=2 

y_test[y_test<=4]=2 
y_test[y_test==5]=0 
y_test[y_test==6]=1 
y_test[y_test>=7]=2 

num_classes=3 
print(np.unique(y_train)) 
# [0 1 2] 
############################### 

if K.image_data_format() == 'channels_first': 
    x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols) 
    x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols) 
    input_shape = (1, img_rows, img_cols) 
else: 
    x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1) 
    x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1) 
    input_shape = (img_rows, img_cols, 1) 

x_train = x_train.astype('float32') 
x_test = x_test.astype('float32') 
x_train /= 255 
x_test /= 255 
print('x_train shape:', x_train.shape) 
print(x_train.shape[0], 'train samples') 
print(x_test.shape[0], 'test samples') 

# convert class vectors to binary class matrices 
y_train = keras.utils.to_categorical(y_train, num_classes) 
y_test = keras.utils.to_categorical(y_test, num_classes) 

model = Sequential() 
model.add(Conv2D(32, kernel_size=(3, 3), 
       activation='relu', 
       input_shape=input_shape)) 
model.add(Conv2D(64, (3, 3), activation='relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Dropout(0.25)) 
model.add(Flatten()) 
model.add(Dense(128, activation='relu')) 
model.add(Dropout(0.5)) 
model.add(Dense(num_classes, activation='softmax')) 

model.compile(loss=keras.losses.categorical_crossentropy, 
       optimizer=keras.optimizers.Adadelta(), 
       metrics=['accuracy']) 

model.fit(x_train, y_train, 
      batch_size=batch_size, 
      epochs=epochs, 
      verbose=1, 
      validation_data=(x_test, y_test)) 
score = model.evaluate(x_test, y_test, verbose=0) 
print('Test loss:', score[0]) 
print('Test accuracy:', score[1])