این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

تنظیم دقیق یک مدل برت

نمایش بر روی TensorFlow.org اجرا در گوگل COLAB مشاهده منبع در گیتهاب دانلود نوت بوک

در این مثال، ما را از طریق ریز تنظیم با استفاده از بسته PIP tensorflow مدل کار یک مدل برت خواهد شد.

مدل برت pretrained این آموزش بر اساس نیز موجود است در است TensorFlow توپی ، تا ببینید که چگونه به استفاده از آن به مراجعه توپی ضمیمه

برپایی

نصب بسته پیپ TensorFlow مدل باغ

  • tf-models-nightly بسته مدل باغ شبانه ایجاد روزانه به طور خودکار است.
  • پیپ همه مدل ها و وابستگی به طور خودکار نصب می شود.
pip install -q tf-nightly
pip install -q tf-models-nightly

واردات

 import os

import numpy as np
import matplotlib.pyplot as plt

import tensorflow as tf

import tensorflow_hub as hub
import tensorflow_datasets as tfds
tfds.disable_progress_bar()

from official.modeling import tf_utils
from official import nlp
from official.nlp import bert

# Load the required submodules
import official.nlp.optimization
import official.nlp.bert.bert_models
import official.nlp.bert.configs
import official.nlp.bert.run_classifier
import official.nlp.bert.tokenization
import official.nlp.data.classifier_data_lib
import official.nlp.modeling.losses
import official.nlp.modeling.models
import official.nlp.modeling.networks
 
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_addons/utils/ensure_tf_install.py:44: UserWarning: You are currently using a nightly version of TensorFlow (2.3.0-dev20200623). 
TensorFlow Addons offers no support for the nightly versions of TensorFlow. Some things might work, some other might not. 
If you encounter a bug, do not file an issue on GitHub.
  UserWarning,

منابع

این پوشه شامل پیکربندی، واژگان، و یک ایستگاه بازرسی از قبل آموزش دیده استفاده در این آموزش:

 gs_folder_bert = "gs://cloud-tpu-checkpoints/bert/keras_bert/uncased_L-12_H-768_A-12"
tf.io.gfile.listdir(gs_folder_bert)
 
['bert_config.json',
 'bert_model.ckpt.data-00000-of-00001',
 'bert_model.ckpt.index',
 'vocab.txt']

شما می توانید یک رمز گذار برت از قبل آموزش دیده از TensorFlow توپی اینجا دریافت کنید:

 hub_url_bert = "https://tfhub.dev/tensorflow/bert_en_uncased_L-12_H-768_A-12/2"
 

داده

در این مثال ما با استفاده از مجموعه داده GLUE MRPC از TFDS .

این مجموعه داده تنظیم نشده است به طوری که می توان آن را به طور مستقیم به مدل برت تغذیه، بنابراین این بخش همچنین این دسته از پیش پردازش لازم است.

مطلع مجموعه داده از TensorFlow مجموعه داده

مایکروسافت تحقیقات تفسیر لاشه (دولان و بروکت، 2005) مجموعه ای از جفت جمله به طور خودکار از منابع خبری آنلاین استخراج شده، با حاشیه نویسی بشر برای اینکه آیا احکام در این جفت ارز معنایی معادل می باشد.

  • تعداد برچسب: 2.
  • اندازه مجموعه داده آموزش: 3،668.
  • اندازه مجموعه داده های ارزیابی: 408.
  • حداکثر طول دنباله ای از آموزش و ارزیابی مجموعه داده: 128.
 glue, info = tfds.load('glue/mrpc', with_info=True,
                       # It's small, load the whole dataset
                       batch_size=-1)
 
Downloading and preparing dataset glue/mrpc/1.0.0 (download: 1.43 MiB, generated: Unknown size, total: 1.43 MiB) to /home/kbuilder/tensorflow_datasets/glue/mrpc/1.0.0...

/usr/lib/python3/dist-packages/urllib3/connectionpool.py:860: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  InsecureRequestWarning)
/usr/lib/python3/dist-packages/urllib3/connectionpool.py:860: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  InsecureRequestWarning)
/usr/lib/python3/dist-packages/urllib3/connectionpool.py:860: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  InsecureRequestWarning)

Shuffling and writing examples to /home/kbuilder/tensorflow_datasets/glue/mrpc/1.0.0.incomplete1RTRDK/glue-train.tfrecord
Shuffling and writing examples to /home/kbuilder/tensorflow_datasets/glue/mrpc/1.0.0.incomplete1RTRDK/glue-validation.tfrecord
Shuffling and writing examples to /home/kbuilder/tensorflow_datasets/glue/mrpc/1.0.0.incomplete1RTRDK/glue-test.tfrecord
Dataset glue downloaded and prepared to /home/kbuilder/tensorflow_datasets/glue/mrpc/1.0.0. Subsequent calls will reuse this data.

 list(glue.keys())
 
['test', 'train', 'validation']

info جسم توصیف مجموعه داده و ویژگی های آن:

 info.features
 
FeaturesDict({
    'idx': tf.int32,
    'label': ClassLabel(shape=(), dtype=tf.int64, num_classes=2),
    'sentence1': Text(shape=(), dtype=tf.string),
    'sentence2': Text(shape=(), dtype=tf.string),
})

دو طبقه عبارتند از:

 info.features['label'].names
 
['not_equivalent', 'equivalent']

در اینجا یک مثال از مجموعه آموزش است:

 glue_train = glue['train']

for key, value in glue_train.items():
  print(f"{key:9s}: {value[0].numpy()}")
 
idx      : 1680
label    : 0
sentence1: b'The identical rovers will act as robotic geologists , searching for evidence of past water .'
sentence2: b'The rovers act as robotic geologists , moving on six wheels .'

tokenizer برت

به لحن خوب یک مدل پیش آموزش دیده شما نیاز به مطمئن شوید که شما با استفاده از دقیقا از Tokenization همان، واژگان، و نقشه برداری شاخص به عنوان شما در طول آموزش استفاده می شود.

tokenizer برت استفاده در این آموزش در خالص پایتون (آن را از عملیات TensorFlow ساخته نشده) نوشته شده است. بنابراین شما می توانید نه تنها آن را به مدل های خود را به عنوان یک پلاگین keras.layer مثل شما می توانید با preprocessing.TextVectorization .

کد زیر را بازسازی tokenizer که مدل پایه مورد استفاده قرار گرفت:

 # Set up tokenizer to generate Tensorflow dataset
tokenizer = bert.tokenization.FullTokenizer(
    vocab_file=os.path.join(gs_folder_bert, "vocab.txt"),
     do_lower_case=True)

print("Vocab size:", len(tokenizer.vocab))
 
Vocab size: 30522

Tokenize یک جمله:

 tokens = tokenizer.tokenize("Hello TensorFlow!")
print(tokens)
ids = tokenizer.convert_tokens_to_ids(tokens)
print(ids)
 
['hello', 'tensor', '##flow', '!']
[7592, 23435, 12314, 999]

پیش پردازش داده ها

بخش دستی مجموعه داده را به فرمت انتظار می رود با استفاده از مدل پیش پردازش.

این مجموعه داده کوچک است، بنابراین فرآیندی می تواند به سرعت و به راحتی در حافظه انجام می شود. برای مجموعه داده های بزرگتر tf_models کتابخانه شامل برخی از ابزار برای پیش پردازش و دوباره serialize کردن یک مجموعه داده. مشاهده پیوست: رمزگذاری مجدد یک مجموعه داده بزرگ برای جزئیات بیشتر.

رمز جملات

مدل انتظار دو جمله ورودی های آن به هم متصل می شود. این ورودی انتظار می رود که با شروع [CLS] "این یک مشکل طبقه بندی" رمز و هر جمله باید با یک پایان [SEP] "جدا" رمز:

 tokenizer.convert_tokens_to_ids(['[CLS]', '[SEP]'])
 
[101, 102]

شروع با رمزگذاری تمام جملات در حالی که افزودن یک [SEP] رمز و بسته بندی آنها را با سطح غیر مسطح-تانسورها:

 def encode_sentence(s):
   tokens = list(tokenizer.tokenize(s.numpy()))
   tokens.append('[SEP]')
   return tokenizer.convert_tokens_to_ids(tokens)

sentence1 = tf.ragged.constant([
    encode_sentence(s) for s in glue_train["sentence1"]])
sentence2 = tf.ragged.constant([
    encode_sentence(s) for s in glue_train["sentence2"]])
 
 print("Sentence1 shape:", sentence1.shape.as_list())
print("Sentence2 shape:", sentence2.shape.as_list())
 
Sentence1 shape: [3668, None]
Sentence2 shape: [3668, None]

حالا prepend کنید [CLS] رمز، و الحاق تانسورها پاره پاره به شکل یک واحد input_word_ids تانسور برای هر یک مثال. RaggedTensor.to_tensor() صفر پد به طولانی ترین توالی.

 cls = [tokenizer.convert_tokens_to_ids(['[CLS]'])]*sentence1.shape[0]
input_word_ids = tf.concat([cls, sentence1, sentence2], axis=-1)
_ = plt.pcolormesh(input_word_ids.to_tensor())
 

PNG

ماسک و ورودی نوع

مدل انتظار دو ورودی اضافی:

  • ماسک ورودی
  • نوع ورودی

ماسک اجازه می دهد تا مدل به افتراق پاک بین محتوا و لایه. ماسک به شکل همان input_word_ids است، و شامل 1 در هر نقطه input_word_ids است بالشتک است.

 input_mask = tf.ones_like(input_word_ids).to_tensor()

plt.pcolormesh(input_mask)
 
<matplotlib.collections.QuadMesh at 0x7f82246c0cf8>

PNG

"نوع ورودی" همچنین دارای همان شکل، اما در داخل منطقه غیر خالی، شامل یک 0 یا 1 نشان می دهد که جمله این نشانه رمز بخشی از است.

 type_cls = tf.zeros_like(cls)
type_s1 = tf.zeros_like(sentence1)
type_s2 = tf.ones_like(sentence2)
input_type_ids = tf.concat([type_cls, type_s1, type_s2], axis=-1).to_tensor()

plt.pcolormesh(input_type_ids)
 
<matplotlib.collections.QuadMesh at 0x7f8224668438>

PNG

آن قرار دهید همه با هم

جمع آوری کد تجزیه متن بالا را در یک تابع تک، و اعمال آن را به هر تقسیم از glue/mrpc مجموعه داده.

 def encode_sentence(s, tokenizer):
   tokens = list(tokenizer.tokenize(s))
   tokens.append('[SEP]')
   return tokenizer.convert_tokens_to_ids(tokens)

def bert_encode(glue_dict, tokenizer):
  num_examples = len(glue_dict["sentence1"])
  
  sentence1 = tf.ragged.constant([
      encode_sentence(s, tokenizer)
      for s in np.array(glue_dict["sentence1"])])
  sentence2 = tf.ragged.constant([
      encode_sentence(s, tokenizer)
       for s in np.array(glue_dict["sentence2"])])

  cls = [tokenizer.convert_tokens_to_ids(['[CLS]'])]*sentence1.shape[0]
  input_word_ids = tf.concat([cls, sentence1, sentence2], axis=-1)

  input_mask = tf.ones_like(input_word_ids).to_tensor()

  type_cls = tf.zeros_like(cls)
  type_s1 = tf.zeros_like(sentence1)
  type_s2 = tf.ones_like(sentence2)
  input_type_ids = tf.concat(
      [type_cls, type_s1, type_s2], axis=-1).to_tensor()

  inputs = {
      'input_word_ids': input_word_ids.to_tensor(),
      'input_mask': input_mask,
      'input_type_ids': input_type_ids}

  return inputs
 
 glue_train = bert_encode(glue['train'], tokenizer)
glue_train_labels = glue['train']['label']

glue_validation = bert_encode(glue['validation'], tokenizer)
glue_validation_labels = glue['validation']['label']

glue_test = bert_encode(glue['test'], tokenizer)
glue_test_labels  = glue['test']['label']
 

هر زیر مجموعه از داده شده است به یک فرهنگ لغت از ویژگی های، و مجموعه ای از برچسب تبدیل شده است. هر یک از ویژگی در فرهنگ لغت ورودی است به همان شکل، و تعداد برچسب باید مطابقت:

 for key, value in glue_train.items():
  print(f'{key:15s} shape: {value.shape}')

print(f'glue_train_labels shape: {glue_train_labels.shape}')
 
input_word_ids  shape: (3668, 103)
input_mask      shape: (3668, 103)
input_type_ids  shape: (3668, 103)
glue_train_labels shape: (3668,)

مدل

ساخت مدل

اولین قدم این است برای دانلود این پیکربندی را برای مدل های از پیش آموزش داده است.

 import json

bert_config_file = os.path.join(gs_folder_bert, "bert_config.json")
config_dict = json.loads(tf.io.gfile.GFile(bert_config_file).read())

bert_config = bert.configs.BertConfig.from_dict(config_dict)

config_dict
 
{'attention_probs_dropout_prob': 0.1,
 'hidden_act': 'gelu',
 'hidden_dropout_prob': 0.1,
 'hidden_size': 768,
 'initializer_range': 0.02,
 'intermediate_size': 3072,
 'max_position_embeddings': 512,
 'num_attention_heads': 12,
 'num_hidden_layers': 12,
 'type_vocab_size': 2,
 'vocab_size': 30522}

config هسته برت مدل، که یک مدل برای پیش بینی Keras خروجی تعریف می کند num_classes از ورودی با طول حداکثر توالی max_seq_length .

این تابع هر دو رمزگذار و طبقه بندی می گرداند.

 bert_classifier, bert_encoder = bert.bert_models.classifier_model(
    bert_config, num_labels=2)
 

طبقه بندی دارای سه ورودی و یک خروجی:

 tf.keras.utils.plot_model(bert_classifier, show_shapes=True, dpi=48)
 

PNG

اجرای آن را در دسته ای آزمون داده ها 10 نمونه از مجموعه آموزش. خروجی logits برای دو کلاس است:

 glue_batch = {key: val[:10] for key, val in glue_train.items()}

bert_classifier(
    glue_batch, training=True
).numpy()
 
array([[ 0.05488977, -0.26042116],
       [ 0.11358108, -0.09727937],
       [ 0.14350253, -0.2465629 ],
       [ 0.2775127 , -0.09028438],
       [ 0.3606584 , -0.17138724],
       [ 0.3287397 , -0.14672714],
       [ 0.18621178, -0.13080403],
       [ 0.21898738,  0.10716071],
       [ 0.18413854, -0.13491377],
       [ 0.20307963, -0.05396855]], dtype=float32)

TransformerEncoder در مرکز طبقه بندی بالا است bert_encoder .

بازرسی رمزگذار، ما می بینیم پشته آن از Transformer لایه متصل به کسانی که در همان سه ورودی:

 tf.keras.utils.plot_model(bert_encoder, show_shapes=True, dpi=48)
 

PNG

بازگرداندن وزن رمزگذار

هنگامی که ساخته شده رمزگذار است به طور تصادفی مقداردهی اولیه. بازگرداندن وزن رمزگذار از ایست بازرسی:

 checkpoint = tf.train.Checkpoint(model=bert_encoder)
checkpoint.restore(
    os.path.join(gs_folder_bert, 'bert_model.ckpt')).assert_consumed()
 
<tensorflow.python.training.tracking.util.CheckpointLoadStatus at 0x7f8242dadc88>

تنظیم بهینه ساز

برت تصویب بهینه ساز آدم با پوسیدگی وزن (با نام مستعار " AdamW "). همچنین این استخدام برنامه نرخ یادگیری است که اولا موجب گرم از 0 و سپس زایل می شود به 0.

 # Set up epochs and steps
epochs = 3
batch_size = 32
eval_batch_size = 32

train_data_size = len(glue_train_labels)
steps_per_epoch = int(train_data_size / batch_size)
num_train_steps = steps_per_epoch * epochs
warmup_steps = int(epochs * train_data_size * 0.1 / batch_size)

# creates an optimizer with learning rate schedule
optimizer = nlp.optimization.create_optimizer(
    2e-5, num_train_steps=num_train_steps, num_warmup_steps=warmup_steps)
 

این گرداند AdamWeightDecay بهینه ساز با مجموعه برنامه نرخ یادگیری:

 type(optimizer)
 
official.nlp.optimization.AdamWeightDecay

برای دیدن نمونه ای از چگونه به سفارشی بهینه ساز و برنامه آن، را ببینید برنامه آپاندیس بهینه ساز .

آموزش مدل

متریک دقت است و ما با استفاده از پراکنده طبقه متقابل آنتروپی به عنوان از دست دادن.

 metrics = [tf.keras.metrics.SparseCategoricalAccuracy('accuracy', dtype=tf.float32)]
loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

bert_classifier.compile(
    optimizer=optimizer,
    loss=loss,
    metrics=metrics)

bert_classifier.fit(
      glue_train, glue_train_labels,
      validation_data=(glue_validation, glue_validation_labels),
      batch_size=32,
      epochs=epochs)
 
Epoch 1/3
115/115 [==============================] - 25s 218ms/step - loss: 0.7047 - accuracy: 0.6101 - val_loss: 0.5219 - val_accuracy: 0.7181
Epoch 2/3
115/115 [==============================] - 24s 210ms/step - loss: 0.5068 - accuracy: 0.7560 - val_loss: 0.5047 - val_accuracy: 0.7794
Epoch 3/3
115/115 [==============================] - 24s 209ms/step - loss: 0.3812 - accuracy: 0.8332 - val_loss: 0.4839 - val_accuracy: 0.8137

<tensorflow.python.keras.callbacks.History at 0x7f82107c8cf8>

در حال حاضر مدل-خوب تنظیم اجرا بر روی یک مثال سفارشی را به دیدن آن کار می کند.

شروع با رمزگذاری برخی جفت جمله:

 my_examples = bert_encode(
    glue_dict = {
        'sentence1':[
            'The rain in Spain falls mainly on the plain.',
            'Look I fine tuned BERT.'],
        'sentence2':[
            'It mostly rains on the flat lands of Spain.',
            'Is it working? This does not match.']
    },
    tokenizer=tokenizer)
 

مدل باید کلاس گزارش 1 "بازی" برای مثال اول و طبقه 0 "هیچ بازی" برای دوم:

 result = bert_classifier(my_examples, training=False)

result = tf.argmax(result).numpy()
result
 
array([1, 0])
 np.array(info.features['label'].names)[result]
 
array(['equivalent', 'not_equivalent'], dtype='<U14')

ذخیره مدل

اغلب که هدف از آموزش یک مدل است که استفاده از آن را برای چیزی، به طوری که صادرات مدل و سپس بازگرداندن آن به مطمئن شوید که آن کار می کند.

 export_dir='./saved_model'
tf.saved_model.save(bert_classifier, export_dir=export_dir)
 
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/tracking/tracking.py:111: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/tracking/tracking.py:111: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/tracking/tracking.py:111: Layer.updates (from tensorflow.python.keras.engine.base_layer) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/tracking/tracking.py:111: Layer.updates (from tensorflow.python.keras.engine.base_layer) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.

INFO:tensorflow:Assets written to: ./saved_model/assets

INFO:tensorflow:Assets written to: ./saved_model/assets

 reloaded = tf.saved_model.load(export_dir)
reloaded_result = reloaded([my_examples['input_word_ids'],
                            my_examples['input_mask'],
                            my_examples['input_type_ids']], training=False)

original_result = bert_classifier(my_examples, training=False)

# The results are (nearly) identical:
print(original_result.numpy())
print()
print(reloaded_result.numpy())
 
[[-1.1238481   0.92107666]
 [ 0.35722053 -0.4061358 ]]

[[-1.1238478   0.9210764 ]
 [ 0.35722044 -0.40613574]]

ضمیمه

رمزگذاری مجدد یک مجموعه داده های بزرگ

این آموزش به شما دوباره کد گذاری مجموعه داده در حافظه، برای وضوح.

این تنها راه ممکن بود، زیرا glue/mrpc یک مجموعه داده بسیار کوچک است. برای مقابله با مجموعه داده های بزرگتر tf_models کتابخانه شامل برخی از ابزار برای پردازش و کدگذاری مجدد یک مجموعه داده برای آموزش کارآمد می باشد.

اولین قدم این است که برای توصیف ویژگی های که از مجموعه داده باید تبدیل شود:

 processor = nlp.data.classifier_data_lib.TfdsProcessor(
    tfds_params="dataset=glue/mrpc,text_key=sentence1,text_b_key=sentence2",
    process_text_fn=bert.tokenization.convert_to_unicode)
 

سپس تبدیل به تولید فایل های TFRecord جدید اعمال می شود.

 # Set up output of training and evaluation Tensorflow dataset
train_data_output_path="./mrpc_train.tf_record"
eval_data_output_path="./mrpc_eval.tf_record"

max_seq_length = 128
batch_size = 32
eval_batch_size = 32

# Generate and save training data into a tf record file
input_meta_data = (
    nlp.data.classifier_data_lib.generate_tf_record_from_data_file(
      processor=processor,
      data_dir=None,  # It is `None` because data is from tfds, not local dir.
      tokenizer=tokenizer,
      train_data_output_path=train_data_output_path,
      eval_data_output_path=eval_data_output_path,
      max_seq_length=max_seq_length))
 

در نهایت ایجاد tf.data خطوط لوله ورودی از کسانی فایل های TFRecord:

 training_dataset = bert.run_classifier.get_dataset_fn(
    train_data_output_path,
    max_seq_length,
    batch_size,
    is_training=True)()

evaluation_dataset = bert.run_classifier.get_dataset_fn(
    eval_data_output_path,
    max_seq_length,
    eval_batch_size,
    is_training=False)()

 

در نتیجه tf.data.Datasets بازگشت (features, labels) جفت، به عنوان انتظار می رود keras.Model.fit :

 training_dataset.element_spec
 
({'input_word_ids': TensorSpec(shape=(32, 128), dtype=tf.int32, name=None),
  'input_mask': TensorSpec(shape=(32, 128), dtype=tf.int32, name=None),
  'input_type_ids': TensorSpec(shape=(32, 128), dtype=tf.int32, name=None)},
 TensorSpec(shape=(32,), dtype=tf.int32, name=None))

درست tf.data.Dataset برای آموزش و ارزیابی

اگر شما نیاز به تغییر بارگذاری داده ها در اینجا برخی از کد به شما آغاز شده است:

 def create_classifier_dataset(file_path, seq_length, batch_size, is_training):
  """Creates input dataset from (tf)records files for train/eval."""
  dataset = tf.data.TFRecordDataset(file_path)
  if is_training:
    dataset = dataset.shuffle(100)
    dataset = dataset.repeat()

  def decode_record(record):
    name_to_features = {
      'input_ids': tf.io.FixedLenFeature([seq_length], tf.int64),
      'input_mask': tf.io.FixedLenFeature([seq_length], tf.int64),
      'segment_ids': tf.io.FixedLenFeature([seq_length], tf.int64),
      'label_ids': tf.io.FixedLenFeature([], tf.int64),
    }
    return tf.io.parse_single_example(record, name_to_features)

  def _select_data_from_record(record):
    x = {
        'input_word_ids': record['input_ids'],
        'input_mask': record['input_mask'],
        'input_type_ids': record['segment_ids']
    }
    y = record['label_ids']
    return (x, y)

  dataset = dataset.map(decode_record,
                        num_parallel_calls=tf.data.experimental.AUTOTUNE)
  dataset = dataset.map(
      _select_data_from_record,
      num_parallel_calls=tf.data.experimental.AUTOTUNE)
  dataset = dataset.batch(batch_size, drop_remainder=is_training)
  dataset = dataset.prefetch(tf.data.experimental.AUTOTUNE)
  return dataset
 
 # Set up batch sizes
batch_size = 32
eval_batch_size = 32

# Return Tensorflow dataset
training_dataset = create_classifier_dataset(
    train_data_output_path,
    input_meta_data['max_seq_length'],
    batch_size,
    is_training=True)

evaluation_dataset = create_classifier_dataset(
    eval_data_output_path,
    input_meta_data['max_seq_length'],
    eval_batch_size,
    is_training=False)
 
 training_dataset.element_spec
 
({'input_word_ids': TensorSpec(shape=(32, 128), dtype=tf.int64, name=None),
  'input_mask': TensorSpec(shape=(32, 128), dtype=tf.int64, name=None),
  'input_type_ids': TensorSpec(shape=(32, 128), dtype=tf.int64, name=None)},
 TensorSpec(shape=(32,), dtype=tf.int64, name=None))

TFModels برت در TFHub

شما می توانید مدل برت کردن قفسه از TFHub . آن را نمی خواهد سخت برای اضافه کردن یک سر طبقه بندی در بالای این hub.KerasLayer

 # Note: 350MB download.
import tensorflow_hub as hub
hub_encoder = hub.KerasLayer(hub_url_bert, trainable=True)

print(f"The Hub encoder has {len(hub_encoder.trainable_variables)} trainable variables")
 
The Hub encoder has 199 trainable variables

تست آن را اجرا روی یک دسته از داده ها:

 result = hub_encoder(
    inputs=[glue_train['input_word_ids'][:10],
            glue_train['input_mask'][:10],
            glue_train['input_type_ids'][:10],],
    training=False,
)

print("Pooled output shape:", result[0].shape)
print("Sequence output shape:", result[1].shape)
 
Pooled output shape: (10, 768)
Sequence output shape: (10, 103, 768)

در این مرحله این امر می تواند ساده برای اضافه کردن یک سر طبقه بندی کنید.

bert_models.classifier_model تابع همچنین می توانید یک طبقه بندی بر روی رمز گذار از TensorFlow توپی ساخت:

 hub_classifier, hub_encoder = bert.bert_models.classifier_model(
    # Caution: Most of `bert_config` is ignored if you pass a hub url.
    bert_config=bert_config, hub_module_url=hub_url_bert, num_labels=2)
 

یکی حرکت نزولی به بارگذاری این مدل از TFHub است که ساختار لایه keras داخلی ترمیم نیست. پس از آن سخت تر به بازرسی یا تغییر مدل. TransformerEncoder مدل در حال حاضر یک تک لایه:

 tf.keras.utils.plot_model(hub_classifier, show_shapes=True, dpi=64)
 

PNG

 try:
  tf.keras.utils.plot_model(hub_encoder, show_shapes=True, dpi=64)
  assert False
except Exception as e:
  print(f"{type(e).__name__}: {e}")
 
AttributeError: 'KerasLayer' object has no attribute 'layers'

سطح پایین مدل سازی

اگر شما نیاز به یک کنترل بیشتری بر ساخت و ساز از مدل ارزش آن را اشاره کرد که classifier_model تابع قبل از آن استفاده است که واقعا فقط یک لفاف بسته بندی نازک بر روی nlp.modeling.networks.TransformerEncoder و nlp.modeling.models.BertClassifier کلاس. فقط به یاد داشته باشید که اگر شما شروع اصلاح معماری آن ممکن است درست و یا ممکن است به بازنگری ایست بازرسی از قبل آموزش دیده بنابراین شما نیاز به آموزش مجدد، از ابتدا.

ساخت رمزگذار:

 transformer_config = config_dict.copy()

# You need to rename a few fields to make this work:
transformer_config['attention_dropout_rate'] = transformer_config.pop('attention_probs_dropout_prob')
transformer_config['activation'] = tf_utils.get_activation(transformer_config.pop('hidden_act'))
transformer_config['dropout_rate'] = transformer_config.pop('hidden_dropout_prob')
transformer_config['initializer'] = tf.keras.initializers.TruncatedNormal(
          stddev=transformer_config.pop('initializer_range'))
transformer_config['max_sequence_length'] = transformer_config.pop('max_position_embeddings')
transformer_config['num_layers'] = transformer_config.pop('num_hidden_layers')

transformer_config
 
{'hidden_size': 768,
 'intermediate_size': 3072,
 'num_attention_heads': 12,
 'type_vocab_size': 2,
 'vocab_size': 30522,
 'attention_dropout_rate': 0.1,
 'activation': <function official.modeling.activations.gelu.gelu(x)>,
 'dropout_rate': 0.1,
 'initializer': <tensorflow.python.keras.initializers.initializers_v2.TruncatedNormal at 0x7f81145cb3c8>,
 'max_sequence_length': 512,
 'num_layers': 12}
 manual_encoder = nlp.modeling.networks.TransformerEncoder(**transformer_config)
 

بازگرداندن وزن:

 checkpoint = tf.train.Checkpoint(model=manual_encoder)
checkpoint.restore(
    os.path.join(gs_folder_bert, 'bert_model.ckpt')).assert_consumed()
 
<tensorflow.python.training.tracking.util.CheckpointLoadStatus at 0x7f813c336fd0>

تست آن را اجرا کنید:

 result = manual_encoder(my_examples, training=True)

print("Sequence output shape:", result[0].shape)
print("Pooled output shape:", result[1].shape)
 
Sequence output shape: (2, 23, 768)
Pooled output shape: (2, 768)

قرار دادن آن در یک طبقه بندی:

 manual_classifier = nlp.modeling.models.BertClassifier(
        bert_encoder,
        num_classes=2,
        dropout_rate=transformer_config['dropout_rate'],
        initializer=tf.keras.initializers.TruncatedNormal(
          stddev=bert_config.initializer_range))
 
 manual_classifier(my_examples, training=True).numpy()
 
array([[-0.22512403,  0.07213479],
       [-0.21233292,  0.1311737 ]], dtype=float32)

بهینه و برنامه

بهینه ساز مورد استفاده برای آموزش مدل با استفاده از ایجاد شد nlp.optimization.create_optimizer تابع:

 optimizer = nlp.optimization.create_optimizer(
    2e-5, num_train_steps=num_train_steps, num_warmup_steps=warmup_steps)
 

که سطح بالا لفاف بسته بندی مجموعه کردن برنامه نرخ یادگیری و بهینه ساز.

برنامه نرخ یادگیری پایه استفاده می شود در اینجا یک فروپاشی خطی به صفر بر آموزش در اجرا است:

 epochs = 3
batch_size = 32
eval_batch_size = 32

train_data_size = len(glue_train_labels)
steps_per_epoch = int(train_data_size / batch_size)
num_train_steps = steps_per_epoch * epochs
 
 decay_schedule = tf.keras.optimizers.schedules.PolynomialDecay(
      initial_learning_rate=2e-5,
      decay_steps=num_train_steps,
      end_learning_rate=0)

plt.plot([decay_schedule(n) for n in range(num_train_steps)])
 
[<matplotlib.lines.Line2D at 0x7f8115ab5320>]

PNG

این به نوبه خود در یک پیچیده WarmUp برنامه است که به صورت خطی افزایش می دهد نرخ یادگیری به ارزش هدف بیش از 10٪ از آموزش:

 warmup_steps = num_train_steps * 0.1

warmup_schedule = nlp.optimization.WarmUp(
        initial_learning_rate=2e-5,
        decay_schedule_fn=decay_schedule,
        warmup_steps=warmup_steps)

# The warmup overshoots, because it warms up to the `initial_learning_rate`
# following the original implementation. You can set
# `initial_learning_rate=decay_schedule(warmup_steps)` if you don't like the
# overshoot.
plt.plot([warmup_schedule(n) for n in range(num_train_steps)])
 
[<matplotlib.lines.Line2D at 0x7f81150c27f0>]

PNG

سپس ایجاد nlp.optimization.AdamWeightDecay با استفاده از آن برنامه، پیکربندی برای مدل برت:

 optimizer = nlp.optimization.AdamWeightDecay(
        learning_rate=warmup_schedule,
        weight_decay_rate=0.01,
        epsilon=1e-6,
        exclude_from_weight_decay=['LayerNorm', 'layer_norm', 'bias'])