График TensorFlow в модель Keras? - PullRequest
0 голосов
/ 10 января 2019

Можно ли определить граф в собственном TensorFlow и затем преобразовать этот граф в модель Keras?


Мое намерение - просто объединить (для меня) лучшее из двух миров.

Мне очень нравится API модели Keras для создания прототипов и новых экспериментов, т. Е. Использование удивительного multi_gpu_model(model, gpus=4) для обучения с несколькими графическими процессорами, сохранение / загрузка весов или целых моделей с помощью oneliners, все удобные функции, такие как .fit(), .predict() и др.

Однако я предпочитаю определять свою модель в нативном TensorFlow. Менеджеры контекста в TF великолепны, и, на мой взгляд, гораздо проще реализовать с ними такие вещи, как GAN:

with tf.variable_scope("Generator"):
    # define some layers
with tf.variable_scope("Discriminator"):
    # define some layers

# model losses
G_train_op = ...AdamOptimizer(...)
    .minimize(gloss,
    var_list=tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, 
                               scope="Generator")
D_train_op = ...AdamOptimizer(...)
    .minimize(dloss, 
    var_list=tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, 
                               scope="Discriminator")

Еще один бонус - структурирование графика таким образом. В TensorBoard отладка сложных нативных моделей Keras является адом, поскольку они вообще не структурированы. При интенсивном использовании переменных областей в собственном TF вы можете «распутать» график и посмотреть на очень структурированную версию сложной модели для отладки.

Используя это, я могу напрямую настроить пользовательскую функцию потерь, и мне не нужно ничего замораживать во время каждой итерации обучения, поскольку TF будет обновлять веса только в правильной области, что (по крайней мере, на мой взгляд) намного проще, чем Keras решение, чтобы перебрать все существующие слои и установить .trainable = False.

TL; DR:

Короче говоря: мне нравится прямой доступ ко всему в TF, но в большинстве случаев простой модели Keras достаточно для обучения, логического вывода ... позже. API модели намного проще и удобнее в Keras.

Следовательно, я бы предпочел настроить график в нативном TF и ​​преобразовать его в Keras для обучения, оценки и так далее. Есть ли способ сделать это?

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Вы можете вставить код TensorFlow непосредственно в модель Keras или учебный конвейер! С середины 2017 года Keras полностью адаптирована и интегрирована в TensorFlow. В этой статье более подробно.

Это означает, что ваша модель TensorFlow уже является моделью Keras, и наоборот. Вы можете развиваться в Keras и переключаться на TensorFlow, когда вам это нужно. Код TensorFlow будет работать с API-интерфейсами Keras, включая API-интерфейсы Keras, для обучения, вывода и сохранения вашей модели.

0 голосов
/ 28 января 2019

Я не думаю, что возможно создать универсальный автоматический конвертер для любого графика TF, который будет иметь значимый набор слоев, с правильными именами и т. Д. Только потому, что графики более гибкие, чем последовательность слоев Keras .

Однако вы можете обернуть свою модель слоем Lambda . Создайте свою модель внутри функции, оберните ее с помощью лямбды, и вы получите ее в Keras:

def model_fn(x):
    layer_1 = tf.layers.dense(x, 100)
    layer_2 = tf.layers.dense(layer_1, 100)
    out_layer = tf.layers.dense(layer_2, num_classes)
    return out_layer

model.add(Lambda(model_fn))

Это то, что иногда происходит, когда вы используете multi_gpu_model : у вас есть три слоя: вход, модель и выход.

Keras Apologetics

Однако интеграция между TensorFlow и Keras может быть намного более тесной и значимой. См. этот урок для примеров использования.

Например, переменные области видимости могут использоваться почти так же, как в TensorFlow:

x = tf.placeholder(tf.float32, shape=(None, 20, 64))
with tf.name_scope('block1'):
    y = LSTM(32, name='mylstm')(x)

То же самое для размещения устройства вручную:

with tf.device('/gpu:0'):
    x = tf.placeholder(tf.float32, shape=(None, 20, 64))
    y = LSTM(32)(x)  # all ops / variables in the LSTM layer will live on GPU:0

Пользовательские потери обсуждаются здесь: Keras: чистая реализация для нескольких выходов и пользовательских функций потерь?

Вот так выглядит моя модель, определенная в Keras, в Tensorboard: Tensorboard

Итак, Keras действительно является лишь упрощенным интерфейсом для TensorFlow, так что вы можете смешивать их достаточно гибко. Я бы порекомендовал вам проверить исходный код модели Keras zoo на предмет умных решений и шаблонов, которые позволяют создавать сложные модели с использованием чистого API Keras.

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