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
0
A
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])