Нейронні мережі в системах керування динамічними об'єктами

Вимоги до програмного виробу та функціональних характеристик. Опис інтерфейсу програмного виробу, процедур і функцій. Мережі зі зворотним розповсюдженням. Алгоритм навчання з вчителем (алгоритм зворотного розповсюдження багатошарових нейронних мереж).

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 20.01.2009
Размер файла 1,1 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Необхідно відзначити, що навчання без вчителя набагато більш відчутно до вибору оптимальних параметрів, ніж навчання з вчителем. По-перше, його якість сильно залежить від початкових величин синапсів. По-друге, навчання критичне до вибору радіуса навчання і швидкості його зміни. І нарешті, зрозуміло, дуже важливий характер зміни власне коефіцієнта навчання. У зв'язку з цим розробнику, швидше за все, буде потрібно провести попередню роботу по підбору оптимальних параметрів навчання мережі.

Незважаючи на деякі складності реалізації, алгоритми навчання без вчителя знаходять велике й успішне застосування. По суті, за алгоритмом навчання без вчителя функціонують найбільш складні з відомих на сьогоднішній день штучні нейронні мережі - когнитрон і неокогнитрон, що максимально наблизилися у своєму втіленні до структури мозку. Однак вони, звичайно, істотно відрізняються від розглянутих вище мереж і набагато більш складні. Проте, на основі вищевикладеного матеріалу можна створити реально діючі системи для розпізнавання образів, стиску інформації, автоматизованого керування, експертних оцінок і багато іншого що буде продемонстроване на прикладі розробки мережі Хебба розпізнавання символів.

3.3. Алгоритми функціонування мереж Хопфілда і Хемінга

Серед різних конфігурацій штучних нейронних мереж (НМ) зустрічаються такі, при класифікації яких за принципом навчання, строго кажучи, не підходять ні навчання з вчителем, ні навчання без вчителя. У таких мережах вагові коефіцієнти синапсів розраховуються тільки один раз перед початком функціонуванням мережі на основі інформації про оброблення даний, і все навчання мережі зводиться саме до цього розрахунку. З одного боку, пред'явлення апріорної інформації можна розцінювати, як допомога вчителя, але з іншого боку - мережа фактично просто запам'ятовує зразки до того, як на її вхід надходять реальні дані, і не може змінювати своє поводження, тому казати про ланку зворотного зв'язку зі "світом" (вчителем) не приходиться. З мереж з подібною логікою роботи найбільш відомі мережа Хопфилда і мережа Хеммінга, що звичайно використовуються для організації асоціативної пам'яті.

Структурна схема мережі Хопфилда приведена на рис. 5. Вона складається з єдиного шару нейронів, число яких є одночасно числом входів і виходів мережі. Кожен нейрон зв'язаний синапсами зі всіма іншими нейронами, а також має один вхідний синапс, через який здійснюється введення сигналу. Вихідні сигнали, як звичайно, утворюються на аксонах.

Задача, розв'язувана даною мережею як асоціативна пам'ять, як правило, формулюється в такий спосіб. Відомий деякий набір двійкових сигналів (зображень, звукових оцифровок, інших даних, що описують якісь об'єкти або характеристики процесів), що вважаються зразковими. Мережа повинна вміти з довільного неідеального сигналу, поданого на її вхід, виділити ("згадати" за частковою інформацією) відповідний зразок (якщо такий є) або "дати висновок" про те, що вхідні дані не відповідають жодному зі зразків.

Рис. 5 Структурна схема мережі Хопфилда

У загальному випадку, будь-який сигнал може бути описаний вектором X = { xi: i=0...n-1}, n - число нейронів в мережі і розмірність вхідних та вихідних векторів. Кожен елемент xi дорівнює або +1, або -1. позначимо вектор, який описує k-ий зразок, через Xk, а його компоненти, відповідно, - xik, k=0...m-1, m - число зразків. Коли мережа розпізнає (або "згадає") який-небудь зразок на основі пред'явлених їй даних, її виходи будуть містити саме його, тобто Y = Xk, де Y - вектор вихідних значень мережі: Y = { yi: i=0,...n-1}. В противному випадку, вихідний вектор не співпадає не з одним зразковим.

Якщо, наприклад, сигнали являють собою якісь зображення, то, відобразивши в графічному вигляді дані з виходу мережі, можна буде побачити картинку, що цілком збігається з однією зі зразкових (у випадку успіху) або ж "вільну імпровізацію" мережі (у випадку невдачі).

На стадії ініціалізації мережі вагові коефіцієнти синапсів встановлюються в такий спосіб:

. (3.24)

Тут i та j - індекси, відповідно, предсинаптичного и постсинаптичного нейронів; xik, xjk - i-ий та j-ий елементи вектору k-ого зразку.

Алгоритм функціонування мережі наступний (p - номер ітерації):

1. На входи мережі подається невідомий сигнал. Фактично його ввід здійснюється безпосередньою установкою значень аксонів:

yi(0) = xi , i = 0...n-1, (3.25)

тому позначення на схемі мережі вхідних синапсів у явному вигляді носить чисто умовний характер. Нуль у дужці праворуч від yі означає нульову ітерацію у циклі роботи мережі.

2. Обчислюється новий стан нейронів:

, j=0...n-1, (3.26)

і нові значення аксонів:

, (3.27)

де f - активаційна функція у вигляді стрибка, приведена на рис. 6а.

Рис. 6 Активаційні функції

3. Перевірка, чи змінилися вихідні значення аксонів за останню ітерацію. Якщо так - перехід до пункту 2, інакше (якщо виходи застабілізувалися) - кінець. При цьому вихідний вектор являє собою зразок, що найкраще сполучиться з вхідними даними.

Як було сказано вище, іноді мережа не може провести розпізнавання і видає на виході неіснуючий образ. Це зв'язано з проблемою обмеженості можливостей мережі. Для мережі Хопфилда число образів, що запам'ятовуються, m не повинне перевищувати величини, приблизно рівної 0.15n. Крім того, якщо два образи А і Б сильно схожі, вони, можливо, будуть викликати в мережі перехресні асоціації, тобто пред'явлення на входи мережі вектору А призведе до появи на її виходах вектору Б и навпаки.

Коли немає необхідності, щоб мережа в явному вигляді видавала зразок, тобто досить, скажемо, одержувати номер зразка, асоціативну пам'ять успішно реалізує мережа Хеммінга. Дана мережа характеризується, у порівнянні з мережею Хопфилда, меншими витратами на пам'ять і обсягом обчислень, що стає очевидним з її структури (рис. 7).

Рис. 7 Структурна схема мережі Хеммінга

Мережа складається з двох шарів. Перший і другий шари мають по m нейронів, де m - число зразків. Нейрони першого шару мають по n синапсів, з'єднаних із входами мережі (утворюючими фіктивний нульовий шар). Нейрони другого шару зв'язані між собою інгибіторними (негативними зворотними) синаптичними зв'язками. Єдиний синапс із позитивним зворотним зв'язком для кожного нейрона з'єднаний з його ж аксоном.

Ідея роботи мережі складається в перебуванні відстані Хеммінга від образу, що тестується, до всіх зразків. Відстанню Хеммінга називається число що відрізняється від бітів у двох бінарних векторах. Мережа повинна вибрати зразок з мінімальною відстанню Хеммінга до невідомого вхідного сигналу, у результаті чого буде активізований тільки один вихід мережі, що відповідає цьому зразкові.

На стадії ініціалізації ваговим коефіцієнтам першого шару і порогу активаційної функції привласнюються наступні значення:

, i=0...n-1, k=0...m-1, (3.28)

Tk = n / 2, k = 0...m-1. (3.29)

Тут xik - i-ий елемент k-ого зразку.

Вагові коефіцієнти гальмуючих синапсів у другому шарі беруть рівними деякої величини 0 < < 1/m. Синапс нейрона, зв'язаний з його ж аксоном має вагу +1.

Алгоритм функціонування мережі Хеммінга наступний:

1. На входи мережі подається невідомий вектор X = {xi:i=0...n-1}, виходячи з якого розраховуються стани нейронів першого шару (верхній індекс у дужках вказує номер шару):

, j=0...m-1. (3.30)

Після цього отриманими значеннями іниціалізуються значення аксонів другого шару:

yj(2) = yj(1), j = 0...m-1. (3.31)

2. Обчислити нові стани нейронів другого шару:

(3.32)

і значення їх аксонів:

. (3.33)

Активаційна функція f має вигляд порога (рис. 6б), причому величина F повинна бути досить великою, щоб будь-які можливі значення аргументу не призводили до насичення.

3. Перевірити, чи змінилися виходи нейронів другого шару за останню ітерацію. Якщо так - перейти до кроку 2. Інакше - кінець.

З оцінки алгоритму видно, що роль першого шару досить умовна: скориставшись один раз на кроці 1 значеннями його вагових коефіцієнтів, мережа більше не звертається до нього, тому перший шар може бути узагалі виключений з мережі (замінений на матрицю вагових коефіцієнтів).

Збільшення числа і складності розпізнаваємих образів обмежується фактично тільки обсягом ОЗУ. Слід зазначити, що навчання мережі Хеммінга є одним із найпростіших серед інших алгоритмів.

Обговорення мереж, що реалізують асоціативну пам'ять, було б неповним без хоча б короткого згадування про двонаправлену асоціативну пам'ять (ДАП). Вона є логічним розвитком парадигми мережі Хопфилда, до якої для цього досить додати другий шар. Структура ДАП представлена на рис. 8.

Рис. 8 Структурна схема ДАП

Мережа здатна запам'ятовувати пари асоційованих один з одним образів. Нехай пари образів записуються у вигляді векторів Xk = {xіk:і=0...n-1} і Yk = {yjk: j=0...m-1}, k=0...r-1, де r - число пар. Подача на вхід першого шару деякого вектора P = {pі:і=0...n-1} викликає утворення на вході другого шару якогось іншого вектора Q ={qj:j=0...m 1}, що потім знову надходить на вхід першого шару. При кожному такому циклі вектори на виходах обох шарів наближаються до пари зразкових векторів, перший з яких - X - найбільше походить на P, що був поданий на вхід мережі на самому початку, а другий - Y - асоційований з ним. Асоціації між векторами кодуються у ваговій матриці W(1) першого шару. Вагова матриця другого шару W(2) дорівнює транспонованої першої (W(1))T. Процес навчання, також як і у випадку мережі Хопфилда, полягає в попередньому розрахунку елементів матриці W (і відповідно WT) по формулі:

. (3.34)

Ця формула є розгорнутим записом матричного рівняння

(3.35)

для окремого випадку, коли образи записані у вигляді векторів, при цьому добуток двох матриць розміром відповідно [n*1] і [1*m] приводить до (3.34).

У висновку можна зробити наступні узагальнення. Мережі Хопфилда, Хеммінга і ДАП дозволяють просто й ефективно вирішити задачу відтворення образів по неповній і перекрученій інформації. Невисока ємність мереж (число образів, що запам'ятовуються) пов'язана з тим, що, мережі не просто запам'ятовують образи, а дозволяють проводити їх узагальнення, наприклад, за допомогою мережі Хеммінга можлива класифікація за критерієм максимальної правдоподібності. Разом з тим, легкість побудови програмних і апаратних моделей роблять ці мережі привабливими для багатьох застосувань.

4. Мережа Хебба. Алгоритм Хебба навчання нейронних мереж

У главі 3.2 "Алгоритм навчання без вчителя (алгоритм прямого поширення нейронних мереж)" був розглянутий алгоритм Хебба як один з найбільш простих для програмної реалізації і досить ефективний для навчання НМ. Розглянемо його застосування для навчання найпростішої нейронної мережі.

Штучні нейронні мережі, призначені для вирішення різноманітних конкретних задач, можуть містити від декількох нейронів до тисяч і навіть мільйонів елементів. Однак вже окремий нейрон (рис. 1) з біполярною або бінарною функцією активації може бути використаний для вирішення простих задач розпізнавання і класифікації зображень. Вибір біполярного (1, -1) або бінарного (1, 0) представлення сигналів у нейронних мережах здійснюється виходячи з розв'язуваної задачі й у багатьох випадках він рівноцінний. Мається спектр задач, у яких бінарне кодування сигналів більш зручно, однак у більшості випадків біполярне представлення інформації має більше переваг.

Оскільки вихідний сигнал у двійкового нейрона приймає тільки два значення, то нейрон можна використовувати для класифікації запропонованих зображень на два класи.

Нехай є множина М зображень, для яких відома коректна класифікація на два класи X 1 = {X 11, X 12, …, X 1q}, X 2 = {X 21, X 22, …, X },

X 1X 2 = M, X 1X 2 = Ш, та нехай першому класу X1 відповідає вихідний сигнал у = 1, а класу X 2 - сигнал у = -1. Якщо, наприклад, пред'явлено деяке зображення і його зважена сума вхідних сигналів перевищує нульове значення:

тоді вихідний сигнал у = 1 та, відповідно, вхідне зображення X б належить класу X 1. Якщо S 0, тоді у = -1 і зображення належить другому класу.

Можливо використання окремого нейрона і для виділення з множини класів М = {X 1 = {X 11,…, X 1k}, …, X i= {X i1,…, X iq}, …, X p = {Xp1,…, X pm}} зображень єдиного класу X i. В цьому випадку вважають, що один з двох можливих вихідних сигналів нейрону (наприклад, 1) відповідає класу X i, а другий - усім іншим класам. Тому, якщо вхідне зображення Х призводить до появи сигналу у = 1, тоді Х X i, якщо у = -1 (або у = 0, якщо використовується бінарне кодування), то це означає, що пред'явлене зображення не належить класу, що виділяється.

Система розпізнавання на основі єдиного нейрона поділяє увесь простір можливих рішень на дві ділянки за допомогою гіперплощини

x1w1 + x2w2 + … + xnwn+w0 = 0.

Для двовимірних вхідних векторів межею між двома класами зображень є пряма лінія: вхідні вектори, розташовані вище цієї прямої, належать до одного класу, а нижче - до іншого.

Для адаптації, настроювання або навчання ваг зв'язків нейрона скористаємося "правилом Хебба".

Хебб, досліджуючи механізми функціонування центральної нервової системи, припустив, що навчання відбувається шляхом посилення зв'язків між нейронами, активність яких збігається за часом. Хоча в біологічних системах це припущення виконується далеко не завжди і не вичерпує усіх видів навчання, однак при навчанні одношарових нейромереж з біполярними сигналами воно досить ефективно.

Відповідно до правила Хебба, якщо пред'явленому біполярному зображенню X = (x1, ..., xn) відповідає неправильний вихідний сигнал у, тоді ваги wi зв'язків нейрона адаптуються по формулі:

wi (t + 1) = wi (t) + xi у, (4.1)

де wi (t), wi(t + 1) відповідно вага i- ого зв'язку нейрона до и після адаптації; xi () - компоненти вхідного зображення; х0 1 - сигнал зміщення; у - вихідний сигнал нейрона.

У більш повній і строгій формі алгоритм настроювання ваг зв'язків нейрона з використанням правила Хебба виглядає таким чином:

Крок 1. Задається множина M = {(Х 1, t1), …, (X m, tm)} яка складається з пар вхідне зображення Xk =, і необхідний вихідний сигнал нейрона tk, . Ініціюються ваги зв'язків нейрона:

wi = 0, .

Крок 2. Для кожної пари (X k, t k), доки не дотримуються умови зупинки, виконуються кроки 3 - 5.

Крок 3. Ініціюється множина входів нейрона:

x0 = 1, xi = xik, .

Крок 4. Ініціюється вихідний сигнал нейрона: y =t k.

Крок 5. Корегуються ваги зв'язків нейрона по правилу

.

Крок 6. Перевірка умов зупинки.

Для кожного вхідного зображення X k обчислюється відповідний йому вихідний сигнал y k:

де

Якщо вектор (y1, …, ym) обчислених вихідних сигналів дорівнює вектору (t1, …, tm) заданих сигналів нейрона, тобто кожному вхідному зображенню відповідає заданий вихідний сигнал, тоді обчислення припиняються (перехід до кроку 7), якщо ж (y1, …, ym) ? (t1, …, tm), то перехід до кроку 2 алгоритму.

Крок 7. Зупинка.

Покажемо процес навчання нейронної мережі за Правилом Хебба на конкретних прикладах.

Приклад 1. Нехай треба навчити біполярний нейрон розпізнаванню зображень X1, та Х2, наведених на рис. 9.

При цьому зажадаємо, щоб зображенню Х1 відповідав вихідний сигнал нейрона "+1", а зображенню Х2 - сигнал "-1".

X 1

X 2

1

2

3

4

5

6

7

8

9

1

2

3

5

6

7

8

9

Рис. 9. Вхідні зображення

Застосування алгоритму Хебба дає наступні результати:

Крок 1. Задається множина

М = {(Х1 = (1, -1, 1, 1, 1, 1,-1, -1, 1), 1), (Х2 = ( 1, 1, 1, 1, -1, 1, 1, -1, 1 ), -1)};

і ініціюються ваги зв'язків нейрона: wi = 0,

Крок 2. Для кожної з двох пар (Х1, 1), (Х2, -1), виконуються кроки 3 - 5.

Крок 3. Ініціюється множина входів нейрона для зображення першої пари:

х0 = 1, хi = xi1,

Крок 4. Ініціюється вихідний сигнал нейрона для зображення першої пари:

у = t1 = 1.

Крок 5. Корегуються ваги зв'язків нейрона за правилом Хебба

;

;

;

;

.

Крок 3. Ініціюється множина входів нейрона для зображення Х2 другої пари:

х0 = 1, хi = хi2,

Крок 4. Ініціюється вихідний сигнал нейрона для зображення другої пари:

2, t2): у = t2 = -1.

Крок 5. Корегуються ваги зв'язків нейрона:

;

;

;

;

;

;

.

Крок 6. Перевіряються умови зупинки.

Обчислюються вхідні та вихідний сигнали нейрону при пред'явлені зображення X 1:

y1 = 1, тому що S1 > 0.

Обчислюються вхідні та вихідний сигнали нейрону при пред'явлені зображення Х 2

y2 = -1, тому що S2 < 0.

Оскільки вектор (y1, y2) = (1, -1) дорівнює вектору (t1, t2), то обчислення припиняються, тому що мета досягнута - нейрон правильно розпізнає задані зображення.

Крок 7. Зупинка.

Основна ідея правила (4.1) - підсилювання зв'язку, що з'єднує нейрони з однаковою за часом активністю, і послаблення зв'язку, що з'єднує елементи з різною активністю, може бути використана і при настроюванні нейромереж з бінарними елементами. Правило Хебба (4.1) для одношарових бінарних мереж можна записати у вигляді:

wi (t + 1) = wi (t) + wi , (4.2)

де

(4.3)

Приклад 2. Нехай потрібно навчити бінарний нейрон розпізнаванню зображень Х 1 і Х 2 приклада 1. При цьому зображенню Х 1 нехай відповідає вихідний сигнал нейрона "+1", а зображенню Х?2 - “0”. Застосування правила Хебба в цьому випадку дає наступні результати:

Крок 1. Задається множина

М = {( Х 1 = (1, 0, 1, 1, 1, 1, 0, 0, 1), 1), (Х?2 = ( 1, 1, 1, 1, 0, 1, 1, 0, 1 ), 0)},

і ініціюються ваги зв'язків нейрона wi = 0,

Крок 2. Для пар (Х 1,1), (Х 2, 0), виконуються кроки 3 - 5.

Крок 3. Ініціюється множина нейрона елементами зображення Х 1:

Крок 4. Ініціюється вихідний сигнал нейрона для зображення Х1:

у = t1 = 1.

Крок 5. Корегуються ваги зв'язків нейрона за допомогою співвідношень (4.2), (4.3):

;

;

;

;

Крок 3. Ініціюється множина нейрона елементами зображення Х?2:

х0 = 1, хi = хi2,

Крок 4. Ініціюється вихідний сигнал нейрона для зображення Х?2:

y =t 2 = 0

Крок 5. Корегуються ваги зв'язків нейрона за допомогою співвідношень (4.2), (4.3):

;

;

;

;

;

;

.

Крок 6. Перевірка умов зупинки.

Обчислюються вхідні і вихідні сигнали нейрону при пред'явлені зображень Х 1, Х 2:

y1 = 1, тому що S1 > 0.

y2 = -1, тому що S 2 < 0.

Оскільки вектор (y1, y2) = (1, 0) дорівнює заданому вектору (t1, t2) = (1, 0), то мета досягнута та обчислення припиняються.

Крок 7. Зупинка.

Використання групи з m біполярних або бінарних нейронів A1, ..., Am (рис. 10) дозволяє істотно розширити можливості нейронної мережі і розпізнавати до 2m різних зображень. Правда, застосування цієї мережі для розпізнавання 2m (або близьких до 2m чисел) різних зображень може призводити до нерозв'язних проблем адаптації ваг зв'язків нейромережі. Тому часто рекомендують використовувати дану архітектуру для розпізнавання тільки m різних зображень, задаючи кожному з них одиничний вихід тільки на виході одного А-елемента (виходи інших при цьому повинні приймати значення "-1" для біполярних нейронів або "0" - для бінарних).

Одношарова нейронна мережа з двійковими нейронами, приведена на рис. 10, може бути навчена за допомогою алгоритму на основі правила Хебба. У цьому випадку вона називається мережею Хебба. Використання інших алгоритмів навчання цієї ж мережі призводить і до зміни назви нейронної мережі. Використання в назві мереж їхніх алгоритмів навчання характерно для теорії нейронних мереж. Для біполярного представлення сигналів можливе навчання нейромережі за допомогою наступного алгоритму:

Крок 1. Задається множина M = {(Х 1, t1), …, (Х m, t m)}, яка складається з пар вхідне зображення X k = , і необхідний вихідний сигнал нейрона t k, . Ініціюються ваги зв'язків нейрона:

wji = 0, ,

Крок 2. Кожна пара (Х k, t k), перевіряється на правильність реакції нейронної мережі на вхідне зображення. Якщо отриманий вихідний вектор мережі
(, …, ), відрізняється від заданого t1 = (, …, ), то виконують кроки 3-5.

Крок 3. Ініціюється множина входів нейронів: x0 = 1, xj = xjk,

Крок 4. Ініціюються вихідні сигнали нейронів: yi = .

Крок 5. Корегуються ваги зв'язків нейронів по правилу:

.

Крок 6. Перевіряються умови зупинки, тобто правильності функціонування мережі при пред'явлені кожного вхідного зображення. Якщо умови не виконуються, то перехід до кроку 2 алгоритму, інакше - припинення обчислень (перехід до кроку 7).

Крок 7. Зупинка.

Таким чином у даній главі докладно продемонстрований порядок створення і навчання нейронної мережі Хебба на конкретних елементарних прикладах. Показано, що навіть найпростіша мережа, що складається з одного нейрона здатна виконувати корисну роботу по розпізнаванню одного з двох зображень.

5. Області вживання і задачі РОЗВ'ЯЗУВАНІ за допомогою нейронних мереж

У літературі зустрічається значне число ознак, якими повинна володіти задача, щоб застосування НМ було виправдано і НМ могла б її вирішити:

– відсутній алгоритм або не відомі принципи вирішення задачі, але накопичене достатнє число прикладів;

– проблема характеризується великими обсягами вхідної інформації;

– дані неповні або надлишкові, зашумлені, частково суперечливі.

Таким чином, НМ добре підходять для розпізнавання образів і вирішення задач класифікації, оптимізації і прогнозування. Нижче приведений перелік можливих промислових застосувань нейронних мереж, на базі яких або вже створені комерційні продукти, або реалізовані демонстраційні прототипи.

Банки і страхові компанії:

- автоматичне зчитування чеків і фінансових документів;

- перевірка вірогідності підписів;

- оцінка ризику для позик;

- прогнозування змін економічних показників.

Адміністративне обслуговування:

- автоматичне зчитування документів;

- автоматичне розпізнавання штрихових кодів.

Нафтова і хімічна промисловість:

- аналіз геологічної інформації;

- ідентифікація несправностей устаткування;

- розвідка покладів мінералів за даними аерофотознімань;

- аналіз складів домішок;

- керування процесами.

Військова промисловість і аеронавтика:

- обробка звукових сигналів (поділ, ідентифікація, локалізація, усунення шуму, інтерпретація);

- обробка радарних сигналів (розпізнавання цілей, ідентифікація і локалізація джерел);

- обробка інфрачервоних сигналів (локалізація);

- узагальнення інформації;

- автоматичне пілотування.

Промислове виробництво:

- керування маніпуляторами;

- керування якістю;

- керування процесами;

- виявлення несправностей;

- адаптивна робототехніка;

- керування голосом.

Служба безпеки:

- розпізнавання осіб, голосів, відбитків пальців.

Біомедична промисловість:

- аналіз рентгенограм;

- виявлення відхилень у ЕКГ

Телебачення і зв'язок:

- адаптивне керування мережею зв'язку;

- стиск і відновлення зображення.

Представлений перелік далеко не повний. Щомісяця західні засоби масової інформації повідомляють про нові комерційні продукти на базі нейронних мереж. Так, фірма LІAC випускає апаратуру для контролю якості води. Нейросистеми фірми SAІ знаходять пластикові бомби в багажі авіапасажирів. Фахівці інвестиційного банку Cіtіcomp (Лондон) за допомогою програмного нейропакету роблять короткострокові прогнози коливань курсів валют.

6. Сучасні проекти і вироби, засновані на нейронних мережах

Нейронні мережі можуть бути реалізовані двома шляхами: перший це програмна модель НМ, другий - апаратна. На сучасному ринку виробу, засновані на використанні механізму дії НМ, спочатку з'явилися у вигляді нейроплат. Як типовий приклад нейроплати можна назвати плату МВ 86232 японської фірми Fujіtsu. На платі розміщений процесор цифрової обробки сигналів та оперативна пам'ять ємністю 4 Мбайт, що дозволяє використовувати таку плату для реалізації НМ, що містять до тисячі нейронів.

Основними комерційними апаратними виробами на основі НМ є і, імовірно, найближчим часом будуть залишатися нейробіс. Зараз випускаються більш 20 типів нейробісів, параметри яких часом розрізняються на декілька порядків. Серед них - модель ETANN фірми Іntel. Ця БІС, виконана за мікронною технологією, є реалізацією НМ із 64 нейронами і 10240 синапсами. Її ціна 2000 дол. До числа найдешевших нейробис (41 дол.) відноситься модель MD 1220 фірми Mіcro Devіces. Ця БІС реалізує НМ із 8 нейронами і 120 синапсами.

Серед розроблювальних у даний час нейробіс виділяються моделі фірми Adaptіve Solutіons (США) і Hіtachі (Японія). Нейробіс фірми Adaptіve Solutіons, імовірно, стане однією із самих швидкодіючих: оголошена швидкість обробки складає 1,2 млрд. з'єднань / с. (НМ містить 64 нейрона і 262144 синапса). Нейробіс фірми Hіtachі дозволяє реалізувати НМ, що містить до 576 нейронів. Ці нейробіс, безсумнівно, стануть основою нових нейрокомп'ютерів і спеціалізованих багатопроцесорних виробів.

Більшість сьогоднішніх нейрокомп'ютерів являють собою просто персональний комп'ютер або робочу станцію, до складу яких входить додаткова нейроплата. До їхнього числа відносяться, наприклад, комп'ютери серії FMR фірми Fujіtsu. Такі системи мають безперечне право на існування, оскільки їхніх можливостей цілком достатньо для розробки нових алгоритмів і вирішення великого числа прикладних задач методами нейроматематики. Однак найбільший інтерес представляють спеціалізовані нейрокомп'ютери, що безпосередньо реалізують принципи НМ. Типовими представниками таких систем є комп'ютери сімейства Mark фірми TRW (перша реалізація персептрона, розроблена Розенблатом, називалася Mark І). Модель Mark ІІІ фірми TRW являють собою робочу станцію, що містить до 15 процесорів сімейства Motorola 68000 з математичними співпроцесорами. Усі процесори об'єднані шиною VME. Архітектура системи, що підтримує до 65 000 віртуальних процесорних елементів з більш ніж 1 млн. з'єднань, що набудовуються, дозволяє обробляти до 450 тис. міжз'єднань / с. Mark ІV - це однопроцесорний суперкомп'ютер з конвеєрною архітектурою. Він підтримує до 236 тис. віртуальних процесорних елементів, що дозволяє обробляти до 5 млн. міжз'єднань / с. Комп'ютери сімейства Mark мають загальну програмну оболонку ANSE (Artіfіcіal Neural System Envіronment), що забезпечує програмну сумісність моделей. Крім зазначених моделей фірми TRW пропонує також пакет Mark ІІ - програмний эмулятор НМ.

Іншою цікавою моделлю є нейронкомп'ютер NETSІ, створений фірмою Texas Іnstruments на базі розробок Кембріджського університету. Його топологія являє собою тривимірні ґрати стандартних обчислювальних вузлів на базі процесорів 80188. Комп'ютер NETSІ використовується для моделювання таких моделей НМ, як мережа Хопфилда - Кохонена і НМ зі зворотнім поширенням. Його продуктивність досягає 450 млн. міжз'єднань / с.

Фірма Computer Recognіtііon Systems (CRS) продає серію нейрокомп'ютерів WІZARD/CRS 1000, призначених для обробки відеозображень. Розмір вхідного зображення 512 x 512 пікселей. Модель CRS 1000 вже знайшла застосування в промислових системах автоматичного контролю.

Сьогодні на ринку представлено багато моделей нейрокомп'ютерів. Насправді їх, очевидно, набагато більше, але найбільш могутні і перспективні моделі як і раніше створюються за замовленнями військових. Нажаль, не маючи достатньої інформації про моделі спеціального призначення, важко скласти уявлення про істинні можливості сучасних комп'ютерів.

{Програмна реалізація нейронної мережі Хебба}

unit rou_main;

interface

uses

Windows, Messages, SysUtils, Variants, Classes,

Graphics, Controls, Forms,Dialogs, ExtCtrls,

StdCtrls, Grids, Buttons;

const

yes='y'; //Стан активності/не активності

no='n'; //комірки елемента TStringGrid

str=10; //Розміри нейрону

stol=10;

type

{Користувацькі типи даних}

one_element= array [0..str*stol+4] of integer; //Опис нейрона

W_type= array [0..3,0..str*stol] of integer; //Опис нейронної мережі

S_type=array [0..3] of integer; //Масив сумарних

//вихідних результатів

TForm1 = class(TForm)

{Опис елементів форми}

Panel1: TPanel;

s1: TStringGrid; //Поле першого нейрону

l1: TLabel;

Bevel1: TBevel;

Memo1: TMemo; //Інформаційне поле

Label2: TLabel;

s2: TStringGrid; //Поле другого нейрону

l2: TLabel;

s3: TStringGrid; //Поле третього нейрону

l3: TLabel;

s4: TStringGrid; //Поле четвертого нейрону

l4: TLabel;

s5: TStringGrid; //Поле для символів, що розпізнаються

Label6: TLabel;

BitBtn1: TBitBtn; //Кнопка "Teaching"

BitBtn2: TBitBtn; //Кнопка "Find"

BitBtn3: TBitBtn; //Кнопка "Exit"

BitBtn14: TBitBtn; //Кнопка "Clean"

BitBtn8: TBitBtn; //Кнопка "Clean"

BitBtn11: TBitBtn; //Кнопка "Clean"

BitBtn15: TBitBtn; //Кнопка "Clean"

BitBtn18: TBitBtn; //Кнопка "Clean"

BitBtn4: TBitBtn; //Кнопка "Load"

BitBtn5: TBitBtn; //Кнопка "Save"

{Процедури і функції основної форми}

procedure s1DrawCell(Sender: TObject; ACol, ARow: Integer;

Rect: TRect; State: TGridDrawState);

procedure FormCreate(Sender: TObject);

procedure s1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure BitBtn1Click(Sender: TObject);

procedure Initialization_M;

procedure Vivod_W (W:W_type);

procedure BitBtn2Click(Sender: TObject);

procedure BitBtn4Click(Sender: TObject);

procedure BitBtn5Click(Sender: TObject);

procedure BitBtn14Click(Sender: TObject);

procedure BitBtn8Click(Sender: TObject);

procedure BitBtn11Click(Sender: TObject);

procedure BitBtn15Click(Sender: TObject);

procedure BitBtn18Click(Sender: TObject);

end;

{Допоміжні процедури і функції}

procedure Raschet_b1;

function convert (s: string): integer;

procedure Read_str_grd (str_grd:TStringGrid;var M:one_element);

function Check_result (num_letter,num_nero:integer):boolean;

procedure Obuchenie(num_letter,num_nero:byte);

function Check_Learning :boolean;

procedure checkFillM5(Y:integer);

procedure clear_stringgrid (Sender:Tobject);

function mask_el: W_type;

procedure re_mask_el(mask_elem: W_type);

{Основні змінні}

var

Form1 :TForm1; //Змінна форми

M :array [0..4] of one_element; //Масив, що описує нейрони мережі

W :W_type; //Опис нейронної мережі

prizn :boolean;

S :S_type;

i :integer;

f :file of W_type; //Змінна файлу для збереження

//стану нейронної мережі

implementation

{$R *.dfm}

{Процедура малювання форми}

procedure TForm1.s1DrawCell(Sender: TObject; ACol, ARow: Integer;

Rect: TRect; State: TGridDrawState);

begin

(sender as tstringgrid).canvas.Brush.Color:=$a08000;

if (sender as tstringgrid).Cells[Acol,Arow]=yes then

(sender as tstringgrid).canvas.FillRect(Rect)

else begin

(sender as tstringgrid).canvas.Brush.Color:=clCream;

(sender as tstringgrid).canvas.FillRect(Rect)

end;

end;

{Процедура створення форми}

procedure TForm1.FormCreate(Sender: TObject);

begin

prizn:=false;

clear_stringgrid (s1); //Очищення поля нейрону 1

clear_stringgrid (s2); //Очищення поля нейрону 2

clear_stringgrid (s3); //Очищення поля нейрону 3

clear_stringgrid (s4); //Очищення поля нейрону 4

clear_stringgrid (s5); //Очищення поля нейрону 5

end;

{Процедура активації комірки нейрону}

procedure TForm1.s1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

if (sender as tstringgrid).Cells[(sender as tstringgrid).Col,(sender as tstringgrid).Row]=yes then

(sender as tstringgrid).Cells[(sender as tstringgrid).Col,(sender as tstringgrid).Row]:=no

else (sender as tstringgrid).Cells[(sender as tstringgrid).Col,(sender as tstringgrid).Row]:=yes;

end;

{Процедура навчання нейронної мережі}

procedure TForm1.BitBtn1Click(Sender: TObject);

var i,j:integer;

begin

Memo1.Clear; //Очищення інформаційного поля

Initialization_M; //Ініціалізація масиву W для навчання

Memo1.Lines.Add('Initialization of the weight ratio of neuron connections');

Vivod_W (W); //Вивід масиву W

Raschet_b1; //Розрахунок важелів зв'язків нейронів

//для першого нейрону

Memo1.Lines.Add('Calculation the firs simbol:');

Vivod_W (W); //Вивід масиву W

{Навчання першого нейрону}

Check_result (0,0);

Check_result (0,1);

Check_result (0,2);

Check_result (0,3);

{Навчання інших нейронів}

for i:=1 to 3 do

for j:= 0 to 3 do

begin

while not Check_result (i,j) do

Obuchenie (i,j); //Навчання нейрону доки не отримано

//жаданий результат

end;

Memo1.Lines.Add('Result weight ratio ');

Vivod_W (W); //Вивід масиву W

if Check_Learning then Memo1.Lines.Add('Teaching is successful.')

else Memo1.Lines.Add('Teaching is impossible.');

BitBtn1.Enabled:=false; //Кнопка "Teaching" неактивна

BitBtn2.enabled:=true; //Кнопка "Find" активна

BitBtn5.enabled:=true; //Кнопка "Save" активна

end;

{Функція інтерпретації активності комірки нейрона}

function convert (s: string): integer;

begin

if s=yes then Result:=1

else Result:=-1;

end;

{Функція початкової ініціалізації масиву W}

procedure TForm1.Initialization_M;

var

str1 :string;

j,i :byte;

begin

{Зчитуємо зображення навчальних символів}

Read_str_grd (s1,M[0]);

Read_str_grd (s2,M[1]);

Read_str_grd (s3,M[2]);

Read_str_grd (s4,M[3]);

M[0,str*stol+1]:=1;

M[1,str*stol+2]:=1;

M[2,str*stol+3]:=1;

M[3,str*stol+4]:=1;

Memo1.Lines.Add('Giving of the set M:');

{Вивід на екран зчитаних даних}

for j:= 0 to length (M)-2 do

begin

for i:= 0 to length(M[j])-1 do str1:=str1+' '+inttostr(m[j,i]);

Memo1.Lines.Add(str1);

str1:='';

end;

end;

{Конвертація зображення на нейроні в числові дані}

procedure Read_str_grd (str_grd:TStringGrid;var M:one_element);

var i,j:integer;

begin

for i:=0 to str-1 do

for j:=0 to stol-1 do

M[i*stol+j+1]:=convert(str_grd.Cells[j,i]); //Інтерпретація значення

//комірок нейрона

M[0]:=1;

for i:= str*stol+1 to str*stol+4 do

M[i]:=-1;

end;

{Процедура виводу на екран вмісту масиву W}

procedure TForm1.Vivod_W (W:W_type);

var

i,j :byte;

str :string;

begin

for j:=0 to length (W)-1 do

begin

Form1.Memo1.Lines.Add('W'+inttostr(j+1)+':');

for i:=0 to length (W[j])-1 do str:=str+ ' '+inttostr (W[j,i]);

Form1.Memo1.Lines.Add(str);

str:='';

end;

end;

{Процедура розрахунку важелів зв'язків нейронів для першого нейрону}

procedure Raschet_b1;

var

i,j:byte;

begin

for j:=0 to length(W)-1 do

begin

for i:=0 to str*stol do

W[j,i]:=W[j,i]+M[0,i]*M[0,str*stol+J+1];

end;

end;

{Функція визначення правильності навчання}

function Check_result (num_letter,num_nero:integer):boolean;

var

i :integer;

stroke :string;

begin

s[num_nero]:=0;

for i:=0 to str*stol do

begin

s[num_nero]:=s[num_nero]+W[num_nero,i]*M[num_letter,i];

end;

stroka:='Sending the char '+inttostr(num_letter+1)+' to the

'+inttostr(num_nero+1)+' neuron';

Form1.Memo1.Lines.Add(stroka);

Form1.Memo1.Lines.Add('S'+inttostr(num_nero+1)+'='+inttostr(s[num_nero]));

if s[num_nero]<=0 then s[num_nero]:=-1

else s[num_nero]:=1;

if s[num_nero]= M[num_letter,str*stol+num_nero+1] then Result:=true

else begin

Result:=false;

Form1.Memo1.Lines.Add ('Incorrect result. Reteaching.');

end;

end;

{Процедура навчання нейрона}

procedure Obuchenie(num_letter,num_nero:byte);

var

p: integer;

begin

for p:=0 to str*stol do

W[num_nero,p]:=W[num_nero,p]+

M[num_letter,p]*M[num_letter,str*stol+num_nero+1];

end;

{Функція визначення правильності навчання нейронної мережі}

function Check_Learning :boolean;

var

res :array[0..3] of boolean;

s :array[0..3] of integer;

i,j,max,Y :integer;

s1 :string;

begin

{Подання на вхід мережі навчальних символів

і перевірка вірності реакції мережі на них}

for y:=0 to 3 do

begin

res[Y]:=false;

checkFillM5(Y);

for j:=0 to 3 do

begin

s[j]:=0;

for i:=0 to str*stol do

begin

s[j]:=s[j]+W[j,i]*M[4,i];

end;

end;

s1:='Identification of the Char ';

max:=s[0];

for i:=1 to 3 do

begin

s1:='S= '+inttostr(s[i]);

if s[i]>max then

begin

max:=s[i];

end;

end;

if max>0 then res[Y]:=true;

end;

result:=true;

{Перевірка чи на всі навчальні зображення мережа реагує вірно}

for i:=0 to 3 do

if not res[i] then

begin

result:=false;

break;

end;

end;

{Процедура вибору символа}

procedure checkFillM5(Y:integer);

var

i: integer;

begin

for i:=1 to str*stol do M[4,i]:=M[y,i]

end;

{Процедура визначення символу відповідно до навчальних зображень}

procedure TForm1.BitBtn2Click(Sender: TObject);

var

s: array [0..3] of integer;

i,j,k: byte;

max: integer;

strng: string;

begin

Memo1.Lines.Add('Identification of the Char ');

l1.Color:=clSilver;

l2.Color:=clSilver;

l3.Color:=clSilver;

l4.Color:=clSilver;

Read_str_grd (s5,M[4]); //Зчитуємо зображення символу

for j:=0 to 3 do

begin

s[j]:=0;

for i:=0 to str*stol do

begin

s[j]:=s[j]+W[j,i]*M[4,i]; //Подання символу на нейрони і

//визначення результуючих сум

end;

end;

max:=s[0];

k:=0;

for i:=0 to 3 do

begin

strng:=strng+'S'+inttostr(i+1)+'='+inttostr(s[i])+' ';

if s[i]>max then

begin

max:=s[i]; //Визначення максимальної суми

k:=i; //Визначення індексу вірного зображення

end;

end;

Memo1.Lines.Add(strng);

Memo1.Lines.Add('The char '+inttostr (K+1)+' has been identified.');

case (k+1) of //Позначення червоним кольором

//символу, що визначений як вірний

1:l1.Color:=clRed;

2:l2.Color:=clRed;

3:l3.Color:=clRed;

4:l4.Color:=clRed;

end;

BitBtn1.Enabled:=true; //Кнопка "Teaching" активна

end;

{Функція отримання маски навчальних символів}

function mask_el: W_type;

var

i,j :integer;

mask_elem :W_type;

begin

for i:=0 to str-1 do

for j:=0 to stol-1 do

begin

{Конвертація зображень навчальних символів у числові значення}

mask_elem[0,i*stol+j]:=convert(Form1.s1.Cells[j,i]);

mask_elem[1,i*stol+j]:=convert(Form1.s2.Cells[j,i]);

mask_elem[2,i*stol+j]:=convert(Form1.s3.Cells[j,i]);

mask_elem[3,i*stol+j]:=convert(Form1.s4.Cells[j,i]);

end;

Result:=mask_elem;

end;

{Процедура збереження в файлі "symbol.rou" стану нейронної мережі}

procedure TForm1.BitBtn5Click(Sender: TObject);

var

W1 :W_type;

begin

w1:=mask_el;

AssignFile(f, 'symbol.rou');

Rewrite(f); //Відкриття файлу для запису даних

write(f,W); //Запис стану нейронної мережі

write(f,W1); //Запис зображення навчальних символів

CloseFile(f);

Form1.Memo1.Lines.Add('Teaching Configuration data has been saved'+

' in data file symbol.rou');

MessageDlg('Teaching Configuration data has been saved'+

' in data file symbol.rou', mtInformation, [mbOk], 0);

BitBtn4.enabled:=true; //Кнопка "Load" активна

end;

{Процедура активації нейронів мережі згідно із зображенням}

procedure re_mask_el(mask_elem: W_type);

var

i,j :integer;

begin

{Очищення нейронів}

clear_stringgrid(Form1.s1);

clear_stringgrid(Form1.s2);

clear_stringgrid(Form1.s3);

clear_stringgrid(Form1.s4);

for i:=0 to str-1 do

for j:=0 to stol-1 do

begin

{Запис нового зображення в нейрони}

if mask_elem[0,i*stol+j]=1 then Form1.s1.Cells[j,i]:=yes;

if mask_elem[1,i*stol+j]=1 then Form1.s2.Cells[j,i]:=yes;

if mask_elem[2,i*stol+j]=1 then Form1.s3.Cells[j,i]:=yes;

if mask_elem[3,i*stol+j]=1 then Form1.s4.Cells[j,i]:=yes;

end;

end;

{Процедура завантаження стану нейронної мережі із файлу "symbol.rou"}

procedure TForm1.BitBtn4Click(Sender: TObject);

var

W1 :W_type;

begin

AssignFile(f, 'symbol.rou');

FileMode := 0; //Режим читання

{$I-}

Reset(f); //Відкриття файлу для читання

{$I+}

if IOResult = 0 then //Файл знайдено

begin

MessageDlg('Data from data file symbol.rou has been just loaded',

mtInformation, [mbOk], 0);

read(f,w); //Читання стану нейронної мережі

read(f,W1); //Читання зображень навчальних символів

re_mask_el(W1); //Активація нейронів, згідно із

//зображенням навчальних символів

CloseFile(f);

end

else //Файл не знайдено

begin

MessageDlg('File access error: Data File symbol.rou is epcent',

mtWarning, [mbOk], 0);

Memo1.Lines.Add('Data File symbol.rou is epcent');

end;

Form1.BitBtn2.Enabled:=true; //Кнопка "Find" активна

end;

{Процедура очищення поля нейрона}

procedure clear_stringgrid (Sender:Tobject);

var

i,j :byte;

begin

for i:=0 to (sender as TStringGrid).ColCount-1 do

for j:=0 to (sender as TStringGrid).RowCount-1 do

(sender as TStringGrid).Cells[i,j]:=no;

end;

{Очищення нейрону 1}

procedure TForm1.BitBtn14Click(Sender: TObject);

begin

clear_stringgrid (s1);

end;

{Очищення нейрону 2}

procedure TForm1.BitBtn8Click(Sender: TObject);

begin

clear_stringgrid (s2);

end;

{Очищення нейрону 3}

procedure TForm1.BitBtn11Click(Sender: TObject);

begin

clear_stringgrid (s3);

end;

{Очищення нейрону 4}

procedure TForm1.BitBtn15Click(Sender: TObject);

begin

clear_stringgrid (s4);

end;

{Очищення поля символу, що розпізнається}

procedure TForm1.BitBtn18Click(Sender: TObject);

begin

clear_stringgrid (s5);

end;

end.


Подобные документы

  • Характеристика особливостей побудови біологічних та штучних нейронних мереж. Вивчення їх активіаційних функцій: порогової бінарної, лінійної обмеженої, гіперболічного тангенса. Персептрони і зародження штучних нейромереж. Багатошарові нейронні мережі.

    реферат [1,2 M], добавлен 11.06.2010

  • Незалежно компільований програмний модуль. Програми: "Облік програмного забезпечення" та "Інвентаризація програмного забезпечення на комп'ютерах мережі". Вимоги до функціональних характеристик основної частини системи. Вимоги до програмної документації.

    курсовая работа [660,9 K], добавлен 14.12.2010

  • Підстави для розробки програмного продукту для складання розкладу факультету вузу з використанням генетичних алгоритмів. Призначення розробленої програми, вимоги до функціональних характеристик, до програмної документації, техніко-економічні показники.

    курсовая работа [25,1 K], добавлен 12.04.2010

  • Вибір та обґрунтування компонентів мережі, клієнтської частини, комунікаційного обладнання та прикладного програмного забезпечення. Опис фізичної та логічної структури мережі. Принципова схема топології мережі та cхема логічної структури мережі.

    курсовая работа [487,4 K], добавлен 16.02.2015

  • Специфіка застосування нейронних мереж. Огляд програмних засобів, що використовують нейронні мережі. Побудова загальної моделі згорткової нейронної мережі. Реалізація нейромережного модулю розпізнавання символів на прикладі номерних знаків автомобілів.

    дипломная работа [3,4 M], добавлен 15.03.2022

  • Область застоcування програми - складання розкладу для факультетів вищих навчальних закладів України. Опис функціонування програми. Генетичні алгоритми, опис вибору технічних і програмних засобів. Розрахунок ефективності впровадження програмного продукту.

    курсовая работа [58,0 K], добавлен 12.04.2010

  • Поняття локальних обчислювальних мереж. Опис об’єкту та план будівлі. Побудова функціональної схеми. Вибір обладнання. Моделювання комп’ютерної мережі в Packet Tracer. Вибір програмного забезпечення і забезпечення його роботи; налаштування сервера.

    курсовая работа [5,1 M], добавлен 04.10.2014

  • Основи криптосистем та їх використання. Шифрування методом гамування, його зміст, прийоми та етапи реалізації. Вимоги до програмного продукту, його структура та принципи роботи, схеми алгоритму, вимоги до функціональних можливостей. Лістинг програми.

    курсовая работа [245,5 K], добавлен 25.08.2014

  • Основні завдання синоптичної метеорології. Призначення та область застосування програмного продукту "Статистика метеоспостережень", функціональні вимоги до нього. Інформаційне забезпечення, структура, опис інтерфейсу. Тестування програмного продукту.

    курсовая работа [3,6 M], добавлен 30.04.2016

  • Дослідження та аналіз об’єкту програмування. Основні архітектурні риси JavaScript. Переваги CSS розмітки. Структура HTML-документа. Вимоги до апаратного та програмного забезпечення. Опис програми та її алгоритмів. Оцінка вартості програмного продукту.

    дипломная работа [1,0 M], добавлен 01.09.2016

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.