Обучение глубокое обучение
В настоящее время я изучаю основы Deep Learning с помощью книги Джейсона Браунли «Deep Learning with Python». Это обеспечивает хороший практический охват построения различных типов сетей глубокого обучения, таких как CNN, RNN и т. Д. Запуск каждой модели в книге сопровождается предоставлением различных показателей, например, точности модели. Но точность не дает реального ощущения распознавания изображения. Чтобы улучшить это, я обновил один из примеров кода, поставляемых вместе с книгой, с моей собственной реализацией, которая запустила модель с файлом изображения, чтобы выполнить ее классификацию. Подробные шаги, объясняющие это, следующие.
Что мы будем делать?
В этом руководстве объясняется, как построить работающую простую многослойную сеть персептрона, состоящую из одного скрытого слоя. В дополнение к рабочей модели, которая обучается на рукописных цифрах набора данных MNIST, мы посмотрим, как можно классифицировать изображение цифры, взятой из этого набора данных, с помощью этой сети.
- Многослойная сеть персептронов состоит из сети слоев полностью связанных искусственных нейронов. В нашем случае он состоит из трех слоев: входной слой, скрытый слой и выходной слой.
- База данных MNIST является аббревиатурой базы данных Смешанного национального института стандартов и технологий для рукописных цифр. Он имеет обучающий набор из 60000 примеров и тестовый набор из 10000 примеров. Он используется для контролируемого изучения искусственных нейронных сетей для классификации рукописных цифр.
Как мы делаем это?
Для выполнения этой задачи необходимо выполнить определенные предпосылки. Несколько шагов ниже были объяснены в посте на Keras, Theano и TensorFlow (KTT) .
Предпосылки
- Поддерживаемые операционные системы
- Ubuntu 16.04 64 бит
- Windows 10 или 7 64 бит
- Python 2 или Python 3 установлены с Anaconda 2 или 3 соответственно. Смотрите KTT для более подробной информации.
- Работает со следующими библиотеками глубокого обучения. Смотрите KTT для более подробной информации.
- ТензорФлоу и Теано
- Keras
- Может быть запущен в Jupyter Notebook. Смотрите шаги установки здесь .
Построение сети
Многослойный персептрон в данном конкретном случае состоит из трех слоев.
- Входной слой с 784 входами, которые рассчитываются на основе изображения 28 x 28 пикселей, которое составляет 784 пикселей.
- Скрытый средний слой с 784 нейронами и функцией активации выпрямителя
- Выходной слой с 10 выходами, которые дают вероятность прогнозирования с помощью функции активации softmax для каждой цифры от «0» до «9».
Общая структура сети
Обзор кода
Код структурирован следующим образом.
- Импортируйте соответствующие библиотеки Python для работы с сетями Deep Learning.
- Извлечь файл образа с диска в соответствии с операционной системой хоста
- Загрузите изображение для классификации
- Загрузка набора данных MNIST и предварительная обработка пикселей изображения в массивах
- Определить вспомогательные функции
- Подготовить многослойную модель персептрона и скомпилировать ее
- Проверьте, существует ли обученная модель
- Если не тренируешь новую модель, сохрани ее и предскажи картинку
- Еще загрузить текущую модель и прогнозировать изображение
Код
Приведенный ниже код представлен вам в полном объеме и может быть найден в репозитории 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.
- Если вы хотите увидеть приятную визуализацию мелкой / глубокой нейронной сети и поиграть с различными параметрами в режиме реального времени, то игровая площадка нейронной сети для вас!
Ссылка: | Предсказания о многослойном персептроне Представлено нашим партнером по JCG Андреем Черемским в блоге GetToCode.com . |