Модель, созданная из других слоев модели, не содержит всех весов из слоев. Но model.summary () / plot_model показывает эти веса как часть графика - PullRequest
0 голосов
/ 21 июня 2020

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

# Only one layer, and that layer also has missing weights. 
for i, var in enumerate(model.weights):
    print(model.weights[i].name)

tf_roberta_model_6 / roberta / encoder / layer _. 8 / Внимание / self / query / kernel: 0 tf_roberta_model_6 / roberta / encoder / layer . 8 / Внимание / self / query / bias: 0 tf_roberta_model_6 / roberta / encoder / layer . 8 / Внимание / self / key / kernel: 0 tf_roberta_model_6 / roberta / encoder / layer . 8 / Внимание / self / key / bias: 0 tf_roberta_model_6 / roberta / encoder / layer . 8 / внимание / self / value / kernel: 0 tf_roberta_model_6 / roberta / encoder / layer ._ 8 / Внимание / self / value / bias: 0

Вот это для всего одного слоя

# Full weights for only one layer 
for i, var in enumerate(layer9.weights):
    print(layer9.weights[i].name)

Результат:

tf_roberta_model_7 / roberta / encoder / layer _. 8 / Внимание / self / query / kernel: 0 tf_roberta_model_7 / roberta / encoder / layer . 8 / Внимание / self / query / bias: 0 tf_roberta_model_7 / roberta / encoder / layer . 8 / Внимание / self / key / kernel: 0 tf_roberta_model_7 / roberta / encoder / layer . * 1 038 * 8 / Внимание / self / key / bias: 0 tf_roberta_model_7 / roberta / encoder / layer . 8 / Внимание / self / value / kernel: 0 tf_roberta_model_7 / roberta / encoder / layer . 8 / Внимание / себя / значение / смещение: 0 tf_roberta_model_7 / roberta / encoder / layer . 8 / Внимание / output / density / kernel: 0 tf_roberta_model_7 / roberta / encoder / layer . 8 / Внимание / вывод / плотность / смещение: 0 tf_roberta_model_7 / roberta / encoder / layer . 8 / Внимание / output / LayerNorm / gamma: 0 tf_roberta_model_7 / roberta / encoder / layer . 8 / Внимание / output / LayerNorm / beta: 0 tf_roberta_model_7 / roberta / encoder / layer . 8 / intermediate / density / kernel: 0 tf_roberta_model_7 / roberta / encoder / layer . 8 / промежуточный / плотный / смещение: 0 tf_roberta_model_7 / roberta / encoder / layer . 8 / output / density / kernel: 0 tf_roberta_model_7 / roberta / encoder / layer . 8 / output / плотный / смещение: 0 tf_roberta_model_7 / roberta / encoder / layer . 8 / output / LayerNorm / gamma: 0 tf_roberta_model_7 / roberta / encoder / layer ._ 8 / out put / LayerNorm / beta: 0

Как видите, у одного слоя больше веса.

Все недостающие слои / веса представлены в сводке модели

model.summary()

Вывод (РЕДАКТИРОВАТЬ: вывод нарушает ограничение символов Stackoverflow, поэтому я вставил только частичный вывод, но полный вывод можно увидеть в этой записной книжке colab https://colab.research.google.com/drive/1n3_XNhdgH6Qo7GT-M570lIKWAoU3TML5?usp=sharing)

И эти веса определенно связаны между собой и проходят вперед. Это можно увидеть, если вы выполните

tf.keras.utils.plot_model(
    model, to_file='model.png', show_shapes=False, show_layer_names=True,
    rankdir='TB', expand_nested=False, dpi=96
)

Изображение слишком велико для отображения, но для удобства эта записная книжка colab содержит весь код, который можно запустить. Выходное изображение будет внизу, даже если ничего не запущено

https://colab.research.google.com/drive/1tbel6PueW3fgFsCd2u8V8eVwLfFk0SEi?usp=sharing

Наконец, я протестировал выходные данные модели keras и запустил слои напрямую, они разные.

# Test what correct output should be 
tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
inputt = tokenizer.encode('This is a sentence', return_tensors='tf')
outt = tempModel(inputt)[0]
hidden1 = layer9((outt, None, None))
layer10((hidden1[0], None, None))

vs

model(outt)

Изменить:

Я пробовал создавать слои с нуля. Я снова получаю ту же проблему. Создается впечатление, что создание модели удаляет целые наборы весов. Вот блокнот для этой попытки с нуля. Редактировать: Я также пробовал создавать слои с нуля и напрямую устанавливать веса, результат тот же. Вот записная книжка Colab, которая делает это. https://colab.research.google.com/drive/1EC_fObSp9lUsj_PFaYgFtRI93ErPYmU9?usp=sharing

...