Как я могу изменить обучаемые переменные tf.Variable в модуле TensorFlow-Hub для использования собственного инициализатора ядра? - PullRequest
0 голосов
/ 11 февраля 2019

Я бы хотел обучить нейронную сеть InceptionV3 с нуля.У меня уже есть запущенная реализация, которая использует этот модуль TensorFlow Hub: https://tfhub.dev/google/imagenet/inception_v3/feature_vector/1 и выполняет точную настройку с использованием включенных предварительно обученных весов.

Теперь я хотел бы использовать тот же TensorFlowМодуль-концентратор , но отбросьте предоставленные веса и используйте мой собственный инициализатор ядра (например, tf.initializers.truncated_normal, tf.initializers.he_normal и т. Д.).

Как я могу изменить обучаемые переменные в модуле TFHub, чтобы использовать пользовательский инициализатор?Просто чтобы прояснить ситуацию, я хочу заменить предварительно обученные веса во время выполнения и просто сохранить архитектуру модели.Пожалуйста, дайте мне знать, действительно ли я должен использовать TFSlim или модельный зоопарк.

Вот что у меня есть:

import tensorflow as tf
import tensorflow_hub as hub

tfhub_module_url = 'https://tfhub.dev/google/imagenet/inception_v3/feature_vector/1'
initializer = tf.truncated_normal

def main(_):
    _graph = tf.Graph()
    with _graph.as_default():
        module_spec = hub.load_module_spec(tfhub_module_url)
        height, width = hub.get_expected_image_size(module_spec)
        resized_input_tensor = tf.placeholder(tf.float32, [None, height, width, 3], name='resized_input_tensor')
        m = hub.Module(module_spec, trainable=True)
        bottleneck_tensor = m(resized_input_tensor)
        trainable_vars = tf.trainable_variables()
        # TODO: This fails, because this probably isn't how this is supposed to be done:
        for trainable_var in trainable_vars:
            trainable_var.initializer = tf.initializers.he_normal

    with tf.Session(graph=_graph) as sess:
        print(trainable_vars)


tf.logging.set_verbosity(tf.logging.INFO)
tf.app.run()

Как правильно это сделать?

1 Ответ

0 голосов
/ 14 февраля 2019

Нет простого способа сделать то, что вы хотите сделать, потому что модули TF Hub действительно созданы для представления предварительно обученных частей модели.Если вам нужен только график, вы можете напрямую использовать код tenorsflow_models / slim.(Или вы можете исправить код библиотеки tenorflow_hub, чтобы не перезаписывать инициализаторы переменных с операциями восстановления в первую очередь.)

РЕДАКТИРОВАТЬ 2019-04-15: См. Также tenorsflow_hub issue # 267 : InTF2, понятие инициализаторов исчезает, поэтому авторы TF Hub не хотят начинать в зависимости от него для API TF1.

...