В лучшем (т.е. простейшем) случае вашему модулю вообще не нужны какие-либо теги, а именно, когда один и тот же фрагмент графика TensorFlow соответствует всем предполагаемым применениям модуля.Для этого просто оставьте tags
или tags_and_args
не установленными, чтобы получить значение по умолчанию (пустой набор тегов).
Теги необходимы, если одному и тому же модулю требуется более одной версии своего графа, скажем, aобучающая версия, которая применяет отсев в режиме обучения, и выводная версия, которая делает отсев бездействующим.Как правило, вы увидите код, подобный
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 для all dict с указанным аргументом и хранится all графиков, построенных ими засцены.Когда вы создаете модуль из этой спецификации и затем экспортируете его, он будет содержать все созданные версии графов, помеченные соответствующими наборами строк.
Аргумент tags=...
для m = hub.Module(...)
просто контролирует, какиеразличных версий графа используется в текущем графе, скажем, когда вызывается m
(т.е. применяется к входам).Это не ограничивает то, что пишет m.export(...)
.