前提
・言語:Python3
・ライブラリ:transformers
実装
コードはここ
###1. ライブラリインポート
import transformers
import torch
###2. 文字数の最大値を決める
モデルに入力する文字列は、同じ長さにならないことがほとんどです。一方で、モデルでこの文字列データでテンソル計算をするためには長さを同じにする必要があります。なので、最大値を決めて、その長さに達しない物にはパッディング文字でその長さまで埋めていきます。(次節)
MAX_LENGTH = 192
###4. 文字をIDに置き換える&Special Tokenを付加する
説明はここで。
tokenizer = transformers.AutoTokenizer.from_pretrained("roberta-base")
text = "This is a pen."
text2 = "I am a man"
ids = tokenizer.encode(text)
ids2 = tokenizer.encode(text2)
token_ids = tokenizer.build_inputs_with_special_tokens(ids, ids2)
###3. パディング&Attention Maskの作成
パティングは前節で説明した通りです。
Attention Maskはどこまで有効な文字で、どこからがパディングなのかモデルに知らせるためのものです。有効な文字では「1」、パディング文字では「0」になります。
#Attention Mask
mask = [1] * len(token_ids)
#Padding
padding_length = MAX_LENGTH - len(token_ids)
if padding_length > 0:
token_ids = token_ids + ([1] * padding_length)
mask = mask + ([0] * padding_length)
###4. モデルの生成
「roberta-base」を違うモデル名にすることで、そのモデルを生成することができます。他のモデルはここ。
model = transformers.AutoModel.from_pretrained("roberta-base")
###5. モデルで文字列を特徴量に変換
ここまで入力した文字列をIDにするところまでしました。list型なのでtorch.tensor型にしてあげます。
モデルに入力すると出力として、(1)BertLayerの最終層の出力と、(2)その(1)の出力をBertPoolerで処理した値が出力されます。
それぞれ、サイズとしては下記コードの出力結果通りです。
#IDとmaskをmodelに入力できる型(list -> pytorch.tenrsor)に変換
token_ids_tensor = torch.tensor([token_ids], dtype=torch.long)
mask_tensor = torch.tensor([mask], dtype=torch.long)
#変換
out = model(input_ids=token_ids_tensor, attention_mask=mask_tensor)
print(out[0].shape)
#output
#torch.Size([1, 192, 768])
print(out[1].shape)
#output
#torch.Size([1, 768])