Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Da_lab3 #15

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
228 changes: 149 additions & 79 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
# АНАЛИЗ ДАННЫХ И ИСКУССТВЕННЫЙ ИНТЕЛЛЕКТ [in GameDev]
Отчет по лабораторной работе #1 выполнил(а):
- Иванова Ивана Варкравтовна
- РИ000024
Отчет по лабораторной работе #3 выполнил(а):
- Мокроносов Александр Сергеевич
- РИ210950
Отметка о выполнении заданий (заполняется студентом):

| Задание | Выполнение | Баллы |
| ------ | ------ | ------ |
| Задание 1 | # | 60 |
| Задание 2 | # | 20 |
| Задание 1 | * | 60 |
| Задание 2 | * | 20 |
| Задание 3 | # | 20 |

знак "*" - задание выполнено; знак "#" - задание не выполнено;
Expand Down Expand Up @@ -35,95 +35,165 @@
- ✨Magic ✨

## Цель работы
Ознакомиться с основными операторами зыка Python на примере реализации линейной регрессии.
Познакомиться с программными средствами для создания системы машинного обучения и ее интеграции в Unity.

## Задание 1
### Пошагово выполнить каждый пункт раздела "ход работы" с описанием и примерами реализации задач
Ход работы:
- Произвести подготовку данных для работы с алгоритмом линейной регрессии. 10 видов данных были установлены случайным образом, и данные находились в линейной зависимости. Данные преобразуются в формат массива, чтобы их можно было вычислить напрямую при использовании умножения и сложения.
### Реализовать систему машинного обучения в связке Python - Google-Sheets – Unity.
- Создаём новый Unity 3D проект.
- Скачиваем папку с ML агентом.
- Добавляем в Package Manager ML-Agents.

![image](https://user-images.githubusercontent.com/113508468/200816640-fe89cb89-952f-4fb5-810e-17d4163e3033.png)

- Далее запускаем Anaconda Prompt для возможности запуска команд через консоль.
- Далее пишем серию команд для создания и активации нового ML-агента, а также для скачивания необходимых библиотек:
o mlagents 0.28.0;
o torch 1.7.1;

![image](https://user-images.githubusercontent.com/113508468/200818714-d7a3c8e8-fe06-409e-ac4c-e173d5eddd0d.png)

-Создаём на сцене плоскость, куб и сферу. А также добавляем сфере C#-скрипт

![image](https://user-images.githubusercontent.com/113508468/200824149-2a6e339a-a08a-4fcc-a8d2-7193a8ee8f47.png)

-В скрипт файл добавляем код

```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.MLAgents;
using Unity.MLAgents.Sensors;
using Unity.MLAgents.Actuators;

public class RollerAgent : Agent
{
Rigidbody rBody;
// Start is called before the first frame update
void Start()
{
rBody = GetComponent<Rigidbody>();
}

public Transform Target;
public override void OnEpisodeBegin()
{
if (this.transform.localPosition.y < 0)
{
this.rBody.angularVelocity = Vector3.zero;
this.rBody.velocity = Vector3.zero;
this.transform.localPosition = new Vector3(0, 0.5f, 0);
}

Target.localPosition = new Vector3(Random.value * 8-4, 0.5f, Random.value * 8-4);
}
public override void CollectObservations(VectorSensor sensor)
{
sensor.AddObservation(Target.localPosition);
sensor.AddObservation(this.transform.localPosition);
sensor.AddObservation(rBody.velocity.x);
sensor.AddObservation(rBody.velocity.z);
}
public float forceMultiplier = 10;
public override void OnActionReceived(ActionBuffers actionBuffers)
{
Vector3 controlSignal = Vector3.zero;
controlSignal.x = actionBuffers.ContinuousActions[0];
controlSignal.z = actionBuffers.ContinuousActions[1];
rBody.AddForce(controlSignal * forceMultiplier);

float distanceToTarget = Vector3.Distance(this.transform.localPosition, Target.localPosition);

if(distanceToTarget < 1.42f)
{
SetReward(1.0f);
EndEpisode();
}
else if (this.transform.localPosition.y < 0)
{
EndEpisode();
}
}
}

```py

In [ ]:
#Import the required modules, numpy for calculation, and Matplotlib for drawing
import numpy as np
import matplotlib.pyplot as plt
#This code is for jupyter Notebook only
%matplotlib inline
```
-Объекту сфера добавляем и изменяем компоненты

![image](https://user-images.githubusercontent.com/113508468/200825828-3e2cdb55-0167-4785-90d6-5991ef661f19.png)
![image](https://user-images.githubusercontent.com/113508468/200825877-d69dc7c0-0fb1-46ed-8f43-4c0a50e925fd.png)

-Добавляем файл конфигурации нейронной сети и следующий код:
```yaml
behaviors:
RollerBall:
trainer_type: ppo
hyperparameters:
batch_size: 10
buffer_size: 100
learning_rate: 3.0e-4
beta: 5.0e-4
epsilon: 0.2
lambd: 0.99
num_epoch: 3
learning_rate_schedule: linear
network_settings:
normalize: false
hidden_units: 128
num_layers: 2
reward_signals:
extrinsic:
gamma: 0.99
strength: 1.0
max_steps: 500000
time_horizon: 64
summary_freq: 10000
```
-Запускаем ml-agent
![image](https://user-images.githubusercontent.com/113508468/200826303-0ecef4a0-63b6-463c-beba-a6eca763d13b.png)

# define data, and change list to array
x = [3,21,22,34,54,34,55,67,89,99]
x = np.array(x)
y = [2,22,24,65,79,82,55,130,150,199]
y = np.array(y)

#Show the effect of a scatter plot
plt.scatter(x,y)
![image](https://user-images.githubusercontent.com/113508468/200826564-f2447ca5-6153-4963-b760-c8414861689c.png)
![image](https://user-images.githubusercontent.com/113508468/200826624-1099cd6a-b173-4a35-8359-52b31c4ac9dd.png)

```
-3 копии:
![image](https://user-images.githubusercontent.com/113508468/200826849-7390a063-f876-4c0a-8be9-4e545e324d7a.png)
![image](https://user-images.githubusercontent.com/113508468/200826922-6e9ccfaa-9a81-4f15-9b2a-210245b64973.png)

- Определите связанные функции. Функция модели: определяет модель линейной регрессии wx+b. Функция потерь: функция потерь среднеквадратичной ошибки. Функция оптимизации: метод градиентного спуска для нахождения частных производных w и b.
-После обучения модели видно, что шарик стал двигаться напрямую к кубику, перестал постоянно падать за пределы платформы и стал быстрее находить кубик.


## Задание 2
### Должна ли величина loss стремиться к нулю при изменении исходных данных? Ответьте на вопрос, приведите пример выполнения кода, который подтверждает ваш ответ.

- Перечисленные в этом туториале действия могут быть выполнены запуском на исполнение скрипт-файла, доступного [в репозитории](https://github.com/Den1sovDm1triy/hfss-scripting/blob/main/ScreatingSphereInAEDT.py).
- Для запуска скрипт-файла откройте Ansys Electronics Desktop. Перейдите во вкладку [Automation] - [Run Script] - [Выберите файл с именем ScreatingSphereInAEDT.py из репозитория].

```py

import ScriptEnv
ScriptEnv.Initialize("Ansoft.ElectronicsDesktop")
oDesktop.RestoreWindow()
oProject = oDesktop.NewProject()
oProject.Rename("C:/Users/denisov.dv/Documents/Ansoft/SphereDIffraction.aedt", True)
oProject.InsertDesign("HFSS", "HFSSDesign1", "HFSS Terminal Network", "")
oDesign = oProject.SetActiveDesign("HFSSDesign1")
oEditor = oDesign.SetActiveEditor("3D Modeler")
oEditor.CreateSphere(
[
"NAME:SphereParameters",
"XCenter:=" , "0mm",
"YCenter:=" , "0mm",
"ZCenter:=" , "0mm",
"Radius:=" , "1.0770329614269mm"
],
)
### Подробно опишите каждую строку файла конфигурации нейронной сети, доступного в папке с файлами проекта по ссылке. Самостоятельно найдите информацию о компонентах Decision Requester, Behavior Parameters, добавленных на сфере.

```

## Задание 3
### Какова роль параметра Lr? Ответьте на вопрос, приведите пример выполнения кода, который подтверждает ваш ответ. В качестве эксперимента можете изменить значение параметра.

- Перечисленные в этом туториале действия могут быть выполнены запуском на исполнение скрипт-файла, доступного [в репозитории](https://github.com/Den1sovDm1triy/hfss-scripting/blob/main/ScreatingSphereInAEDT.py).
- Для запуска скрипт-файла откройте Ansys Electronics Desktop. Перейдите во вкладку [Automation] - [Run Script] - [Выберите файл с именем ScreatingSphereInAEDT.py из репозитория].

```py

import ScriptEnv
ScriptEnv.Initialize("Ansoft.ElectronicsDesktop")
oDesktop.RestoreWindow()
oProject = oDesktop.NewProject()
oProject.Rename("C:/Users/denisov.dv/Documents/Ansoft/SphereDIffraction.aedt", True)
oProject.InsertDesign("HFSS", "HFSSDesign1", "HFSS Terminal Network", "")
oDesign = oProject.SetActiveDesign("HFSSDesign1")
oEditor = oDesign.SetActiveEditor("3D Modeler")
oEditor.CreateSphere(
[
"NAME:SphereParameters",
"XCenter:=" , "0mm",
"YCenter:=" , "0mm",
"ZCenter:=" , "0mm",
"Radius:=" , "1.0770329614269mm"
],
)

behaviors:
RollerBall: #Имя агента
trainer_type: ppo #Устанавливаем режим обучения.
hyperparameters: #Задаются гиперпараметры.
batch_size: 10 #Количество опытов на каждой итерации для обновления экстремумов функции.
buffer_size: 100 #Количество опыта, которое нужно набрать перед обновлением модели.
learning_rate: 3.0e-4 #Устанавливает шаг обучения (начальная скорость).
beta: 5.0e-4 #Отвечает за случайность действия, повышая разнообразие и иследованность пространства обучения.
epsilon: 0.2 #Порог расхождений между старой и новой политиками при обновлении.
lambd: 0.99 #Определяет авторитетность оценок значений во времени. Чем выше значение, тем более авторитетен набор предыдущих оценок.
num_epoch: 3 #Количество проходов через буфер опыта, при выполнении оптимизации.
learning_rate_schedule: linear #Определяет, как скорость обучения изменяется с течением времени, линейно уменьшает скорость.
network_settings: #Определяет сетевые настройки.
normalize: false #Отключается нормализация входных данных.
hidden_units: 128 #Количество нейронов в скрытых слоях сети.
num_layers: 2 #Количество скрытых слоев для размещения нейронов.
reward_signals: #Задает сигналы о вознаграждении.
extrinsic:
gamma: 0.99 #Коэффициент скидки для будущих вознаграждений.
strength: 1.0 #Шаг для learning_rate.
max_steps: 500000 #Общее количество шагов, которые должны быть выполнены в среде до завершения обучения.
time_horizon: 64 #Количество циклов ML агента, хранящихся в буфере до ввода в модель.
summary_freq: 10000 #Количество опыта, который необходимо собрать перед созданием и отображением статистики.
```

## Выводы
- Decision Requester - запрашивает решение через регулярные промежутки времени и обрабатывает чередование между ними во время обучения.

Абзац умных слов о том, что было сделано и что было узнано.
- Behavior Parameters - определяет принятие объектом решений, в него указывается какой тип поведения будет использоваться: уже обученная модель или удалённый процесс обучения.

| Plugin | README |
| ------ | ------ |
Expand Down