kii_2688
@kii_2688 (kii)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

tokenizer.encodeが使えない

解決したいこと

・AttributeError: module 'tokenizer' has no attribute 'encode'を解消したい

googlecolabで作成したPytorchの学習モデルを保存して、ローカルの環境で利用しようと考えています。

https://qiita.com/Yokohide/items/e74254f334e1335cd502
↑使用している学習モデルはこの記事を参考にしています。
colab上での実行は成功しています。

該当のコード

test_model.py
import torch
import torch.nn as nn
import torch.nn.functional as F
import tokenizer 

    
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(3, 3)
 
    def forward(self, x):
        x = F.relu(self.fc1(x))
        return x

def generate_reply(inp, num_gen=1):
    device = torch.device('cpu')
    input_text = "<s>" + str(inp) + "[SEP]"
    model= Net().to(device)
    model.load_state_dict(torch.load("model.pth", map_location=device),strict=False)
    

    input_ids = tokenizer.encode(input_text, return_tensors='pt').to(device)
    out = model.generate(input_ids, do_sample=True, max_length=64, num_return_sequences=num_gen, 
                         top_p=0.95, top_k=20, bad_words_ids=[[1], [5]], no_repeat_ngram_size=3)
    
    
    print(">", "あなた")
    print(inp)
    print(">", "あいて")
    for sent in tokenizer.batch_decode(out):
        sent = sent.split('[SEP]</s>')[1]
        sent = sent.replace('</s>', '')
        sent = sent.replace('<br>', '\n')
        print(sent)
call_test_model.py
import test_model

test_model.generate_reply('こんにちわ')

表示されているエラー

Traceback (most recent call last):
  File "c:\Users\81906\Downloads\linebot\test_model_call.py", line 3, in <module>
    test_model.generate_reply('こんにちわ')
  File "c:\Users\81906\Downloads\linebot\test_model.py", line 23, in generate_reply
    input_ids = tokenizer.encode(input_text, return_tensors='pt')
AttributeError: module 'tokenizer' has no attribute 'encode'

自分で試したこと

・公式ドキュメントを読みtokenizerがencode属性を持つことを確認
・colab上で動作することを再確認

colab上でGPUを用いて作成したモデルをローカルでCPUを用いて実行しようとしています。(自前のPCがGPUを搭載していないため)
モデルをアップロード(?)して利用するのが初めてなので、そもそもtokenizerが問題ではなく、学習モデルの読み込みが間違っている可能性もあります。

有識者の方、ご教授いただけると幸いです。よろしくお願いします。

0

1Answer

公式ドキュメントを読みtokenizerがencode属性を持つことを確認

import tokenizerを使われたということは,次のライブラリを採用されたようですが

encode属性,無いです...

参考にされた記事で貼っているJupyter Notebookのリンクを見に行ったところ

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("rinna/japanese-gpt2-small")

のようにしてtransformersAutoTokenizerを利用してtokenizerインスタンスを生成していました.

ここで得られたGPT2Tokenizer ClassPreTraindTokenizer Classから継承されており,これは確かにencode()属性を持っています.

ちゃんとtransformersからtokenizerを作成しましょう.

1Like

Comments

  1. @kii_2688

    Questioner

    ご指摘ありがとうございました。おっしゃる通りで、参考にした記事ではインスタンスを作成していますね。他の記事も見ていたのですが、インスタンスの作成のコードは見ておらず、インスタンスの作成やAutotalkenizerのインポートにも気づきませんでした。
    以後、コードを入念に確認するようにします。ありがとうございました。
  2. まあ,省略した参考記事がちょっと初見殺しではありますが,なんとか前後の文脈から読み取るとか,そういった力を要求されちゃってますね…NLPだけに…ひとまず解決おめでとうございます,本質問は「クローズ」にしてください.お疲れ様でした

Your answer might help someone💌