Отчет по лабораторной работе #4 - "Перцептрон" выполнил:
- Амбрушкевич Артем Антонович
- РИ-211002
Отметка о выполнении заданий (заполняется студентом):
Задание | Выполнение | Баллы |
---|---|---|
Задание 1 | * | 60 |
Задание 2 | * | 20 |
Задание 3 | # | 20 |
знак "*" - задание выполнено; знак "#" - задание не выполнено;
Работу проверили:
- к.т.н., доцент Денисов Д.В.
- к.э.н., доцент Панов М.А.
- ст. преп., Фадеев В.О.
Структура отчета
- Данные о работе: название работы, фио, группа, выполненные задания.
- Цель работы.
- Задание 1.
- Код реализации выполнения задания. Визуализация результатов выполнения (если применимо).
- Задание 2.
- Код реализации выполнения задания. Визуализация результатов выполнения (если применимо).
- Выводы.
В проекте Unity реализовать перцептрон.
В проекте Unity реализовать перцептрон, который умеет производить вычисления: OR, AND, NAND, XOR, также дать комментарии о корректности работы.
Ход работы:
- создал пустой 3D проект Unity.
- скачал скрипт
Perceptron.cs
с репозитория и добавил его в свой проект.
Содержание скрипта:using System.Collections; using System.Collections.Generic; using UnityEngine; [System.Serializable] public class TrainingSet { public double[] input; public double output; } public class Perceptron : MonoBehaviour { public TrainingSet[] ts; double[] weights = {0,0}; double bias = 0; double totalError = 0; double DotProductBias(double[] v1, double[] v2) { if (v1 == null || v2 == null) return -1; if (v1.Length != v2.Length) return -1; double d = 0; for (int x = 0; x < v1.Length; x++) { d += v1[x] * v2[x]; } d += bias; return d; } double CalcOutput(int i) { double dp = DotProductBias(weights,ts[i].input); if(dp > 0) return(1); return (0); } void InitialiseWeights() { for(int i = 0; i < weights.Length; i++) { weights[i] = Random.Range(-1.0f,1.0f); } bias = Random.Range(-1.0f,1.0f); } void UpdateWeights(int j) { double error = ts[j].output - CalcOutput(j); totalError += Mathf.Abs((float)error); for(int i = 0; i < weights.Length; i++) { weights[i] = weights[i] + error*ts[j].input[i]; } bias += error; } double CalcOutput(double i1, double i2) { double[] inp = new double[] {i1, i2}; double dp = DotProductBias(weights,inp); if(dp > 0) return(1); return (0); } void Train(int epochs) { InitialiseWeights(); for(int e = 0; e < epochs; e++) { totalError = 0; for(int t = 0; t < ts.Length; t++) { UpdateWeights(t); Debug.Log("W1: " + (weights[0]) + " W2: " + (weights[1]) + " B: " + bias); } Debug.Log("TOTAL ERROR: " + totalError); } } void Start () { Train(5); // сколько тренировок Debug.Log("Test 0 0: " + CalcOutput(0,0)); Debug.Log("Test 0 1: " + CalcOutput(0,1)); Debug.Log("Test 1 0: " + CalcOutput(1,0)); Debug.Log("Test 1 1: " + CalcOutput(1,1)); } }
- создал пустой объект с названием Perceptron и повешал на него скрипт Perceptron.cs
- далее научил "перцептрон" производить вычисление операции OR, для этого соответствующе OR заполнил таблицу истинности(рис. 1)
- далее научил "перцептрон" производить вычисление операции AND, для этого соответствующе AND заполнил таблицу истинности(рис. 3)
- далее научил "перцептрон" производить вычисление операции NAND, для этого соответствующе NAND заполнил таблицу истинности(рис. 5)
(При операции NAND вначале происходит операция логического умножение, а затем операция логического отрицания) - с операцией XOR будет по-сложнее (XOR - иключающее ИЛИ), научить "перцептрон" производить вычисление операции XOR при текущих настройках, соответствующе XOR заполнив таблицу истинности(рис. 7) - не получится даже при
Train(1000000);
так как нейронная сеть с одним перцептроном может классифицировать только линейно-разделимые образы, поэтому для решения данной задачи следует добавить скрытый слой нейронов. Таким образом, перцептрон не будет корректно выполнять операцию XOR.
Построить графики зависимости количества эпох от ошибки обучения. Указать от чего зависит необходимое количество эпох обучения.
Оптимальное количество эпох — это область между состояниями недообучения и переобучения модели. Определяется это количество эмпирически в контексте конкретной задачи. А определить эту область можно с помощью усредненного графика минимизации функции потерь по результатам нескольких итераций обучения.
В результате проделанной работы я узнал что такое персептрон, как он работает и какие задачи можно решать с помощью него. Также узнал, как персептрон используется в машинном обучении.
BigDigital Team: Denisov | Fadeev | Panov