Статьи

Предсказаны многослойные персептроны

Обучение глубокое обучение

В настоящее время я изучаю основы Deep Learning с помощью книги Джейсона Браунли «Deep Learning with Python». Это обеспечивает хороший практический охват построения различных типов сетей глубокого обучения, таких как CNN, RNN и т. Д. Запуск каждой модели в книге сопровождается предоставлением различных показателей, например, точности модели. Но точность не дает реального ощущения распознавания изображения. Чтобы улучшить это, я обновил один из примеров кода, поставляемых вместе с книгой, с моей собственной реализацией, которая запустила модель с файлом изображения, чтобы выполнить ее классификацию. Подробные шаги, объясняющие это, следующие.

Что мы будем делать?

В этом руководстве объясняется, как построить работающую простую многослойную сеть персептрона, состоящую из одного скрытого слоя. В дополнение к рабочей модели, которая обучается на рукописных цифрах набора данных MNIST, мы посмотрим, как можно классифицировать изображение цифры, взятой из этого набора данных, с помощью этой сети.

  • Многослойная сеть персептронов состоит из сети слоев полностью связанных искусственных нейронов. В нашем случае он состоит из трех слоев: входной слой, скрытый слой и выходной слой.
  • База данных MNIST является аббревиатурой базы данных Смешанного национального института стандартов и технологий для рукописных цифр. Он имеет обучающий набор из 60000 примеров и тестовый набор из 10000 примеров. Он используется для контролируемого изучения искусственных нейронных сетей для классификации рукописных цифр.

Как мы делаем это?

Для выполнения этой задачи необходимо выполнить определенные предпосылки. Несколько шагов ниже были объяснены в посте на Keras, Theano и TensorFlow (KTT) .

Предпосылки

  1. Поддерживаемые операционные системы
    1. Ubuntu 16.04 64 бит
    2. Windows 10 или 7 64 бит
  2. Python 2 или Python 3 установлены с Anaconda 2 или 3 соответственно. Смотрите KTT для более подробной информации.
  3. Работает со следующими библиотеками глубокого обучения. Смотрите KTT для более подробной информации.
    1. ТензорФлоу и Теано
    2. Keras
  4. Может быть запущен в Jupyter Notebook. Смотрите шаги установки здесь .

Построение сети

Многослойный персептрон в данном конкретном случае состоит из трех слоев.

  • Входной слой с 784 входами, которые рассчитываются на основе изображения 28 x 28 пикселей, которое составляет 784 пикселей.
  • Скрытый средний слой с 784 нейронами и функцией активации выпрямителя
  • Выходной слой с 10 выходами, которые дают вероятность прогнозирования с помощью функции активации softmax для каждой цифры от «0» до «9».

Общая структура сети

Обзор кода

Код структурирован следующим образом.

  1. Импортируйте соответствующие библиотеки Python для работы с сетями Deep Learning.
  2. Извлечь файл образа с диска в соответствии с операционной системой хоста
  3. Загрузите изображение для классификации
  4. Загрузка набора данных MNIST и предварительная обработка пикселей изображения в массивах
  5. Определить вспомогательные функции
  6. Подготовить многослойную модель персептрона и скомпилировать ее
  7. Проверьте, существует ли обученная модель
  8. Если не тренируешь новую модель, сохрани ее и предскажи картинку
  9. Еще загрузить текущую модель и прогнозировать изображение

Код

Приведенный ниже код представлен вам в полном объеме и может быть найден в репозитории GitHub в дополнение к сохраненной модели и Jupyter Notebook, что позволяет по-настоящему интерактивно запускать этот модуль кода за модулем.

  • Импорт подходящих библиотек Python для работы с сетями Deep Learning
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
# Baseline MLP for MNIST dataset
import numpy
import skimage.io as io
import os
import platform
import getpass
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.utils import np_utils
from keras.models import model_from_json
from os.path import isfile, join
 
# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)
  • Извлечь файл образа с диска в соответствии с операционной системой хоста. В нашем случае это изображение размером 3 × 28 пикселей из набора данных MNIST с цифрой «3»
  • Загрузите изображение для классификации
01
02
03
04
05
06
07
08
09
10
11
12
13
# load data
platform = platform.system()
currentUser = getpass.getuser()
currentDirectory = os.getcwd()
 
if platform is 'Windows':
 #path_image = 'C:\\Users\\' + currentUser
 path_image = currentDirectory
else:
 #path_image = '/user/' + currentUser
 path_image = currentDirectory
fn = 'image.png'
img = io.imread(os.path.join(path_image, fn))
  • Загрузка набора данных MNIST и предварительная обработка пикселей изображения в массивах
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# prepare arrays
X_t = []
y_t = []
X_t.append(img)
y_t.append(3)
 
X_t = numpy.asarray(X_t)
y_t = numpy.asarray(y_t)
y_t = np_utils.to_categorical(y_t, 10)
 
(X_train, y_train), (X_test, y_test) = mnist.load_data()
 
# flatten 28*28 images to a 784 vector for each image
num_pixels = X_train.shape[1] * X_train.shape[2]
X_train = X_train.reshape(X_train.shape[0], num_pixels).astype('float32')
X_test = X_test.reshape(X_test.shape[0], num_pixels).astype('float32')
X_t = X_t.reshape(X_t.shape[0], num_pixels).astype('float32')
 
# normalize inputs from 0-255 to 0-1
X_train = X_train / 255
X_test = X_test / 255
X_t /= 255
 
print('X_train shape:', X_train.shape)
print ('X_t shape:', X_t.shape)
print(X_train.shape[0], 'train samples')
print(X_test.shape[0], 'test samples')
print(X_t.shape[0], 'test images')
 
# one hot encode outputs
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
 
num_classes = y_test.shape[1]
print(y_test.shape[1], 'number of classes')
  • Определить вспомогательные функции
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# define baseline model
def baseline_model():
 # 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
  
def build_model(model):
 # build the model
 model = baseline_model()
 # Fit the model
 model.fit(X_train, y_train, validation_data=(X_test, y_test),nb_epoch=10, batch_size=200, verbose=2)
 return model
 
def save_model(model):
 # serialize model to JSON
 model_json = model.to_json()
 with open("model.json", "w") as json_file:
 json_file.write(model_json)
 # serialize weights to HDF5
 model.save_weights("model.h5")
 print("Saved model to disk")
  
def load_model():
 # load json and create model
 json_file = open('model.json', 'r')
 loaded_model_json = json_file.read()
 json_file.close()
 loaded_model = model_from_json(loaded_model_json)
 # load weights into new model
 loaded_model.load_weights("model.h5")
 if loaded_model:
 print("Loaded model")
 else:
 print("Model is not loaded correctly")
 return loaded_model
 
def print_class(scores):
 for index, score in numpy.ndenumerate(scores):
 number = index[1]
 print (number, "-", score)
 for index, score in numpy.ndenumerate(scores):
 if(score > 0.5):
 number = index[1]
 print ("\nNumber is: %d, probability is: %f" % (number, score))
  • Подготовить многослойную модель персептрона и скомпилировать ее
1
2
model = baseline_model()
path = os.path.exists("model.json")
  • Проверьте, существует ли обученная модель
  • Если не тренируешь новую модель, сохрани ее и предскажи картинку
1
2
3
4
5
6
7
if not path:
 model = build_model(model)
 save_model(model)
 # Final evaluation of the model
 scores = model.predict(X_t)
 print("Probabilities for each class\n")
 print_class(scores)
  • Еще загрузить текущую модель и прогнозировать изображение
1
2
3
4
5
6
7
8
else:
 # Final evaluation of the model
 loaded_model = load_model()
 if loaded_model is not None:
 loaded_model.compile(loss='categorical_crossentropy', optimizer='adam',metrics=['accuracy'])
 scores = loaded_model.predict(X_t)
 print("Probabilities for each class\n")
 print_class(scores)

Как запустить

Если вы скачали / клонировали проект и у вас есть все необходимые условия, чтобы запустить его, просто введите эту команду в терминале.

1
python mnist_mlp_baseline.py

Предсказание выставлено

Прогнозируемый результат для изображения цифры 3 выглядит следующим образом.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
Probabilities for each class
 
(0, '-', 3.4988901e-07)
(1, '-', 3.7538914e-08)
(2, '-', 0.00072528532)
(3, '-', 0.99788445)
(4, '-', 1.7879113e-08)
(5, '-', 1.3890726e-06)
(6, '-', 2.5650074e-10)
(7, '-', 2.233218e-05)
(8, '-', 0.0012537371)
(9, '-', 0.00011237688)
 
Number is: 3, probability is: 0.997884

Ресурсы

  • Этот проект основан на примерах кода из книги Deep Learning with Python Джейсона Браунли с сайта Machine Learning Mastery
  • Несколько строк были взяты из сообщения в блоге Ahem Detector With Deep Learning Франческо Гадалета с сайта World of Piggy.
  • Если вы хотите увидеть приятную визуализацию мелкой / глубокой нейронной сети и поиграть с различными параметрами в режиме реального времени, то игровая площадка нейронной сети для вас!