Вы находитесь на странице: 1из 24

Урок № 6

Собственная
нейронная сеть с нуля
на языке Python

СОДЕРЖАНИЕ
Введение. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Нейронные сети. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Создание нейросети . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

Материалы к уроку прикреплены к данному PDF-файлу.


Д ля доступа к материалам необходимо открыть урок
в программе Adobe Acrobat Reader.
Собственная нейронная сеть с нуля на языке Python

Введение
Data Science и машинное обучение, нейронные
сети и искусственный интеллект – все эти направле-
ния с каждым годом становятся все более популярными
(рис. 1).

Рисунок 1

Многие считают, что повсеместное развитие этих


сфер является не меньшим прорывом в научном про-
грессе, чем изобретение персонального компьютера.
На этом занятии вы также сможете почувство-
вать, каково это – создать нейронную
сеть, способную распознавать и классифициро-
вать изображения.
Но обо всем по порядку.
3
Урок № 6

Нейронные сети
Нейронные сети получили свое название из-за ана-
логии со связками нейронов в нервной системе живых
организмов. Грубо говоря, нейронные сети можно на-
звать упрощенным подобием мозга.
Состоят нейронные сети из так называемых процес-
соров (искусственных нейронов). Каждый нейрон вы-
полняет простое действие с данными, но если объеди-
нить нейроны в сеть, где они будут взаимодействовать
между собой, то вместе они могут быть использованы
для решения множества сложных задач (рис. 2).

Рисунок 2

4
Собственная нейронная сеть с нуля на языке Python

Важно отметить, что нейронные сети изначально


не программируют на те или иные действия. Главной
их особенностью является возможность обучения по
определенному алгоритму.
Представим, что нейрон – это ячейка. У ячейки есть
входы, через которые в нее поступают данные, а так-
же выход. Данные обрабатываются, а затем передают-
ся дальше. Способ обработки данных внутри нейрона
определяет уже алгоритм вычисления.

Одними из самых распространенных являются


нейросети, которые занимаются распознаванием об-
разов. Их обучение происходит при помощи наборов
данных, касающихся изучаемой предметной области.
Такие датасеты обычно содержат большой объем дан-
ных и собирать их самостоятельно весьма проблематич-
но.
Поэтому для нашей нейросети мы будем использо-
вать готовый датасет MNIST Fashion (см. рис. 3 на стр.
6).

5
Урок № 6

Рисунок 3

MNIST Fashion содержит изображения одежды, ко-


торые разбиты на 10 классов (рис. 4).

6
Собственная нейронная сеть с нуля на языке Python

Рисунок 4

Нам предстоит научить нейросеть определять


класс для каждого из изображений.
Не будем терять ни минуты и приступим к написа-
нию кода!

Создание нейросети
В качестве основной библиотеки для работы с ней-
ронными сетями мы будем использовать TensorFlow.
Эта библиотека была разработана компанией Google
специально для нейросетей, основной задачей которых
является нахождение и распознавание образов (рис. 5).

7
Урок № 6

Рисунок 5

Давайте начнем с создания нового проекта.


Для этого открываем PyCharm и нажимаем New
Project. В появившемся окне вводим название и нажи-
маем Create (рис. 6).

Рисунок 6

Теперь нам нужно установить все дополнительные


библиотеки, которые понадобятся нам на этом занятии.
8
Собственная нейронная сеть с нуля на языке Python

Устанавливаем NumPy для работы с многомерными


массивами, для этого открываем в PyCharm терминал и
пишем следующую команду (рис. 7):
pip install numpy

Рисунок 7

Затем по аналогии устанавливаем Matplotlib. Это


библиотека, которая позволит визуализировать данные,
полученные при работе с нейронной сетью.
pip install matplotlib
Теперь библиотека Keras. Она предназначена для
работы с нейросетями и является надстройкой, в том
числе и над вышеупомянутым фреймворком TensorFlow
от Google.
pip install keras

9
Урок № 6

И последнее, что мы установим – Jupyter. Это удоб-


ная веб-оболочка, которая позволит удобно разбить код
на отдельные блоки и улучшить визуализацию рабочего
процесса.
pip install jupyter
Писать сам код мы будем не в PyCharm, а прямо в
браузере. Для этого запускаем Jupyter с помощью ко-
манды:
jupyter notebook
Jupyter запустится на локальном хосте и выведет в
терминале ссылку для браузера (рис. 8).

Рисунок 8

Переходим по ссылке. Интерфейс Jupyter выглядит


следующим образом (рис. 9).

Рисунок 9

10
Собственная нейронная сеть с нуля на языке Python

Нам нужно создать новый Notebook. Так в этой би-


блиотеке называются файлы, которые содержат блоки с
кодом.
Особенно удобным является то, что вывод из кон-
кретных блоков производится прямо под ними. Таким
образом, вы можете запускать один или несколько бло-
ков отдельно от остального кода.
Нажимаем New > Python 3 и создаем новый блокнот
(рис. 10).

Рисунок 10

Он выглядит, как на рисунке 11.

Рисунок 11

11
Урок № 6

Импортируем в первом блоке кода все ранее скачан-


ные нами библиотеки:
import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt

Теперь нажимаем Insert > Insert Cell Below для до-


бавления нового пустого блока кода. В итоге должно по-
лучиться, как на рисунке 12.

Рисунок 12

В созданном блоке импортируем и загружаем дата-


сет MNIST Fashion:
import tensorflow as tf
from tensorflow imafashion_mnist = keras.datasets.
fashion_mnist
(train_images, train_labels), (test_images, test_
labels) = fashion_mnist.load_data()port keras
import numpy as np
import matplotlib.pyplot as plt

12
Собственная нейронная сеть с нуля на языке Python

fashion_mnist.load_data() возвращает четыре


NumPy массива.
train_images содержит 10000 изображений для
обучения сети, а train_labels, соответственно, метки
для них.
test_images и test_labels содержат изображения
и метки для тестирования сети.
Изображения представлены в виде массивов NumPy
28 × 28, а метки в виде целого числа от 0 до 9. Числа соот-
ветствуют следующим категориям (рис. 13):

Рисунок 13

13
Урок № 6

Создадим массив с именами категорий:


class_names = ['T-shirt/top', 'Trouser',
'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt',
'Sneaker', 'Bag', 'Ankle boot']

В следующем блоке попробуем вывести первое тре-


нировочное изображение с помощью matplotlib:
plt.figure()
plt.imshow(train_images[0])
plt.colorbar()
plt.grid(False)

Теперь нажимаем Cell > Run All, чтобы запустить


последовательное выполнение всех блоков кода, кото-
рые есть в нашем блокноте. Результат будет выглядеть,
как на рисунке 14 на странице 15.
Как видно из скриншота, вывод происходит в пре-
делах блока, где он вызывается. Это одно из тех преиму-
ществ, ради которых мы используем Jupyter.
Обратите внимание, что Colorbar справа от изо-
бражения (см. рис. 14) показывает, что значение пиксе-
лей находится в диапазоне от 0 до 250.
Мы масштабируем значение для каждого изображе-
ния таким образом, чтобы оно находилось в пределах от
0 до 1. Для этого в следующем блоке пишем следующий
код:
train_images = train_images / 255.0
test_images = test_images / 255.0

14
Собственная нейронная сеть с нуля на языке Python

Рисунок 14

Далее отобразим первые 25 изображений с именами


класса, чтобы убедиться, что они правильно размечены.
Прописываем следующий код:
plt.figure(figsize=(10,10))
for i in range(25):
plt.subplot(5,5,i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(train_images[i], cmap=plt.cm.binary)
plt.xlabel(class_names[train_labels[i]])

15
Урок № 6

Снова нажимаем Cell > Run All и просматриваем ре-


зультат (рис. 15):

Рисунок 15

Теперь нам нужно построить модель нейронной


сети, добавить все необходимые слои. Слой – это одна
из составляющих сети, которая, в свою очередь, состо-
ит из нейронов. У нас будет три слоя.

16
Собственная нейронная сеть с нуля на языке Python

Первый слой будет преобразовывать массив 28 × 28


в одномерный массив из 28 * 28 = 784 элементов.
Второй слой содержит 128 нейронов для работы с
изображением.
Третий слой содержит 10 нейронов, каждый из ко-
торых возвращает оценку вероятности соответствия
изображения одному из 10 классов. Сумма всех оценок
не должна превышать 1.
Прописываем в следующем блоке код модели:
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation=tf.nn.relu),
keras.layers.Dense(10, activation=tf.nn.softmax)
])

Следующий этап – компиляция модели. Состоит


она из следующего кода:
model.compile(optimizer=tf.train.AdamOptimizer(),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])

optimizer – обновление модели в процессе обуче-


ния.
loss – функция потери, точность модели в процессе
обучения.
metrics – этапы обучения.

17
Урок № 6

Пришло время начать обучение модели. В новом


блоке вызываем соответствующую функцию:
model.fit(train_images, train_labels, epochs=5)

В следующем блоке кода оценим точность с помо-


щью набора изображений для тестирования:
test_loss, test_acc = model.evaluate(test_images,
test_labels)
print('Test accuracy:', test_acc)

Запускаем блоки с кодом. Запускать каждый раз все


блоки не нужно. Достаточно выбрать последний запу-
щенный блок и нажать Cell > Run All Below, чтобы за-
пустить все блоки, которые были добавлены после вы-
бранного (рис. 16).

Рисунок 16

18
Собственная нейронная сеть с нуля на языке Python

Наконец, попробуем сделать прогнозы с помощью


нашей сети. Запишем их в переменную predictions:
predictions = model.predict(test_images)

И посмотрим, какая метка имеет наибольшее значе-


ние:
np.argmax(predictions[0])

Затем, сравним результат предсказания с тестовой


меткой:
test_labels[0]

Запустим добавленные блоки и посмотрим на ре-


зультат (рис. 17):

Рисунок 17

Отлично, предсказание метки совпало с тестовой


меткой!
Однако, согласитесь, что выводить данные таким
образом неудобно.
19
Урок № 6

Давайте улучшим визуализацию, добавив следую-


щие функции:
def plot_image(i, predictions_array, true_label,
img):
  predictions_array, true_label, img =
predictions_array[i], true_label[i], img[i]
  plt.grid(False)
  plt.xticks([])
  plt.yticks([])
 
  plt.imshow(img, cmap=plt.cm.binary)

  predicted_label = np.argmax(predictions_array)
  if predicted_label == true_label:
    color = 'blue'
  else:
    color = 'red'
 
  plt.xlabel("{} {:2.0f}% ({})".format(class_
names[predicted_label],
                          100*np.
max(predictions_array),
                          class_names[true_label]),
                          color=color)

def plot_value_array(i, predictions_array, true_


label):
  predictions_array, true_label = predictions_
array[i], true_label[i]
  plt.grid(False)

20
Собственная нейронная сеть с нуля на языке Python

  plt.xticks([])
  plt.yticks([])
  thisplot = plt.bar(range(10), predictions_
array, color="#777777")
  plt.ylim([0, 1])
  predicted_label = np.argmax(predictions_array)
 
  thisplot[predicted_label].set_color('red')
  thisplot[true_label].set_color('blue')

Попробуем запустить функцию с одним из изобра-


жений (рис. 18):
i = 0
plt.figure(figsize=(6,3))
plt.subplot(1,2,1)
plot_image(i, predictions, test_labels, test_
images)
plt.subplot(1,2,2)
plot_value_array(i, predictions, test_labels)

Рисунок 18

21
Урок № 6

Согласитесь, так выглядит намного лучше! Теперь


для наглядности выведем результаты предсказаний по
большему количеству изображений (рис. 19):
num_rows = 5
num_cols = 4
num_images = num_rows*num_cols
plt.figure(figsize=(2*2*num_cols, 2*num_rows))
for i in range(num_images):
plt.subplot(num_rows, 2*num_cols, 2*i+1)
plot_image(i, predictions, test_labels, test_
images)
plt.subplot(num_rows, 2*num_cols, 2*i+2)
plot_value_array(i, predictions, test_labels)

Рисунок 19

22
Собственная нейронная сеть с нуля на языке Python

Отлично! Как видно из графиков, в 90% случаев


наша нейронная сеть правильно определила катего-
рию изображения.

Напоследок можете ознакомиться с игрой Quick,


Draw! от Google, которая использует нейросеть (рис.
20).

Рисунок 20

Игрок рисует изображение, а нейросеть пытается


угадать, что на нем. Сеть обучается на каждом рисунке,
чтобы в будущем делать более точные предсказания.
Игра доступна по ссылке:
https://quickdraw.withgoogle.com/.

23
Урок № 6
Собственная нейронная сеть с нуля
на языке Python

© Компьютерная Академия ШАГ


www.itstep.org

Все права на охраняемые авторским правом фото-, аудио- и видеопроизведения,


фрагменты которых использованы в материале, принадлежат их законным владель-
цам. Фрагменты произведений используются в иллюстративных целях в объёме,
оправданном поставленной задачей, в рамках учебного процесса и в учебных целях,
в соответствии со ст. 1274 ч. 4 ГК РФ и ст. 21 и 23 Закона Украины «Про авторське
право і суміжні права». Объём и способ цитируемых произведений соответствует
принятым нормам, не наносит ущерба нормальному использованию объектов
авторского права и не ущемляет законные интересы автора и правообладателей.
Цитируемые фрагменты произведений на момент использования не могут быть
заменены альтернативными, не охраняемыми авторским правом аналогами, и
как таковые соответствуют критериям добросовестного использования и честного
использования.
Все права защищены. Полное или частичное копирование материалов запрещено.
Согласование использования произведений или их фрагментов производится
с авторами и правообладателями. Согласованное использование материалов
возможно только при указании источника.
Ответственность за несанкционированное копирование и коммерческое исполь-
зование материалов определяется действующим законодательством Украины.