В этой главе мы будем создавать собственные нейронные сети. Сначала создадим модель работы искусственного нейрона, а затем научимся моделировать сеть из множества нейронов.
При моделировании нейронных сетей, мы будем использовать язык программирования Python.
Почему Python? Он очень прост в освоении, кроме того, нейронные сети создают и обучают в основном на этом языке. Кроме того, Python очень популярный и распространённый язык программирования.
О Python, можно рассказывать долго и много, но мы будем изучать Python лишь в том объеме, который необходим для достижения нашей цели – изучить работу нейронных сетей.
Посетите сайт – http://www.continuum.io/downloads, на котором предлагаются различные варианты установки Anaconda Python. Я использую пакет Anaconda, для операционной системы Windows, вы можете выбрать другие варианты – OS X или Linux. Пакет Anaconda предоставляет удобное средство интерактивной разработки Jupyter Notebook, в котором необычайно удобно писать и проверять программный код. На момент написания книги, доступен пакет Anaconda 5.0.1, и Python 3.6 – который и рекомендую установить.
Если, к тому времени, когда вы посетите сайт, все будет выглядеть иначе, не пугайтесь, сути дела это не поменяет.
После установки пакета Anaconda, запустите интерактивную оболочку Jupyter Notebook, нажмите на кнопку New у правого края окна и выберите в открывшемся меню пункт Python 3, что приведет к открытию пустого блокнота:
Переменные
В переменных всегда что-то хранится (число, объекты, символы, строки). Попробуем создать переменную x со значением 20. И выведем это значение, на экран, при помощи функции – print(). Функция print() – выводит на консоль то, что расположено между её скобками:
С переменными, которые хранят числа, можно выполнять различные простейшие действия: складывать, вычитать, умножать, делить и возводить в степень:
Справа от функции print(), вы можете видеть комментарии. Делаются они очень просто, для этого, перед комментарием, необходимо поставить знак #, и текст после этого знака, в данной строке, Pytnon будет воспринимать, не как программный код, а как обычную текстовую область.
Кроме числовых переменных есть ещё строковые, с которыми мы тоже можем проделать ряд действий:
Функции
Иногда возникает необходимость повторять одни и те же действия, в ходе написания программы, по многу раз. Облегчить наш труд в подобной ситуации, призваны функции.
Давайте представим, что нам очень часто встречается одно и то же действие, а именно сумма двух различных переменных. Написав эту функцию в отдельном модуле, мы в последующем можем обращаться к ней, не переписывав одни и те же действия, по многу раз. Притом функция может возвращать какое-то значение, а может просто выполнить своё действие, например, вывод на консоль информации, при этом ничего не вернув.
Функция – отдельный блок кода, который можно вызывать по её имени из любого места программы:
Условные операторы
Условные операторы нужны для того, чтобы выполнить два разных набора действий в зависимости от того, истинно или ложно проверяемое ими утверждение. Иными словами – в зависимости от того, ложно или истинно утверждение, программа, как бы разветвляется, идет по пути, указанным ей этим условием.
Условия
В Python, условия записываются при помощью конструкции if:… else:… if – в переводе с английского – если, else переводится как – иначе.
После ключевого слова if, следует условие, которое им проверяется, если это условие правда, то выполняется тело этого оператора if, если ложно, то тело оператора if, не выполнится.
Давайте рассмотрим это на конкретном примере:
Здесь, как мы можем наблюдать, условие не выполнилось.
В этот случае, мы наблюдаем, что наше условие выполняется.
В этом примере, где задействована вся конструкция if:… else:…, условие if(если) – не выполнено, но если не выполняется условие – if, то тогда сработает условие – else(иначе).
Обратите внимание, в Python все условия принадлежащее оператору, пишутся с определенным отступом!
Массивы
Массив можно представить в виде книжной полки, которая содержат сразу несколько книг(переменных).
Пример массива, содержащего в себе числа и строку:
У массива есть такое понятие как индекс, например, по индексу ноль, массива arr, содержится элемент равный числу 5. А по индексу три, находится строка. Количеством индексов, определяется размер массива:
Обращаясь к индексам элементов, как показано на слайде ниже, мы можем менять элемент, к адресу которого мы обратились (не забываем, что начало отсчета индексов в массиве, начинается с нуля):
Для работы с массивами, в наших проектах мы будем использовать пакет numpy.
numpy – очень обширная библиотека, содержащая множество методов по работе с массивами.
Для того чтоб воспользоваться этим инструментом нужно выполнить следующий код:
import numpy
Команда import сообщает Python о необходимости привлечения дополнительных вычислительных ресурсов, для расширения круга уже имеющихся на его вооружении инструментов.
Если мы выполним следующую команду:
import numpy as np
Где, as – префикс, позволяющий сокращать, или изменять имя пакета, указав сокращение np (можно любое другое имя), мы избавляем себя от необходимости писать в программном коде полное имя пакета, т.е. говоря простым языком, заменим имя numpy на сокращенное np.
Давайте создадим с помощью пакета numpy, двухмерный массив (матрицу) с нулевыми элементами:
В коде выше, пакет numpy используется для создания двухмерного массива размерностью 2x3, где 2 – количество строк массива, 3 – количество столбцов в массиве, и во всех ячейках данного массива содержатся нулевые значения.
В массивах с несколькими измерениями, тоже можно изменять элементы, обратившись к их индексам (адресам элементов):
Срезы
Срезы позволяют обрезать массив, взяв лишь те элементы, которые нам будут нужны. Они работают по следующей схеме: [НАЧАЛО:КОНЕЦ:ШАГ].
Начало – с какого элемента стоит начать (по умолчанию равна 0);
Конец – по какой элемент мы берем элементы (по умолчанию равно длине списка);
Шаг – с каким шагом берем элементы, к примеру, каждый 2 или каждый 3 (по умолчанию каждый 1).
А если, например, нам нужен второй элемент с обратной стороны массива, то мы можем обратится к нему следующим образом:
Циклы
Циклы, необходимы там, где требуется многократные повторения действий. Если, к примеру, мы хотим вывести таблицу квадратов первых четырёх натуральных чисел, то циклы в этом вопросе, будут незаменимыми помощниками.
Когда мы попытаемся вывести квадраты чисел без циклов, то нам придётся выполнять все действия вручную, в нашем случае в 4 строки.
А если нам надо вывести квадраты первых 1000 чисел? Вводить 1000 строк? Нет, для таких случаев и существуют циклы. В Python есть два вида циклов: while и for.
Цикл while повторяет необходимые команды до тех пор, пока остается истинным условие, задаваемое, как и в случае с if, сразу после объявления оператора, как только условие выполнится, цикл прекратит свою работу.
Давайте теперь, с помощью while, выведем таблицу квадратов первых четырёх натуральных чисел:
Здорово, правда? Всего четырьмя строками кода, мы можем выводить квадраты чисел, до почти любого числа.
Если подробней разобрать работу цикла:
Сначала мы создаем переменную и присваиваем ей число 1. Затем создаем цикл while и проверяем, меньше, или равна четырем наша переменная x. Если меньше, или равна, то будут выполнятся следующие действия:
– вывод на консоль квадрата переменной x;
– в теле оператора, увеличиваем x на единицу, (запись: x+= 1, эквивалентна записи: x = x + 1)
После чего, программа возвращается к условию цикла. Если условие снова истинно, то мы снова выполняем эти два действия. И так до тех пор, пока x не станет больше 4. Тогда условие вернет ложь и цикл больше не будет выполняться.
Цикл for будем использовать, в основном, для того, чтобы перебирать элементы массива, согласно его индексам. Запишем тот же пример, что и с while, с квадратами первых шести натуральных чисел, используя цикл for:
Конструкция for i in —создает цикл, организуя счетчик для каждого числа из списка массива, путем назначения текущего значения переменной i. При первом проходе цикла выполняется присваивание i=0, потом i=1, i=2, и так до тех пор, пока мы не дойдем до последнего элемента списка, которому присвоится значение i=6.
Применяя функцию range (), эту операцию можно сделать немногим иначе:
В данном примере, функция range () – задает последовательность счета натуральных чисел, до конечного значения, указанного в скобках.
Классы и их объекты
В реальной жизни мы чаще оперируем не переменными, а объектами. Стол, стул, человек, кошка, собака, корабль – это все объекты. Наилучший способ знакомства с объектами – это рассмотреть конкретный пример:
# класс объектов Сat (кошка)
class Сat:
# Кошки говорят – “Мяу!”
def says (self):
print (‘Мяу!’)
pass
pass
Запись class Сat – означает что создан класс Сat (кошка), а функция def says(), внутри класса – это метод класса Сat, который выполняет определенные действия связанные с этим классом. В нашем случае созданный нами метод says() выводит на экран – ‘Мяу!’.
Давайте на примере покажем, как создаются объекты класса и работают его методы.
classcat = Сat () #создание объекта classСat, класса Сat
classcat.says () #использование метода says (), объекта classСat
Методов в классе может содержаться так много, насколько это необходимо, для его описания. Кошка помимо того, что может говорить: “Мяу!”, обладает и рядом других важных параметров. К ним относятся цвет шерсти, цвет глаз, кличка, и так далее. И все это, можно описать при помощи методов в классе. Давайте опишем выше сказанное в Python:
Множеству объектов, можно присваивать одинаковый класс и эти объекты в свою очередь, будут обладать одинаковыми методами:
Чтобы получить более полное представление о возможностях объектов, давайте добавим в наш класс переменные, которые будут хранить специфические данные этих объектов, а также методы, позволяющие просматривать и изменять эти данные:
Давайте разбираться что же мы тут написали.
В любом классе можно определить функцию __init__(). Эта функция всегда вызывается, когда мы создаем реальный объект класса, с изначально заданными атрибутами. Атрибут – это переменная, которая относится к классу, в котором она определена. В нашем случае, при создании объекта, мы сразу можем указать его атрибуты – кличку и количество лет, которые сразу присваиваются этому объекту. Через созданный нами метод status(), мы можем вывести информацию о количестве лет и кличке нашего объекта. Метод number_of_years (self, years), принимает число и изменяет атрибут класса – количество лет. Метод says(), не изменился, он все также говорит голосом нашего объекта – ‘Мяу!’.
О проекте
О подписке