Теги концентратора Tensorflow и экспорт

Меня очень смущает, как теги должны работать в хабе и как их использовать при экспорте. Как я могу тренироваться на железнодорожной части моего графика и экспортировать обслуживающую?

У меня такой код:

def user_module_fn(foo, bar):
    x = tf.sparse_placeholder(tf.float32, shape[-1, 32], name='name')
    y = something(x)
    hub.add_signature(name='my_name', input={"x": x}, output={"default", y})

module_spec = hub.create_module_spec(module_spec_fn, tags_and_args=[
   (set(), {"foo": foo, "bar": bar}),
   ({"train"}, {"foo": foo, "bar": baz})
 ])

m = hub.Module(module_spec, name="my_name", trainable=True, tags={"train"})

hub.register_for_export(m, "my_name")

У меня следующий вопрос: поскольку я создаю экземпляр модуля m с помощью tags={'train'}, я думаю, что использую правильный модуль для обучения. Означает ли это, что я только экспортирую тот, который помечен train? Как использовать train для обучения и set() (по умолчанию) для обслуживания?


person meto    schedule 06.06.2018    source источник


Ответы (1)


В лучшем (то есть в простейшем) случае вашему модулю вообще не нужны теги, а именно, когда один и тот же кусок графа TensorFlow подходит для всех предполагаемых применений модуля. Для этого просто оставьте tags или tags_and_args не установленными, чтобы получить значение по умолчанию (пустой набор тегов).

Теги необходимы, если одному и тому же модулю требуется более одной версии своего графика, например, обучающая версия, которая применяет отсев в режиме обучения, и версия вывода, которая делает выпадение невозможным. Обычно вы увидите такой код, как

def module_fn(training):
  inputs = tf.placeholder(dtype=tf.float32, shape=[None, 50])
  layer1 = tf.layers.fully_connected(inputs, 200)
  layer1 = tf.layers.dropout(layer1, rate=0.5, training=training)
  layer2 = tf.layers.fully_connected(layer1, 100)
  outputs = dict(default=layer2)
  hub.add_signature(inputs=inputs, outputs=outputs)

...

tags_and_args = [(set(), {"training": False}),
                 ({"train"}, {"training": True})]
module_spec = hub.create_module_spec(module_fn, tags_and_args)

Создание спецификации модуля запускает module_fn для всех предоставленных аргументов dicts и сохраняет все построенные для них графики за кулисами. Когда вы создаете модуль из этой спецификации и затем экспортируете его, он будет содержать все созданные версии графа, помеченные соответствующими наборами строк.

Аргумент tags=... для m = hub.Module(...) просто контролирует, какая из различных версий графа будет использоваться в текущем графе, скажем, при вызове m (т. Е. Применяется к входам). Это не ограничивает то, что m.export(...) записывает.

person arnoegw    schedule 06.06.2018
comment
спасибо, это очень полезно. Я нахожусь именно в том случае, когда у меня нет поезда, а у меня нет поезда. - person meto; 06.06.2018