Файл: Лабораторная работа 4. Готовый персептрон.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 12.01.2024

Просмотров: 46

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Лабораторная работа №4.
Готовый персептрон.
Рассматривается пример создания персептрона, изначально обученного на распознавание объектов определенного класса.
Допустим, имеется двуцветный рисунок, представленный бинарной матрицей 2×2.
Вот примеры некоторых таких рисунков:
Очевидно, что всего различных таких рисунков может быть 2 4
=16.
Попробуем написать персептрон, который безошибочно определяет один из таких рисунков. Например, тот, который слева – наклонную линию.
Очевидно, что такая задача решается написанием программы в пару строк, одна из которых оператор IF с несколькими проверками в логическом выражении. Это так. Но если картинка гораздо большей размерности (хотя бы 64×48), то логическое выражение станет невероятно громоздким.
Персептрон же, который заменяет логические операции сравнением результата скалярного умножения с пороговым числом, для больших объектов распознавания оказывается более удобным. Но свой первый самостоятельный персептрон мы построим для маленького рисуночка.
Первое допущение, которое мы сделаем, это вместо двух индексов для адреса отдельного бита будем использовать один, как на рисунке справа. Это упростит адресацию в коде. В результате, наша наклонная линия соответствует битовой строке [1001], т.е. «включены» нулевой и третий бит, а первый и второй равны нулю («выключены»).
0 1
2 3
Таким образом, мы имеем четыре сенсора (по одному на каждую клетку картинки по порядку). Соответственно персептрон может иметь такой вид:
Четыре сенсора передают сигнал из набора {0,1}, а на выходе должна быть 1, если список сигналов сенсоров будет [1001] и 0 в любом другом случае. Т.к веса w
i
должны быть из набора {-1,0,1}, то правильные сигналы сенсоров будем поддерживать весом
1 (w
0
= 1 и w
3
= 1), а ложные штрафовать весом -1 (w
1
= –1 и w
2
= –1).
Тогда сумматор произведения значений сигналов сенсоров на веса этих сенсоров может выдать максимальную сумму равную 2 только в том случае, если на входе был набор сигналов [1001].
Соответственно порог обнаружения наклонной линии будет 2.

Теперь, зная правильные параметры персептрона, напишем его реализацию на языке Python.
Вначале задаются 4 картинки, где первая из них – наша наклонная линия, а остальные – нечто иное.
В функции, реализующей персептрон, параметрами являются вектор сигналов, вектор весов, порог. Результат будет 1, если взвешенная сумма сигналов от сенсоров достигла порога или стала выше.
Функция проверки картинки на изображение наклонной линии получает вектор сенсоров, задаёт схему весов, вызывает функционал персептрона с указанным вектором сенсоров, схемой весов и порогом, равным 2, и возвращает True, если персептрон вернёт
1.
При запуске программы получаем следующий результат:
Чудесно! Мы сделали работающий персептрон!
Однако, наша радость преждевременна. Так, третья по порядку строка [0110] соответствует картинке справа, что также задаёт наклонную линию с наклоном в другую сторону. А наш персептрон её не узнаёт!

Как настроить персептрон на линию с другим наклоном?
Очень просто, надо поменять веса, указав приоритетом 1 и 2 биты (w
1
= 1 и w
2
= 1), запретив все остальные (w
0
= –1 и w
3
= –1).


В программе фактически поменяется одна строчка
И результат – мы теперь третий набор распознали как наклонную линию!
А вот первый – не распознали.
Надо как-то объединить эти два персептрона в один.
Вспомним схему нашего персептрона. Фактически, нейроны ассоциативного слоя просто транслировали далее входной сигнал от единственного сенсора далее. А вся работа, в том числе и функция активации была «зашита» в R-слой. Это типичный однослойный персептрон.
А давайте нагрузим нейроны ассоциативного слоя, пусть они определяют каждый свой тип наклонной линии, а R слой вернёт 1, если хотя бы один нейрон ассоциативного слоя обнаружит наклонную линию своего типа.
Т.к. у нас два варианта расположения наклонной линии, то в А-слое должны быть два нейрона, каждый из которых берёт сигналы от всех 4-х сенсоров.
Пусть один из них (А
0
) распознаёт наклон влево. Тогда веса его сенсоров будут
[1, –1, –1, 1]. А другой них (А
1
) распознаёт наклон вправо. Тогда веса его сенсоров будут
[–1, 1, 1, –1], как показано на рисунке. Фактически это персептрон с одним скрытым слоем.
Тогда реагирующий нейрон (он распознает любой наклон) положительно относится к обоим нейронам А-слоя, т.е. веса обоих входов равны 1. Т.к. для определения наклонной линии достаточно распознать один из вариантов наклона, то порог для R- нейрона будет 1.
Сильно ли изменится программа? Подумаем.
Метод perceptron() реализует алгоритм работы одного нейрона в персептроне. В прошлых версиях такой нейрон был один (R-нейрон), и метод вызывался только один раз.
А в новой схеме таких работяг будет трое. Значит вызвать метод придётся 3 раза.
А где вызвать? Конечно в методе IsInclinedLine()!
Здесь два набора весов для двух ассоциативных нейронов (i_1 потому, что это шаблон для первого варианта наклонной линии). Переменные a1 и a2 – выходные сигналы обоих А- нейронов, которые идут на вход третьего нейрона с весами [1,1] и порогом 1.

Код программы не картинкой: num0 = list('1001') # верная картинка наклонной линии num1 = list('1111') # другие картинки num2 = list('0110') num3 = list('1000')
# Функция персептрона - возвращает 1
# если набор сигналов соответсвует шаблону, задаваемому весами. def perceptron(Sensor, Weights, Bias): s = 0 # Начальное значение суммы n_sensor = len(Sensor) # количество сенсоров for i in range(n_sensor): # цикл суммирования сигналов от сенсоров s += int(Sensor[i]) * Weights[i] if s >= Bias: return 1 # Сумма превысила порог else: return 0 # Сумма меньше порога def IsInclinedLine(Sensor): weights_i1 = [ 1,-1,-1, 1] weights_i2 = [-1, 1, 1,-1] a1=perceptron(Sensor, weights_i1, 2) a2=perceptron(Sensor, weights_i2, 2) res=perceptron([a1,a2], [1,1], 1) return res==1
# проверка работы программы на обучающей выборке print(num0, "это наклонная? ", IsInclinedLine(num0)) print(num1, "это наклонная? ", IsInclinedLine(num1)) print(num2, "это наклонная? ", IsInclinedLine(num2)) print(num3, "это наклонная? ", IsInclinedLine(num3))
Задание в классе.
1. Реализуйте определение ещё 4-х типов картинок: точка, горизонтальная линия, вертикальная линия, квадрат.
2. Организуйте метод, который по готовому шаблону возвращает название (класс) рисунка на наше доске 2×2 (точка, горизонтальная линия, вертикальная линия, наклонная линия, квадрат) или слово «другое». Обратите внимание, что персептону поручать такую задачу нельзя. Он возвращает или 0 или 1.
Задание дома.
1. Реализовать с использованием персептрона распознавание 10 правильно нарисованных цифр в шаблоне одного знакоместа почтового индекса (9 сенсоров по числу фрагментов цифр).
2. Проверить работу программы на корректных и некорректных вариантах. За перебор разных вариантов в цикле дополнительно +1 балл.
3. За предложения варианта оптимизации числа сенсоров +1 балл
4. За визуализацию в графике цифр датасета и результата их распознавания +2 балла.