Настройка локально сохраненного Универсального кодера предложения - 'InvalidArgumentError: Неудачный конструктор TensorSliceReader' - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь точно настроить сохраненный локально универсальный кодировщик предложений большой версии 3.
План состоит в том, чтобы взять модуль tf-hub, обернуть его с помощью простого классификатора, модели поезда и сохранить модуль USE с обновленными весами, чтобы использовать их для встраивания.

Но после загрузки модуля из локальной папки для повторного обучения я получаю сообщение об ошибке, что он не может получить файлы из временной папки "C: \ Users \ xxx \ AppData \ Local \ Temp \ 1 \ tfhub_modules ... . ":
InvalidArgumentError: Unsuccessful TensorSliceReader constructor: Failed to get matching files on C:\Users\xxx\AppData\Local\Temp\1\tfhub_modules\96e8f1d3d4d90ce86b2db128249eb8143a91db73\variables\variables: Not found: FindFirstFile failed for: C:/Users/xxx/AppData/Local/Temp/1/tfhub_modules/96e8f1d3d4d90ce86b2db128249eb8143a91db73/variables : The system cannot find the path specified. ; No such process [[{{node checkpoint_initializer_25}}]]

Сохранить модель:
with tf.Session(graph=tf.Graph()) as sess:
    module = hub.Module("https://tfhub.dev/google/universal-sentence-encoder-large/3", trainable=True)
    text_input = tf.placeholder(dtype=tf.string, shape=[None])
    sess.run([tf.global_variables_initializer(), tf.tables_initializer()])
    embeddings = module(text_input)
    simple_save(sess,
        export_dir,
        inputs={'text': text_input},
        outputs={'embeddings': embeddings},
        legacy_init_op=tf.tables_initializer()) 
Finetune:
 text = ["cat", "kitten", "dog", "puppy"]
label = [0, 0, 1, 1]

graph=tf.Graph()
with tf.Session(graph=graph) as sess:
    sess.run([tf.global_variables_initializer(), tf.tables_initializer()])

    model = tf.saved_model.loader.load(export_dir=**_export_dir,_** sess=sess,
                                       tags=[tag_constants.SERVING]) 

    # universal sentence encoder input/output
    input_tensor_name = model.signature_def[signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY].inputs['text'].name
    in_tensor = tf.get_default_graph().get_tensor_by_name(input_tensor_name)

    embedd_tensor_name = model.signature_def[signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY].outputs[
        'embeddings'].name
    out_tensor = tf.get_default_graph().get_tensor_by_name(embedd_tensor_name)

    # simple classification on top of use
    input_y = tf.placeholder(tf.int32, shape=(None))
    labels = tf.one_hot(input_y, 4)
    logits = tf.layers.dense(out_tensor, 4)
    loss = tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=labels)
    optimizer = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)

    sess.run(tf.global_variables_initializer())

    for epoch in range(2):
        feed_dict = {
            in_tensor: text,
            input_y: label
        }
        sess.run(optimizer, feed_dict)

    message_embeddings = sess.run(out_tensor, feed_dict={in_tensor: text})
    print("Embeddings after tuning:", message_embeddings)`

Так что в настоящее время я подозреваю проблемы с инициализацией переменных. Но не уверен относительно правильного пути.

Высоко ценю любую помощь в этом направлении. Спасибо.

1 Ответ

0 голосов
/ 05 ноября 2019

Мне удалось решить эту проблему путем инициализации только переменных оптимизатора. sess.run (tf.global_variables_initializer ()) до

       uninitialized_vars = []
        for var in tf.all_variables():
            try:
                sess.run(var)
            except tf.errors.FailedPreconditionError:
                uninitialized_vars.append(var)
        sess.run(tf.initialize_variables(uninitialized_vars))

Но столкнулся с другой проблемой - после обучения я сохраняю тонко настроенную модель встраивания, но размер стал 2,3 ГБ, вместо 800 МБ оригинала. Как я понимаю, это связано с переменными оптимизатора.

...