MNIST («Модифицированный национальный институт стандартов и технологий») - это фактический набор данных компьютерного зрения «привет, мир», и этот набор данных из рукописных изображений, используемых в качестве основы для алгоритмов классификации тестов. В этом руководстве мы будем использовать набор данных Kaggle, чтобы продемонстрировать различные подходы к решению проблемы распознавания изображений.

Скачать набор данных отсюда

О наборе данных

Каждое изображение представляет собой квадрат 28 на 28 пикселей (всего 784 пикселя). Набор обучающих данных содержит 42000 записей, а тестовый набор данных содержит 28000 записей. Поскольку это задача распознавания цифр, у нее есть 10 классов для прогнозирования. Современное решение имеет коэффициент ошибок около 0,2%, этого можно достичь с помощью сверточной нейронной сети.

Загрузить набор данных

import pandas as pd
import numpy as np

def get_dataset():
    train = pd.read_csv('data/train.csv')
    test = pd.read_csv('data/test.csv') 
    train_features = train.iloc[:,1:] 
    train_labels = train.iloc[:,0] 
    train_features = np.array(train_features).astype(np.uint8)
    test_features = np.array(test).astype(np.uint8) 
    return train_features, train_labels, test_features

1. Использование случайного леса
Случайные леса - это метод обучения ансамбля для работы с классификацией путем построения множества деревьев решений во время обучения и вывода класса отдельных деревьев. Леса случайных решений корректируют привычку дерева решений к переобучению их обучающей выборке. Подробнее на wiki

from sklearn.ensemble import RandomForestClassifier 
from sklearn.model_selection import cross_val_score 
train_features, train_labels, test_features = get_dataset() 
model = RandomForestClassifier(n_estimators=100) model.fit(train_features, train_labels) predictions = model.predict(test_features) 
''' 
Output array([ 0.96276026, 0.96644056, 0.96023336, 0.96546386, 0.96462601]) 
'''

Всего за 10 строк кода мы можем предсказать цифру с точностью 96%.

2. Использование многослойного персептрона
Многослойный персептрон (MLP) - это класс искусственной нейронной сети. MLP состоит как минимум из трех уровней узлов. Входной слой, скрытый слой и выходной слой. Подробнее на wiki

from keras.models import Sequential 
from keras.utils import np_utils 
from keras.layers import Dense 
train_features, train_labels, test_features = get_dataset() 
# Convert labels to one hot encoding train_labels = np_utils.to_categorical(train_labels) 
# Normalize inputs from 0-255 pixel to 0-1 
train_features = train_features / 255.0 
test_features = test_features / 255.0 
def model(num_pixels, num_classes): 
    # create model
    model = Sequential()
    model.add(Dense(num_pixels, input_dim=num_pixels, init='normal', activation='relu'))
    model.add(Dense(num_classes, init='normal', activation='softmax'))
    # Compile model
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

num_pixels = train_features.shape[1]
num_classes = train_labels.shape[1] 
m = model(num_pixels, num_classes) 
m.fit(train_features, train_labels, validation_split=0.33, nb_epoch=10, batch_size=100, verbose=2) 
''' 
Output 
Train on 28139 samples, validate on 13861 samples 
Epoch 1/10 
4s - loss: 0.3232 - acc: 0.9069 - val_loss: 0.1751 - val_acc: 0.9486 Epoch 2/10
4s - loss: 0.1291 - acc: 0.9618 - val_loss: 0.1207 - val_acc: 0.9639
Epoch 3/10 
4s - loss: 0.0827 - acc: 0.9773 - val_loss: 0.1102 - val_acc: 0.9657
Epoch 4/10 
4s - loss: 0.0574 - acc: 0.9832 - val_loss: 0.0965 - val_acc: 0.9698
Epoch 5/10 
5s - loss: 0.0371 - acc: 0.9901 - val_loss: 0.0931 - val_acc: 0.9708
Epoch 6/10 
5s - loss: 0.0257 - acc: 0.9939 - val_loss: 0.0897 - val_acc: 0.9717
Epoch 7/10 
4s - loss: 0.0198 - acc: 0.9954 - val_loss: 0.0894 - val_acc: 0.9745
Epoch 8/10 
4s - loss: 0.0126 - acc: 0.9979 - val_loss: 0.0858 - val_acc: 0.9748
Epoch 9/10 
4s - loss: 0.0076 - acc: 0.9993 - val_loss: 0.0883 - val_acc: 0.9735
Epoch 10/10 
4s - loss: 0.0054 - acc: 0.9995 - val_loss: 0.0873 - val_acc: 0.9763 '''

MLP предсказывает цифру с точностью 97%.

3. Использование сверточной нейронной сети
Сверточная нейронная сеть (CNN) - это класс глубокой искусственной нейронной сети с прямой связью, которая может применяться для распознавания изображений. Подробнее на wiki

from keras.layers import Activation, Dropout, Flatten 
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D 
train_features, train_labels, test_features = get_dataset() 
# Convert labels to one hot encoding 
train_labels = np_utils.to_categorical(train_labels) 
# Normalize inputs from 0-255 pixel to 0-1 
train_features = train_features / 255.0 
test_features = test_features / 255.0 
def model(num_classes):
    # create model
    model = Sequential()
    model.add(Conv2D(30, 3, 3, input_shape=(1, 28, 28), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Conv2D(15, 3, 3, activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.2))
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dense(50, activation='relu'))
    model.add(Dense(num_classes, activation='softmax'))
# Compile model
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model
'''
Output
Train on 28139 samples, validate on 13861 samples
Epoch 1/10
28s - loss: 0.0218 - acc: 0.9924 - val_loss: 0.0414 - val_acc: 0.9887
Epoch 2/10
28s - loss: 0.0203 - acc: 0.9932 - val_loss: 0.0395 - val_acc: 0.9889
Epoch 3/10
28s - loss: 0.0175 - acc: 0.9938 - val_loss: 0.0355 - val_acc: 0.9900
Epoch 4/10
28s - loss: 0.0191 - acc: 0.9935 - val_loss: 0.0354 - val_acc: 0.9908
Epoch 5/10
28s - loss: 0.0175 - acc: 0.9937 - val_loss: 0.0342 - val_acc: 0.9896
Epoch 6/10
28s - loss: 0.0187 - acc: 0.9939 - val_loss: 0.0359 - val_acc: 0.9905
Epoch 7/10
29s - loss: 0.0147 - acc: 0.9950 - val_loss: 0.0397 - val_acc: 0.9902
Epoch 8/10
28s - loss: 0.0171 - acc: 0.9940 - val_loss: 0.0394 - val_acc: 0.9900
Epoch 9/10
28s - loss: 0.0132 - acc: 0.9952 - val_loss: 0.0408 - val_acc: 0.9896
Epoch 10/10
30s - loss: 0.0136 - acc: 0.9954 - val_loss: 0.0373 - val_acc: 0.9904
'''

Этот простой CNN может предсказывать изображения с точностью 99%.

Первоначально опубликовано на сайте rajeshpedia.wordpress.com 8 августа 2017 г.