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

МИНОБРНАУКИ РОССИИ

Федеральное государственное бюджетное образовательное учреждение


высшего образования
"МИРЭА - Российский технологический университет"
РТУ МИРЭА

Институт информационных технологий (ИТ)


Кафедра инструментального и прикладного программного обеспечения
(ИиППО)

ОТЧЕТ ПО ЛАБОРАТОРНОЙ РАБОТЕ № 1

по дисциплине
«​Интеллектуальные информационные системы»

программирование искусственного нейрона

Выполнил студент группы ИКБО-01-17 Новиков Д.А.

Принял старший преподаватель Рачков А.В.

Работа выполнена «___» ________ 2020 г.

«Зачтено» «___» ________ 2020г.

Москва 2020
Вариант задания №16. Персептрон.
Цель работы​: создание программы, реализующей искусственный нейрон;
разработка процедуры обучения нейрона; использование полученных
результатов для решения тестовых задач классификации и аппроксимации.
Выполнение работы:
1. Описание реализованной модели нейрона и процедуры его обучения.
В выполненной работе необходимо было реализовать нейронную сеть,
состоящую из двух слоев. Для активации персептрона использовалась
единичная ступенчатая функция Хевисайда.

Рисунок 1 – Ступенчатая функция Хевисайда


Каждый персептрон был обучен на заранее сформированном наборе
данных. Обучение происходило с помощью метода коррекции ошибки
Розенблатта. Представляет собой такой метод обучения, при котором вес связи
не изменяется до тех пор, пока текущая реакция персептрона остается
правильной. При появлении неправильной реакции вес изменяется на единицу,
а знак (+/-) определяется противоположным от знака ошибки.

2
2. Рисунок, иллюстрирующий распределение в пространстве [​x​1​,x​2​]​T
обучающих данных.

T​
Рисунок 2 – Распределение в пространстве [​
x1​​,x​
2​]​ обучающих данных.

3. Численные значения, характеризующие начальное состояние, ход


обучения и его результат.
Начальные веса для нейронов первого слоя и их веса после 20-ти
итераций представлены на рисунке 3.

Рисунок 3 –Нейроны первого слоя.


Начальные веса для нейронов второго слоя и их веса после 20-ти
итераций представлены на рисунке 4.

3
Рисунок 4 –Нейроны второго слоя.
4. Графическое представление результатов обучения нейрона
(например, график зависимости выходного сигнала нейрона от
T​
входных данных [​x1​,x
​ 2​]​
​ ).

Рисунок 5 – Результат обучения.

4
5. Исходный текст программы.

файл main.py
import enum
import json
from random import random, choice
import matplotlib.pyplot as plt
from perceptron import learn_classifier, validate

def draw_line(w):
line_f = lambda x: (-w[1] * x) / w[2]
x_vals = [0, 3]
y_vals = [line_f(x) for x in x_vals]
plt.plot(x_vals, y_vals, color='black')

def draw(dataset, color):


x = tuple(map(lambda v: v[1], dataset))
y = tuple(map(lambda v: v[2], dataset))
plt.scatter(x, y, color=color)

def gen_random_float_vector(size):
return [random() for _ in range(size)]

class Class(enum.Enum):
A = 'A'
B = 'B'
C = 'C'

def main():
with open('dataset.json', 'r') as f:
data = f.read()
dataset = json.loads(data)

w1 = gen_random_float_vector(3)
print('начальные веса\n\t',w1)
w1 = learn_classifier(dataset, w1, Class, Class.A)
w2 = gen_random_float_vector(3)
print("\t", w2)
w2 = learn_classifier(dataset, w2, Class, Class.B)
print('результаты 20-ти итераций:\n\t', w1, "\n\t", w2)
input_layer = (w1, w2)

valid = {Class.A: (1, 0), Class.B: (0, 1), Class.C: (0, 0)}
try:
for _cls in Class:
validate(dataset, _cls, input_layer, valid)
except AssertionError as e:
print('Model validation failed')
return

out_dataset = {
'A': ((1, 1.0, 0.0),(1, 0.8, 0.1),(1, 0.9, 0.1),(1, 0.8,

5
0.0),),
'B': ((1, 0.0, 0.01),(1, 0.01, 0.0),(1, 0.0, 0.0),(1,
0.1, 0.0),),
'C': ((1, 0.1, 1.0),(1, 0.0, 0.8),(1, 0.1, 0.9),(1, 0.0,
0.7),)
}

out_w1 = gen_random_float_vector(3)
print('начальные веса\n\t', out_w1)
out_w1 = learn_classifier(out_dataset, out_w1, Class,
Class.A)
out_w2 = gen_random_float_vector(3)
print('\t', out_w2)
out_w2 = learn_classifier(out_dataset, out_w2, Class,
Class.B)
out_w3 = gen_random_float_vector(3)
print('\t', out_w3)
out_w3 = learn_classifier(out_dataset, out_w3, Class,
Class.C)
print('результаты 20-ти итераций:\n\t', out_w1, "\n\t",
out_w2, "\n\t", out_w3)

output_layer = (out_w1, out_w2, out_w3)

valid = {Class.A: (1, 0, 0),Class.B: (0, 1, 0),Class.C: (0,


0, 1)}
try:
for _cls in Class:
validate(out_dataset, _cls, output_layer, valid)
except AssertionError as e:
print('Model validation failed')
return

plt.axhline(0, color='black')
plt.axvline(0, color='black')

colors = {Class.A: 'green',Class.B: 'red',Class.C: 'grey'}

for _cls in Class:


draw(dataset[_cls.value], colors[_cls])

draw_line(w1)
draw_line(w2)

plt.show()

main()

файл __init__.py
from .learn import learn_classifier, validate
from .model import predict

6
файл model.py
def heaviside(x):
if x > 0:
return 1
return 0

def predict(w, x):


prod = 0
for i in range(len(x)):
prod += x[i] * w[i]
return heaviside(prod)

файл learn.py
from .model import predict

def add(w, x):


res = []
for a, b in zip(w, x):
res.append(a + b)
return res

def sub(w, x):


res = []
for a, b in zip(w, x):
res.append(a - b)
return res

def learn_perceptron(dataset, expected_out, init_w):


w = init_w
for x in dataset:
p = predict(w, x)
if p == expected_out:
continue
if p == 0:
w = add(w, x)
else:
w = sub(w, x)
return w

def learn_classifier(dataset, init_w, classes, target_class,


iterations=20):
w = init_w
for _ in range(iterations):
for _cls in classes:
if _cls == target_class:
expected_out = 1
else:
expected_out = 0
w = learn_perceptron(dataset[_cls.value],
expected_out, w)

7
return w

def validate(dataset, _cls, weights, valid_outputs):


for x in dataset[_cls.value]:
p_out = tuple(predict(w, x) for w in weights)
assert valid_outputs[_cls] == p_out

Вывод: ​В результате выполнения работы была создана программа,


реализующий искусственный нейрон. Была реализована процедура обучения
нейрона. Была решена тестовая задача.