Остаточний посібник з періодичних нейронних мереж на Python

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

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

Інтуїція періодичних нейронних мереж

Повторювані нейронні мережі є прикладом ширшого поля нейронних мереж. Інші приклади включають:

  • Штучні нейронні мережі
  • Свертові нейронні мережі

Ця стаття буде зосереджена на періодичних нейронних мережах.

Цей підручник розпочне наше обговорення рекуррентних нейронних мереж з обговорення інтуїції рекурентних нейронних мереж.

Типи задач, що вирішуються періодичними нейронними мережами

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

  • Штучні нейронні мережі: проблеми класифікації та регресії
  • Свертові нейронні мережі: проблеми комп'ютерного зору

У випадку рекурентних нейронних мереж вони, як правило, використовуються для вирішення задач аналізу часових рядів.

Кожен із цих трьох типів нейронних мереж (штучна, згорткова та періодична) використовується для вирішення контрольованих задач машинного навчання.

Зіставлення нейронних мереж з частинами мозку людини

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

Три основні частини мозку:

  • Великий мозок
  • Стовбур мозку
  • Мозочок

Можливо, найважливішою частиною мозку є головний мозок. Він містить чотири частки:

  • Лобова частка
  • Тім'яна частка
  • Скронева частка
  • Потилична частка

Головне нововведення, яке містять нейронні мережі, - ідея ваг.

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

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

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

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

Як уже згадувалося, рекуррентні нейронні мережі використовуються для вирішення проблем часових рядів. Вони можуть вчитися на подіях, які відбулися за останні попередні ітерації їх етапу навчання. Таким чином, їх часто порівнюють з лобовою часткою мозку - яка живить нашу короткочасну пам’ять.

Підводячи підсумок, дослідники часто поєднують кожну з трьох нервових мереж із наступними відділами мозку:

  • Штучні нейронні мережі: скронева частка
  • Свертові нейронні мережі: потилична частка
  • Нейронні мережі, що повторюються: лобова частка

Склад періодичної нейронної мережі

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

Основна нейронна мережа

Перша модифікація, яку потрібно внести до цієї нейронної мережі, полягає в тому, що кожен шар мережі повинен бути зім'ятий разом, як це:

Здавлена ​​нейронна мережа

Потім потрібно зробити ще три модифікації:

  • Синапси нейронів нейронної мережі потрібно спростити до однієї лінії
  • Всю нейронну мережу потрібно повернути на 90 градусів
  • Навколо прихованого шару нейронної мережі потрібно створити петлю

Тепер нейронна мережа матиме такий вигляд:

Повторна нейронна мережа

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

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

Часовий ряд рекурентної нейронної мережі

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

Короткий зміст - Інтуїція періодичних нейронних мереж

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

Ось короткий підсумок того, що ми обговорювали в цьому посібнику:

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

Проблема зникаючого градієнта в періодичних нейронних мережах

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

Через це розуміння проблеми зникаючого градієнта важливо перед тим, як будувати свій перший RNN.

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

У чому полягає проблема зникаючого градієнта?

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

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

Тепер давайте детально розберемо проблему зникаючого градієнта. Як випливає з назви, проблема зникнення градієнта пов'язана з алгоритмами глибокого вивчення градієнтного спуску. Нагадаємо, що алгоритм градієнтного спуску виглядає приблизно так:

Остаточний алгоритм градієнтного спуску

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

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

Повторний алгоритм градієнтного спуску нейронної мережі

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

Повторний алгоритм градієнтного спуску нейронної мережі

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

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

Фактичний коефіцієнт, який множиться через періодичну нейронну мережу в алгоритмі зворотного розповсюдження, називається математичною змінною Wrec. Це ставить дві проблеми:

  • Коли Wrecвін малий, у вас виникає проблема зникнення градієнта
  • Коли Wrecвелике, ви відчуваєте проблему градієнта, що вибухає

Зауважимо, що обидві ці проблеми, як правило, називаються більш простою назвою “проблема зникаючого градієнта”.

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

Як вирішити проблему зникаючого градієнта

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

Вирішення градієнтної проблеми, що вибухає

Для вибухових градієнтів можна використовувати модифіковану версію алгоритму зворотного розповсюдження, що називається truncated backpropagation. Зрізаний алгоритм зворотного розповсюдження обмежує таку кількість кроків, на якому буде виконуватися зворотне розподіл, зупиняючи алгоритм до виникнення проблеми вибуху градієнта.

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

Нарешті, ви можете ввести gradient clipping, що вводить штучну стелю, яка обмежує, наскільки великий градієнт може стати в алгоритмі зворотного розповсюдження.

Вирішення проблеми зникаючого градієнта

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

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

Найважливішим рішенням проблеми зникаючого градієнта є специфічний тип нейронної мережі, який називається Long Short-Term Memory Networks (LSTM), піонером якого стали Зепп Хохрейтер та Юрген Шмідхубер. Нагадаємо, що пан Хохрейтер був вченим, який спочатку виявив проблему зникаючого градієнта.

LSTM використовуються у проблемах, пов’язаних головним чином з розпізнаванням мови, причому одним із найпомітніших прикладів є Google, який використовував LSTM для розпізнавання мови в 2015 році та зазнав зменшення помилок транскрипції на 49%.

LSTM вважаються нейронною мережею для вчених, зацікавлених у впровадженні повторюваних нейронних мереж. Протягом решти цього курсу ми в основному зосередимось на LSTM.

Короткий зміст - проблема зникаючого градієнта

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

Ось короткий підсумок того, що ми обговорювали:

  • Саме Сепп Хохрейтер був першим ученим, який відкрив проблему зникаючого градієнта в періодичних нейронних мережах
  • Що передбачає проблема зникаючого градієнта (та її двоюрідного брата - проблема вибухового градієнта)
  • Роль Wrecу зникненні задач градієнта та проблемах градієнта, що вибухають
  • Як вирішуються проблеми з градієнтом, що зникають, і задачі, що вибухають
  • Роль LSTM як найпоширенішого рішення проблеми зникаючого градієнта

Довгострокові мережі короткострокової пам'яті (LSTM)

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

Вони відрізняються від “звичайних” періодичних нейронних мереж важливими способами.

Цей підручник познайомить вас із LSTM. Пізніше в цьому курсі ми створимо та навчимо LSTM з нуля.

Зміст

Ви можете перейти до певного розділу цього підручника з LSTM, використовуючи зміст нижче:

  • Історія LSTM
  • Як LSTM вирішують проблему градієнта, що зникає
  • Як працюють LSTM
  • Варіації архітектур LSTM
  • Варіація глазок
  • Варіація зчеплених воріт
  • Інші варіації LSTM
  • Заключні думки

Історія LSTM

Як ми вже згадували в останньому розділі, двома найважливішими фігурами в галузі LSTM є Зепп Хохрейтер та Юрген Шмідхубер.

Останній був першим науковим керівником Технічного університету Мюнхена, Німеччина.

Кандидатська дисертація Хохрейтера вперше представила світу LSTM.

Як LSTM вирішують проблему градієнта, що зникає

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

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

То як працюють LSTM? Вони просто змінюють значення Wrec.

З нашого пояснення проблеми зникаючого градієнта ви дізналися, що:

  • Коли Wrecвін малий, у вас виникає проблема зникнення градієнта
  • Коли Wrecвелике, ви відчуваєте проблему градієнта, що вибухає

Насправді ми можемо бути набагато конкретнішими:

  • Коли у Wrec < 1вас виникає проблема зникнення градієнта
  • Коли Wrec > 1виникає проблема вибуху градієнта

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

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

Щоб вирішити цю проблему, встановлено LSTM Wrec = 1. У LSTMS, звичайно, є більше, ніж налаштування Wrec = 1, але це, безумовно, найважливіша зміна, яку вносить ця специфікація періодичних нейронних мереж.

Як працюють LSTM

У цьому розділі буде пояснено, як працюють LSTM. Перш ніж продовжувати, варто згадати, що я буду використовувати зображення із допису Крістофера Олаха «Розуміння LSTM», який був опублікований у серпні 2015 року та містить одні з найкращих візуалізацій LSTM, які я коли-небудь бачив.

Для початку розглянемо базову версію періодичної нейронної мережі:

Основна рекурентна нейронна мережа

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

Навпаки, ось як виглядає LSTM:

LSTM

Як бачите, LSTM має набагато більшу складність, ніж звичайна рекурентна нейронна мережа. Моя мета - дозволити вам повністю зрозуміти це зображення до моменту, коли ви закінчите цей підручник.

По-перше, давайте розберемося з позначеннями, використаними на зображенні вище:

Позначення, які ми будемо використовувати в нашому посібнику з LSTM

Тепер, коли ви маєте уявлення про позначення, які ми будемо використовувати в цьому підручнику з LSTM, ми можемо розпочати вивчення функціональності шару в нейронній мережі LSTM. Кожен шар має такий вигляд:

Вузол з нейронної мережі LSTM

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

Перше, що відбувається в рамках LSTM, це функція активації forget gate layer. Він розглядає входи шару (позначені xtдля спостереження та htвихід попереднього шару нейронної мережі) і виводить 1або 0для кожного числа в стані комірки з попереднього шару (позначеного Ct-1).

Ось візуалізація активації forget gate layer:

Вузол з нейронної мережі LSTM

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

Стан комірки в мережах LSTM

Метою стану клітини є вирішення, яку інформацію переносити з різних спостережень, на яких навчається повторювана нейронна мережа. Рішення про те чи ні , щоб нести інформацію вперед зроблений gates- з яких forget gateє яскравим прикладом. Кожен шлюз у LSTM матиме такий вигляд:

Стан комірки в мережах LSTM

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

За визначенням, функція Sigmoid може виводити лише числа між 0і 1. Через це його часто використовують для обчислення ймовірностей. У випадку моделей LSTM він визначає, яка частка кожного випуску повинна мати вплив на стан продажу.

Наступні два етапи моделі LSTM тісно пов'язані: input gate layerі tanh layer. Ці шари працюють разом, щоб визначити, як оновити стан комірки. Одночасно завершується останній крок, який дозволяє клітинці визначити, що забути про останнє спостереження в наборі даних.

Ось візуалізація цього процесу:

Вузол з нейронної мережі LSTM

Останній крок LSTM визначає результат для цього спостереження (позначений ht). Цей крок проходить як через сигмоподібну функцію, так і через гіперболічну функцію тангенса. Його можна візуалізувати наступним чином:

Вузол з нейронної мережі LSTM

На цьому процес підготовки одного рівня моделі LSTM завершується. Як ви можете собі уявити, під поверхнею є багато математики, яку ми затьмарили. Суть цього розділу полягає в тому, щоб широко пояснити, як працюють LSTM, а не в тому, щоб ви глибоко розуміли кожну операцію в процесі.

Варіації архітектур LSTM

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

Як швидкий підсумок, ось як виглядає узагальнений вузол LSTM:

Вузол з нейронної мережі LSTM

Варіація глазок

Мабуть, найважливішим варіантом архітектури LSTM є peepholeваріант, який дозволяє шарам шлюзу читати дані із стану комірки.

Ось візуалізація того, як може виглядати варіант глазниці:

Вузол з віконної нейронної мережі LSTM

Зауважте, що, хоча ця діаграма додає віконце до кожного затвору в періодичній нейронній мережі, ви також можете додати вікна до одних, а не до інших воріт.

Варіація зчеплених воріт

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

Ось візуалізація того, як виглядає ця архітектура:

Вузол з нейронної мережі LSTM зв'язаних воріт

Інші варіації LSTM

Це лише два приклади варіантів архітектури LSTM. Їх набагато більше. Нижче наведено кілька:

  • Закриті рекурентні одиниці (GRU)
  • Глибинні керовані RNN
  • Заводні RNN

Короткий зміст - Мережі довгострокової пам'яті

У цьому підручнику ви вперше познайомилися з мережами довгострокової пам’яті (LSTM).

Ось короткий підсумок того, що ви дізналися:

  • (Дуже) коротка історія LSTM та роль, яку Сепп Хохрейтер та Юрген Шмідхубер відіграли у їх розвитку
  • Як LSTM вирішують проблему зникаючого градієнта
  • Як працюють LSTM
  • Роль воріт, сигмоподібних функцій та функції гіперболічної дотичної в LSTM
  • Кілька найпопулярніших варіантів архітектури LSTM

Як побудувати та навчити повторювану нейронну мережу

Наразі в нашому обговоренні періодичних нейронних мереж ви дізналися:

  • Основна інтуїція рекуррентних нейронних мереж
  • Проблема зникаючого градієнта, яка історично перешкоджала прогресу рекуррентних нейронних мереж
  • Наскільки довгострокові мережі короткострокової пам’яті (LSTM) допомагають вирішити проблему зникаючого градієнта

Настав час побудувати свою першу повторювану нейронну мережу! Більш конкретно, цей посібник навчить вас, як створити та навчити LSTM прогнозувати ціну акцій Facebook (FB).

Зміст

Ви можете перейти до певного розділу цього підручника з періодичних нейронних мереж Python, використовуючи зміст нижче:

  • Завантаження набору даних для цього підручника
  • Імпорт бібліотек, які вам знадобляться для цього підручника
  • Імпорт нашого навчального набору у сценарій Python
  • Застосування масштабування функцій до нашого набору даних
  • Визначення кількості кроків для нашої періодичної нейронної мережі
  • Доопрацювання наших наборів даних шляхом їх трансформації в масиви NumPy
  • Імпорт наших бібліотек TensorFlow
  • Побудова нашої періодичної нейронної мережі
  • Додавання нашого першого шару LSTM
  • Додавання певної регуляризації відсіву
  • Додавання ще трьох шарів LSTM з регуляризацією випадіння
  • Додавання вихідного рівня до нашої періодичної нейронної мережі
  • Компіляція нашої періодичної нейронної мережі
  • Встановлення періодичної нейронної мережі на навчальному наборі
  • Створення прогнозів за допомогою нашої періодичної нейронної мережі
  • Імпорт наших тестових даних
  • Створення набору тестових даних, необхідних для прогнозування
  • Масштабування даних тесту
  • Групування даних тесту
  • Фактично робити прогнози
  • Повний код цього підручника
  • Заключні думки

Завантаження набору даних для цього підручника

Щоб продовжити цей посібник, вам потрібно буде завантажити два набори даних:

  • Набір навчальних даних, що містить інформацію про ціну акцій Facebook з початку 2015 року до кінця 2019 року
  • Набір тестових даних, який містить інформацію про ціну акцій Facebook протягом першого місяця 2020 року

Наша періодична нейронна мережа пройде навчання за даними 2015-2019 рр. І буде використана для прогнозування даних із січня 2020 р.

Ви можете завантажити дані про навчання та тестування за посиланнями нижче:

  • Дані навчання
  • Дані тесту

Кожен із цих наборів даних - це просто експорт з Yahoo! Фінанси. Вони виглядають так (при відкритті в Microsoft Excel):

Приклад набору даних, який ми будемо використовувати для навчання нашої періодичної нейронної мережі

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

Імпорт бібліотек, які вам знадобляться для цього підручника

Цей підручник залежатиме від ряду бібліотек Python з відкритим кодом, включаючи NumPy, pandas та matplotlib.

Почнемо наш сценарій Python, імпортуючи деякі з цих бібліотек:

 import numpy as np import pandas as pd import matplotlib.pyplot as plt 

Імпорт нашого навчального набору у сценарій Python

Наступним завданням, яке потрібно виконати, є імпорт нашого набору даних у скрипт Python.

Спочатку ми імпортуємо набір даних як pandas DataFrame, використовуючи read_csvметод. Однак, оскільки kerasмодуль TensorFlowприймає лише масиви NumPy як параметри, структуру даних потрібно буде трансформувати після імпорту.

Почнемо з імпортування всього .csvфайлу як DataFrame:

 training_data = pd.read_csv('FB_training_data.csv') 

Ви помітите, розглядаючи DataFrame, що він містить безліч різних способів вимірювання ціни акцій Facebook, включаючи ціну відкриття, ціну закриття, високі та низькі ціни та інформацію про обсяг:

Приклад набору даних, який ми будемо використовувати для навчання нашої періодичної нейронної мережі

Перш ніж продовжувати, нам потрібно буде вибрати конкретний тип ціни на акції. Давайте використаємо Close, що вказує на некореговану ціну закриття акцій Facebook.

Тепер нам потрібно вибрати цей стовпець DataFrame і зберегти його в масиві NumPy. Ось команда для цього:

 training_data = training_data.iloc[:, 1].values 

Зверніть увагу, що ця команда замінює існуючу training_dataзмінну, яку ми створили раніше.

Тепер ви можете перевірити, що наша training_dataзмінна дійсно є масивом NumPy, запустивши type(training_data), який повинен повернути:

 numpy.ndarray 

Застосування масштабування функцій до нашого набору даних

Давайте зараз знайдемо трохи часу, щоб застосувати масштабування функцій до нашого набору даних.

Для швидкого оновлення можна застосувати два основних способи масштабування ознак до набору даних:

  • Стандартизація
  • Нормалізація

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

Ось функція нормалізації, визначена математично:

Рівняння нормування масштабування ознак

На щастя, scikit-learnце дуже легко застосовує нормування до набору даних за допомогою його MinMaxScalerкласу.

Почнемо з імпорту цього класу в наш скрипт Python. MinMaxScalerКлас живе в preprocessingмодулі scikit-learn, тому команда імпортувати клас є:

 from sklearn.preprocessing import MinMaxScaler 

Далі нам потрібно створити екземпляр цього класу. Ми призначимо новостворений об’єкт до змінної з назвою scaler. Ми будемо використовувати параметри за замовчуванням для цього класу, тому нам не потрібно нічого передавати в:

 scaler = MinMaxScaler() 

Оскільки ми не вказали жодних параметрів за замовчуванням, це буде масштабувати наш набір даних так, щоб кожне спостереження було між 0і 1.

Ми створили наш scalerоб’єкт, але наш training_dataнабір даних ще не масштабований. Нам потрібно використовувати fit_transformметод для модифікації вихідного набору даних. Ось твердження для цього:

 training_data = scaler.fit_transform(training_data.reshape(-1, 1)) 

Визначення кількості кроків для нашої періодичної нейронної мережі

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

У 40цьому посібнику ми використаємо кроки часу. Це означає, що для кожного дня, який передбачає нейронна мережа, вона буде враховувати попередні 40 днів цін на акції, щоб визначити її випуск. Зверніть увагу, оскільки в даному місяці існує лише ~ 20 торгових днів, використання 40 кроків означає, що ми покладаємось на дані про ціни акцій за попередні 2 місяці.

Отже, як насправді вказати кількість кроків у нашому сценарії Python?

Це робиться шляхом створення двох спеціальних структур даних:

  • Одна структура даних, яку ми назвемо x_training_data, містить останні 40 спостережень за цінами акцій у наборі даних. Це дані, які періодична нейронна мережа використовуватиме для прогнозування.
  • Одна структура даних, яку ми назвемо, y_training_dataщо містить ціну акцій на наступний торговий день. Це точка даних, яку намагається передбачити рекурентна нейронна мережа.

Для початку давайте ініціалізуємо кожну з цих структур даних як порожній список Python:

 x_training_data = [] y_training_data =[] 

Тепер ми будемо використовувати цикл for, щоб заповнити фактичні дані у кожен із цих списків Python. Ось код (з подальшим поясненням коду після блоку коду):

 for i in range(40, len(training_data)): x_training_data.append(training_data[i-40:i, 0]) y_training_data.append(training_data[i, 0]) 

Давайте розпакуємо компоненти цього кодового блоку:

  • range(40, len(training_data))Функція викликає цикл для ітерації від 40до останнього індексу навчальних даних.
  • x_training_data.append(training_data[i-40:i, 0])Лінії викликає петлю, що додаються попередні ціни акцій на 40 , щоб x_training_dataз кожної ітерації циклу.
  • Подібним чином y_training_data.append(training_data[i, 0])причина змушує цикл додавати ціну акцій наступного дня до y_training_dataкожної ітерації циклу.

Доопрацювання наших наборів даних шляхом їх трансформації в масиви NumPy

TensorFlow призначений для роботи переважно з масивами NumPy. Через це останнє, що нам потрібно зробити, це перетворити два списки Python, які ми щойно створили, на масиви NumPy.

На щастя, це просто. Вам просто потрібно обернути списки Python у np.arrayфункції. Ось код:

 x_training_data = np.array(x_training_data) y_training_data = np.array(y_training_data) 

Одним із важливих способів переконатися, що ваш сценарій працює належним чином, є перевірка форми обох масивів NumPy.

x_training_dataМасив повинен бути двонаправленим NumPy масивом з одним з аспектів істот 40(кількість часових кроків) і другого вимірювання істот len(training_data) - 40, яке наводиться до 1218в нашому випадку.

Подібним чином y_training_dataоб'єкт повинен бути одновимірним масивом NumPy довжини 1218(що, знову ж таки, є len(training_data) - 40).

Ви можете перевірити форму масивів, надрукувавши їх shapeатрибут, наприклад:

 print(x_training_data.shape) print(y_training_data.shape) 

Це друкує:

 (1218, 40) (1218,) 

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

Причиною цього є те, що повторюваний рівень нейронної мережі, доступний у TensorFlow, приймає дані лише у дуже конкретному форматі. Ви можете прочитати документацію TensorFlow з цієї теми тут.

Щоб змінити x_training_dataформу об’єкта, я буду використовувати метод np.reshape. Ось код для цього:

 x_training_data = np.reshape(x_training_data, (x_training_data.shape[0], x_training_data.shape[1], 1)) 

Тепер давайте x_training_dataще раз надрукуємо форму :

 print(x_training_data.shape) 

Це виводить:

 (1218, 40, 1) 

Наші масиви мають бажану форму, тому ми можемо приступити до побудови нашої періодичної нейронної мережі.

Імпорт наших бібліотек TensorFlow

Перш ніж ми можемо розпочати побудову нашої періодичної нейронної мережі, нам потрібно імпортувати низку класів з TensorFlow. Ось твердження, які слід виконати, перш ніж продовжити:

 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense from tensorflow.keras.layers import LSTM from tensorflow.keras.layers import Dropout 

Побудова нашої періодичної нейронної мережі

Настав час побудувати нашу періодичну нейронну мережу.

Перше, що потрібно зробити, це ініціалізація об’єкта з Sequentialкласу TensorFlow . Як випливає з назви, Sequentialклас призначений для побудови нейронних мереж шляхом додавання послідовностей шарів з часом.

Ось код для ініціалізації нашої періодичної нейронної мережі:

 rnn = Sequential() 

Як і у випадку з нашими штучними нейронними мережами та згортковими нейронними мережами, ми можемо додати більше шарів до цієї періодичної нейронної мережі, використовуючи addметод.

Додавання нашого першого шару LSTM

Перший шар, який ми додамо, - це шар LSTM. Для цього передайте у метод виклик LSTMкласу (який ми щойно імпортували) add.

LSTMКласу приймає кілька параметрів. Точніше, ми вкажемо три аргументи:

  • Кількість нейронів LSTM, які ви хочете включити в цей шар. Збільшення кількості нейронів - один із методів збільшення розмірності вашої періодичної нейронної мережі. У нашому випадку ми вкажемо units = 45.
  • return_sequences = True- це потрібно завжди вказувати, якщо ви плануєте включити ще один рівень LSTM після того, який ви додаєте. Вам слід вказати return_sequences = Falseостанній рівень LSTM у вашій періодичній нейронній мережі.
  • input_shape: кількість кроків і кількість предикторів у наших навчальних даних. У нашому випадку ми використовуємо 40кроки часу та лише 1предиктор (ціна акції), тому додамо

Ось повний addметод:

 rnn.add(LSTM(units = 45, return_sequences = True, input_shape = (x_training_data.shape[1], 1))) 

Зверніть увагу, що я використав x_training_data.shape[1]замість твердокодованого значення на випадок, якщо пізніше ми вирішимо навчити повторювану нейронну мережу на більшій моделі.

Додавання певної регуляризації відсіву

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

Він передбачає випадкове виключення - або «випадання» - певних результатів шару на етапі навчання.

TensorFlow дозволяє легко здійснити регуляризацію відсіву за допомогою Dropoutкласу, який ми імпортували раніше у нашому скрипті Python. DropoutКлас приймає один параметр: відсів.

Рівень випадання вказує, скільки нейронів слід скинути в певний шар нейронної мережі. Загальноприйнятим є рівень відсіву 20%. Ми дотримуватимемось цієї угоди в нашій періодичній нейронній мережі.

Ось як ви можете доручити TensorFlow скидати 20% нейрону шару LSTM під час кожної ітерації етапу тренування:

 rnn.add(Dropout(0.2)) 

Додавання ще трьох шарів LSTM з регуляризацією випадіння

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

Щоб додати більше шарів, потрібно лише скопіювати перші два addметоди з однією невеликою зміною. А саме, ми повинні видалити input_shapeаргумент із LSTMкласу.

Ми будемо підтримувати unitsоднакову кількість нейронів (або ) і рівень відсіву в кожному із LSTMвикликів класу. Оскільки третій LSTMшар, який ми додаємо в цьому розділі, буде нашим останнім шаром LSTM, ми можемо видалити return_sequences = Trueпараметр, як згадувалося раніше. Видалення наборів параметрів return_sequencesдо значення за замовчуванням False.

Ось повний код для додавання наших наступних трьох шарів LSTM:

 rnn.add(LSTM(units = 45, return_sequences = True)) rnn.add(Dropout(0.2)) rnn.add(LSTM(units = 45, return_sequences = True)) rnn.add(Dropout(0.2)) rnn.add(LSTM(units = 45)) rnn.add(Dropout(0.2)) 

Цей код дуже повторюється і порушує принцип СУХОГО (Не повторюйся) розробки програмного забезпечення. Давайте вкладемо його в цикл:

 for i in [True, True, False]: rnn.add(LSTM(units = 45, return_sequences = i)) rnn.add(Dropout(0.2)) 

Додавання вихідного рівня до нашої періодичної нейронної мережі

Завершимо архітектуру нашої періодичної нейронної мережі, додавши наш вихідний рівень.

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

Єдиний параметр, який нам потрібно вказати units , - це бажана кількість розмірів, які повинен генерувати вихідний рівень. Оскільки ми хочемо вивести ціну акцій наступного дня (єдине значення), ми вкажемо units = 1.

Ось код для створення нашого вихідного рівня:

 rnn.add(Dense(units = 1)) 

Компіляція нашої періодичної нейронної мережі

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

TensorFlow дозволяє нам скомпілювати нейронну мережу за допомогою доречно названого compileметоду. Він приймає два аргументи: optimizerі loss. Почнемо зі створення порожньої compileфункції:

 rnn.compile(optimizer = '', loss = '') 

Тепер нам потрібно вказати параметри optimizerта loss.

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

lossПараметр досить простий. Оскільки ми прогнозуємо неперервну змінну, ми можемо використовувати середньоквадратичну помилку - так само, як це було б при вимірюванні продуктивності моделі машинного навчання з лінійною регресією. Це означає, що ми можемо вказати loss = mean_squared_error.

Ось остаточний compileметод:

 rnn.compile(optimizer = 'adam', loss = 'mean_squared_error') 

Встановлення періодичної нейронної мережі на навчальному наборі

Настав час навчити нашу періодичну мережу на наших навчальних даних.

Для цього ми використовуємо fitметод. У fitцьому випадку метод приймає чотири аргументи:

  • Дані навчання : у нашому випадку це будеx_training_dataіy_training_data
  • Епохи : кількість ітерацій, на яких ви хотіли б навчати повторювану нейронну мережу. Ми уточнимоepochs = 100в цьому випадку.
  • Розмір партії : розмір партій, яким мережа буде навчатися протягом кожної епохи.

Ось код для підготовки цієї періодичної нейронної мережі відповідно до наших специфікацій:

 rnn.fit(x_training_data, y_training_data, epochs = 100, batch_size = 32) 

Тепер ваш блокнот Jupyter буде генерувати ряд друкованих даних для кожної епохи в алгоритмі навчання. Вони виглядають так:

Результати навчання машинного навчання

Як бачите, кожен результат показує, скільки часу витрачалася епоха, а також обчислювана функція втрат у ту епоху.

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

Створення прогнозів за допомогою нашої періодичної нейронної мережі

Ми побудували свою періодичну нейронну мережу та навчили її на основі даних про ціни акцій Facebook за останні 5 років. Настав час зробити деякі прогнози!

Імпорт наших тестових даних

Для початку давайте імпортуємо фактичні дані про ціни акцій за перший місяць 2020 року. Це дасть нам щось для порівняння наших прогнозованих значень.

Ось код для цього. Зверніть увагу, що він дуже схожий на код, який ми використовували для імпорту наших навчальних даних на початку нашого сценарію Python:

 test_data = pd.read_csv('FB_test_data.csv') test_data = test_data.iloc[:, 1].values 

Якщо виконати оператор print(test_data.shape), він повернеться (21,). Це показує, що наші тестові дані - це одновимірний масив NumPy з 21 записом - це означає, що в січні 2020 року було 21 день торгів на фондовому ринку.

Ви також можете сформувати швидкий графік даних за допомогою plt.plot(test_data). Це має створити таку візуалізацію Python:

Візуалізація наших тестових даних

Якщо пощастить, наші прогнозовані значення повинні слідувати за тим самим розподілом.

Створення набору тестових даних, необхідних для прогнозування

Перш ніж ми зможемо фактично прогнозувати ціну акцій Facebook у січні 2020 року, спочатку потрібно внести деякі зміни в наш набір даних.

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

На жаль, ви можете просто об’єднати масиви NumPy негайно. Це пов’язано з тим, що ми вже застосували масштабування об’єктів до навчальних даних, але не застосували жодного масштабування об’єктів до даних тесту.

Щоб це виправити, нам потрібно повторно імпортувати вихідний x_training_dataоб’єкт під новою назвою змінної unscaled_x_training_data. Для послідовності ми також повторно імпортуємо дані тесту як DataFrame, який називається unscaled_test_data:

 unscaled_training_data = pd.read_csv('FB_training_data.csv') unscaled_test_data = pd.read_csv('FB_test_data.csv') 

Тепер ми можемо об'єднати разом Openстовпець з кожного DataFrame з таким твердженням:

 all_data = pd.concat((unscaled_x_training_data['Open'], unscaled_test_data['Open']), axis = 0) 

Цей all_dataоб’єкт - панда Серія довжиною 1279.

Тепер нам потрібно створити масив усіх цін на акції з січня 2020 року та 40 торгових днів до січня. Ми будемо називати цей об’єкт, x_test_dataоскільки він містить xзначення, які ми будемо використовувати для прогнозування курсу акцій на січень 2020 року.

Перше, що вам потрібно зробити, це знайти індекс першого торгового дня в січні в нашому all_dataоб’єкті. Заява len(all_data) - len(test_data)ідентифікує цей індекс для нас.

Це представляє верхню межу першого елемента масиву. Щоб отримати нижню межу, просто відніміть 40від цього числа. Інакше сказано, що нижня межа є len(all_data) - len(test_data) - 40.

Верхня межа всього x_test_dataмасиву буде останнім елементом у наборі даних. Відповідно, ми можемо створити цей масив NumPy з таким твердженням:

 x_test_data = all_data[len(all_data) - len(test_data) - 40:].values 

Ви можете перевірити, чи створено цей об’єкт за бажанням, друкуючи len(x_test_data), значення якого становить 61. Це має сенс - він повинен містити 21значення за січень 2020 року, а також 40значення до попереднього періоду .

Останнім кроком цього розділу є швидке переформування нашого масиву NumPy, щоб зробити його придатним для predictметоду:

 x_test_data = np.reshape(x_test_data, (-1, 1)) 

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

Масштабування даних тесту

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

 x_test_data = scaler.transform(x_test_data) 

Зверніть увагу, що ми використовували transformметод тут замість fit_transformметоду (як раніше). Це пов’язано з тим, що ми хочемо перетворити тестові дані відповідно до відповідності, згенерованої з усього набору навчальних даних.

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

Групування даних тесту

Останнє, що нам потрібно зробити, це згрупувати наші тестові дані в 21масиви розміром 40. Сказано інакше, тепер ми створимо масив, де кожен запис відповідає даті в січні і містить ціни акцій 40попередніх торгових днів.

Код для цього схожий на те, що ми використовували раніше:

 final_x_test_data = [] for i in range(40, len(x_test_data)): final_x_test_data.append(x_test_data[i-40:i, 0]) final_x_test_data = np.array(final_x_test_data) 

Нарешті, нам потрібно змінити форму final_x_test_dataзмінної відповідно до стандартів TensorFlow.

Ми бачили це раніше, тому код не повинен потребувати пояснень:

 final_x_test_data = np.reshape(final_x_test_data, (final_x_test_data.shape[0], final_x_test_data.shape[1], 1)) 

Фактично робити прогнози

Після безглуздої обробки даних ми готові робити прогнози, використовуючи наші тестові дані!

Цей крок простий. Просто введіть наш final_x_test_dataоб'єкт у predictметод, що викликається на rnnоб'єкті. Як приклад, ось як ви можете генерувати ці прогнози та зберігати їх у відповідній іменованій змінній predictions:

 predictions = rnn.predict(final_x_test_data) 

Давайте побудуємо ці прогнози, запустивши plt.plot(predictions)(зверніть увагу, що plt.clf()спочатку вам потрібно буде запустити, щоб очистити полотно):

Оригінальні прогнози нашої періодичної нейронної мережі

Як бачите, передбачені значення в цій графіці знаходяться між 0і 1. Це тому, що наш набір даних все ще масштабований! Нам потрібно його не масштабувати, щоб передбачення мали якесь практичне значення.

MinMaxScalerКлас , який ми використовували , щоб спочатку масштабувати наш набір даних поставляється з корисним inverse_transformметодом в ун-масштаб даних. Ось як можна зменшити масштаб даних і сформувати новий графік:

 unscaled_predictions = scaler.inverse_transform(predictions) plt.clf() #This clears the first prediction plot from our canvas plt.plot(unscaled_predictions) 
Безмасштабні прогнози нашої періодичної нейронної мережі

Це виглядає набагато краще! Той, хто стежив за ціною акцій Facebook протягом будь-якого періоду часу, може побачити, що це здається досить близьким до того, де Facebook насправді торгував.

Давайте згенеруємо графік, який порівнює прогнозовані ціни акцій із фактичною ціною акцій Facebook:

 plt.plot(unscaled_predictions, color = '#135485', label = "Predictions") plt.plot(test_data, color = 'black', label = "Real Data") plt.title('Facebook Stock Price Predictions') 

Повний код цього підручника

Ви можете переглянути повний код цього підручника у цьому сховищі GitHub. Він також вставлений нижче для довідки:

 #Import the necessary data science libraries import numpy as np import pandas as pd import matplotlib.pyplot as plt #Import the data set as a pandas DataFrame training_data = pd.read_csv('FB_training_data.csv') #Transform the data set into a NumPy array training_data = training_data.iloc[:, 1].values #Apply feature scaling to the data set from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() training_data = scaler.fit_transform(training_data.reshape(-1, 1)) #Initialize our x_training_data and y_training_data variables #as empty Python lists x_training_data = [] y_training_data =[] #Populate the Python lists using 40 timesteps for i in range(40, len(training_data)): x_training_data.append(training_data[i-40:i, 0]) y_training_data.append(training_data[i, 0]) #Transforming our lists into NumPy arrays x_training_data = np.array(x_training_data) y_training_data = np.array(y_training_data) #Verifying the shape of the NumPy arrays print(x_training_data.shape) print(y_training_data.shape) #Reshaping the NumPy array to meet TensorFlow standards x_training_data = np.reshape(x_training_data, (x_training_data.shape[0], x_training_data.shape[1], 1)) #Printing the new shape of x_training_data print(x_training_data.shape) #Importing our TensorFlow libraries from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense from tensorflow.keras.layers import LSTM from tensorflow.keras.layers import Dropout #Initializing our recurrent neural network rnn = Sequential() #Adding our first LSTM layer rnn.add(LSTM(units = 45, return_sequences = True, input_shape = (x_training_data.shape[1], 1))) #Perform some dropout regularization rnn.add(Dropout(0.2)) #Adding three more LSTM layers with dropout regularization for i in [True, True, False]: rnn.add(LSTM(units = 45, return_sequences = i)) rnn.add(Dropout(0.2)) #(Original code for the three additional LSTM layers) # rnn.add(LSTM(units = 45, return_sequences = True)) # rnn.add(Dropout(0.2)) # rnn.add(LSTM(units = 45, return_sequences = True)) # rnn.add(Dropout(0.2)) # rnn.add(LSTM(units = 45)) # rnn.add(Dropout(0.2)) #Adding our output layer rnn.add(Dense(units = 1)) #Compiling the recurrent neural network rnn.compile(optimizer = 'adam', loss = 'mean_squared_error') #Training the recurrent neural network rnn.fit(x_training_data, y_training_data, epochs = 100, batch_size = 32) #Import the test data set and transform it into a NumPy array test_data = pd.read_csv('FB_test_data.csv') test_data = test_data.iloc[:, 1].values #Make sure the test data's shape makes sense print(test_data.shape) #Plot the test data plt.plot(test_data) #Create unscaled training data and test data objects unscaled_training_data = pd.read_csv('FB_training_data.csv') unscaled_test_data = pd.read_csv('FB_test_data.csv') #Concatenate the unscaled data all_data = pd.concat((unscaled_x_training_data['Open'], unscaled_test_data['Open']), axis = 0) #Create our x_test_data object, which has each January day + the 40 prior days x_test_data = all_data[len(all_data) - len(test_data) - 40:].values x_test_data = np.reshape(x_test_data, (-1, 1)) #Scale the test data x_test_data = scaler.transform(x_test_data) #Grouping our test data final_x_test_data = [] for i in range(40, len(x_test_data)): final_x_test_data.append(x_test_data[i-40:i, 0]) final_x_test_data = np.array(final_x_test_data) #Reshaping the NumPy array to meet TensorFlow standards final_x_test_data = np.reshape(final_x_test_data, (final_x_test_data.shape[0], final_x_test_data.shape[1], 1)) #Generating our predicted values predictions = rnn.predict(final_x_test_data) #Plotting our predicted values plt.clf() #This clears the old plot from our canvas plt.plot(predictions) #Unscaling the predicted values and re-plotting the data unscaled_predictions = scaler.inverse_transform(predictions) plt.clf() #This clears the first prediction plot from our canvas plt.plot(unscaled_predictions) #Plotting the predicted values against Facebook's actual stock price plt.plot(unscaled_predictions, color = '#135485', label = "Predictions") plt.plot(test_data, color = 'black', label = "Real Data") plt.title('Facebook Stock Price Predictions') 

Короткий зміст - Інтуїція, що стоїть за періодичними нейронними мережами

У цьому підручнику ви дізналися, як будувати та тренувати повторювану нейронну мережу.

Ось короткий підсумок того, що ви дізналися:

  • Як застосувати масштабування функцій до набору даних, на якому буде навчатись періодична нейронна мережа
  • Роль timestepsу навчанні рекурентної нейронної мережі
  • Цей TensorFlow в основному використовує масиви NumPy як структуру даних для навчання моделей
  • Як додати LSTMта Dropoutшари до періодичної нейронної мережі
  • Чому регуляризація відсіву зазвичай використовується, щоб уникнути переобладнання під час навчання нейронних мереж
  • Те, що Denseшар від TensorFlow зазвичай використовується як вихідний шар рекурентної нейронної мережі
  • Що compilationкрок побудови нейронної мережі передбачає визначення її оптимізатора та функції втрат
  • Як робити прогнози за допомогою періодичної нейронної мережі
  • Те, що прогнози роблять із використанням нейронної мережі, навченої масштабованим даним, має бути масштабовано, щоб люди могли інтерпретувати її

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

Прагматичне машинне навчання Машинне навчання змінює світ. Але завжди було важко навчитися машинному навчанню ... дотепер. Прагматичне машинне навчання - це покроковий посібник, який навчить вас основ машинного навчання шляхом побудови 9 реальних проектів. Ви дізнаєтесь: Лінійна регресія Логістичні регреси ... Нік Маккаллум Гамроуд