Организация проекта с Tensorflow.keras. Должен ли один подкласс tf.keras.Model?

Я использую Tensorflow 1.14 и API tf.keras для создания нескольких (> 10) нейронных сетей с разной сетью. (Меня также интересуют ответы на этот вопрос с использованием Tensorflow 2). Мне интересно, как мне организовать мой проект.

Я конвертирую модели keras в оценки, используя tf.keras.estimator.model_to_estimator и Tensorboard для визуализации. Я также иногда использую model.summary(). Каждая из моих моделей имеет ряд (> 20) гиперпараметров и принимает в качестве входных данных один из трех типов входных данных. Иногда я использую оптимизацию гиперпараметров, например, вручную удаляю модели и использую tf.keras.backend.clear_session(), прежде чем пробовать следующий набор гиперпараметров.

В настоящее время я использую функции, которые принимают гиперпараметры в качестве аргументов и возвращают соответствующую скомпилированную модель keras для превращения в оценщик. Я использую три разных сценария «Main_Datatype.py» для обучения моделей для трех разных типов входных данных. Все данные загружаются из файлов .tfrecord, и для каждого типа данных существует функция ввода, которая используется всеми оценщиками, использующими этот тип данных в качестве входных данных. Я переключаюсь между моделями (т.е. функциями, возвращающими модель) в основных сценариях. У меня также есть некоторые строительные блоки, которые являются частью более чем одной модели, для которых я использую вспомогательные функции, возвращающие их, собирая окончательный результат с помощью функционального API Keras.

Небольшие несовместимости разных моделей начинают меня смущать, и я решил организовать проект с помощью классов. Я планирую создать класс для каждой модели, который отслеживает гиперпараметры и правильное наименование каждой модели и ее каталога моделей. Однако мне интересно, есть ли установленные или рекомендуемые способы сделать это в Tensorflow.

Вопрос: Должен ли я создать подкласс tf.keras.Model вместо использования функций для построения моделей или классов Python, которые их инкапсулируют? Будет ли создание подкласса keras.Model сломать (или потребовать много работы для включения) какую-либо функциональность, которую я использую с оценщиками keras и тензорной доской? Я видел много проблем, с которыми люди сталкиваются при использовании пользовательских классов моделей, и я несколько неохотно берусь за работу только для того, чтобы обнаружить, что это не работает для меня. У вас есть другие предложения, как лучше организовать мой проект?

Заранее большое спасибо.


person Adomas Baliuka    schedule 03.11.2019    source источник


Ответы (2)


Подкласс, только если вам это абсолютно необходимо. Я лично предпочитаю следовать следующему порядку реализации. Если сложность модели, которую вы проектируете, не может быть достигнута с помощью первых двух вариантов, то, конечно, единственным оставшимся вариантом является создание подклассов.

  1. Последовательный API tf.keras
  2. Функциональный API tf.keras
  3. Подкласс tf.keras.Model
person CypherX    schedule 03.11.2019
comment
Спасибо за ваш ответ! Сложность моих моделей может быть достигнута с помощью функционального API. Мне интересно, сделает ли подкласс модели мой проект более структурированным. Учебники (например, tensorflow.org/tutorials/customization/custom_layers в разделе Модели: составной слой ) кажется, предполагают, что это иногда делается. Например, повторяющийся блок в глубокой сети получает свой собственный класс. Ваше предложение для моего случая состояло бы в том, чтобы продолжать использовать функции, которые возвращают модели или простые классы Python для организации проекта? - person Adomas Baliuka; 04.11.2019
comment
Ну, это зависит от вас: если ваша цель — аккуратный и быстрый путь к созданию работающего решения с существующим ассортиментом всего волшебства TF, доступного через tf.keras, тогда следуйте тому, что я предложил. Однако, если по какой-то причине вы действительно хотите знать внутреннюю работу моделей и аналогичным образом создавать их вручную, то, хотя это может быть болезненно, используйте подклассы моделей. Я бы посоветовал вам обратиться к исходному коду плотных слоев, чтобы увидеть и сравнить его со слоем, закодированным вручную в вашей модели. Это более длинный путь, но со временем это даст вам больше возможностей для настройки/разработки кода. - person CypherX; 04.11.2019