Как передать мои собственные данные в BERT, получив правильный заполнитель из графика тензорного потока

Я пытаюсь настроить BERT для NER. Я загрузил контрольную точку отсюда (https://storage.googleapis.com/bert_models/2018_10_18/uncased_L-12_H-768_A-12.zip)

Я загрузил сеанс и график, используя этот код:

model = "./cased_L-12_H-768_A-12/bert_model"
new_saver = tf.train.import_meta_graph(model + ".ckpt.meta")
new_saver.restore(sess, model + '.ckpt')
graph = tf.get_default_graph()

Теперь я пытаюсь получить заполнители ввода из этого графика, чтобы создать свой собственный feed_dict и определить свою собственную функцию потерь. Я исследую график, используя следующий код:

op = sess.graph.get_operations()
[m.values() for m in op]

и единственные заполнители, которые я нахожу, перечислены ниже:

[(<tf.Tensor 'Placeholder:0' shape=(1, 128) dtype=int32>,),
 (<tf.Tensor 'Placeholder_1:0' shape=(1, 128) dtype=int32>,),
 (<tf.Tensor 'Placeholder_2:0' shape=(1, 128) dtype=int32>,),

Эти заполнители кажутся мне некорректными по следующим причинам:

  1. Я ожидал, что они будут иметь размер (None, 512), поскольку эта модель BERT принимает длину последовательности максимум 512, а размер batch_size не должен быть заранее определен. Основываясь на этом размере, который я вижу здесь, эта модель BERT принимает 1 последовательность за раз с максимальным размером 128. Почему это?

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


person user3347259    schedule 01.08.2019    source источник
comment
Это намного проще, если вы просто используете tf hub. Загрузите вложения с помощью hub.Module и установите trainable=True.   -  person gobrewers14    schedule 01.08.2019
comment
Спасибо. Я понимаю. Я надеялся, что смогу сделать это по старинке.   -  person user3347259    schedule 01.08.2019


Ответы (1)


Типичное использование модели BERT для последующих задач требует перестроения графика и загрузки значений веса / смещения из предварительно обученной модели, как это сделано в примерах сценариев, таких как run_classifier.py.

Можно запустить модель по старинке, определив заполнители самостоятельно и передав их модели (в качестве входных данных конструктора BertModel) при построении графа.

Обратите внимание, что is_training определяется как переменная типа bool, но не тензор, в BertModel, что требует некоторых небольших изменений кода, если вы также хотите ввести в него заполнитель.

person wjiang    schedule 08.10.2019