Визначення моделі багаторазового використання Кераса

Моделі в Keras успадковуються від класу keras.models.Model. Це контейнер для шарів, але він може також включати інші моделі як будівельні блоки. Перш ніж навчатись або використовуватись для прогнозування, модель «Кераса» повинна бути «скомпільована», що передбачає вказівку функції втрат та оптимізатора. Я виявив, що для поліпшення повторного використання коду визначення моделі існує кілька основних принципів:

андрія

  • Впровадити визначення моделей як функції, що приймають гіперпараметри як вхідні дані та повертають об'єкт Model.
  • Тримайте визначення моделі окремо від складання та навчання.
  • Зробіть шари верхнього рівня необов’язковими.
  • Знайте свій функціональний API Keras.

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

Визначення моделей - це функції, що приймають гіперпараметри як аргументи¶

Існує три популярні способи визначення моделей Keras у коді:

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

Пакет keras.applications має набір моделей глибокого навчання, які відповідають третьому варіанту.

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

Окреме визначення моделі від компіляції та навчання¶

Аргумент виглядає наступним чином: маючи модель, визначену окремо, ми можемо пізніше вирішити тренувати її за допомогою того чи іншого оптимізатора, а також "заморожувати" частини моделі.

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

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

Зробіть шари верхнього рівня необов’язковими¶

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

Сумісність з обгортками scikit-learn¶

Це розчаровує, але запропонований підхід із функціями, що повертають моделі без їх попереднього складання, не буде працювати з обгортками Keras scikit-learn, такими як keras.wrappers.scikit_learn.KerasClassifier та keras.wrappers.scikit_learn.KerasRegressor. У документації чітко зазначено:

build_fn повинен побудувати, скомпілювати та повернути модель Кераса, яка потім буде використана для підгонки/прогнозування.

І повідомлення про помилку, яке ви отримаєте, спробувавши, є AttributeError: "Послідовний" об'єкт не має атрибута "втрата". Давайте накинемо трохи магії функції вищого порядку, щоб це виправити:

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

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

Варто зазначити, що станом на версію 2.1.4 класи обгортки Keras scikit-learn працюють лише з послідовними моделями, ви не можете передати model_fn, який створює функціональну модель API.

Функціональний API Keras¶

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