前提
bertの勉強をしようと軽く触れた段階です。プログラミング自体初心者です。
https://www.ai-shift.jp/techblog/281
勉強にあたって、上記のサイトのコードを実行してみたところ、indexエラーが出ました。
また、エラーの原因と思われる部分のコードがどういった働き(動き)をしているのかを理解できなかったので、併せてご教授いただければ幸いです。
_, predicted_indexes = torch.topk(predictions[masked_index+1], k=1000)
実現したいこと
正常に出力されるようにする。
発生している問題・エラーメッセージ
--------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-48-1bd1a0f626d1> in <module> 1 text = 'Customer reviews indicate that many modern mobile devices are often unnecessarily * .' 2 candidate = ["complication", "complicates", "complicate", "complicated"] ----> 3 print(part5_slover(text,candidate)) <ipython-input-47-2884533de229> in part5_slover(text, candidate) 13 predictions = outputs[0] 14 ---> 15 _, predicted_indexes = torch.topk(predictions[masked_index+1], k=1000) 16 predicted_tokens = tokenizer.convert_ids_to_tokens(predicted_indexes.tolist()) 17 IndexError: string index out of range
該当のソースコード
def part5_slover(text, candidate): tokens = tokenizer.tokenize(text) masked_index = tokens.index("*") #何番目に*が出てくるのか(数値) tokens[masked_index] = "[MASK]" #*をMASKに変更 tokens = ["[CLS]"] + tokens + ["[SEP]"] #前後に[CLS][SEP]追加 ids = tokenizer.convert_tokens_to_ids(tokens) #id化 ids = torch.tensor(ids).reshape(1,-1) #テンソル化 ids = ids.cuda() with torch.no_grad(): outputs, _ = model(ids) predictions = outputs[0] _, predicted_indexes = torch.topk(predictions[masked_index+1], k=1000) predicted_tokens = tokenizer.convert_ids_to_tokens(predicted_indexes.tolist()) for i, v in enumerate(predicted_tokens): if v in candidate: return (i, v) return "don't know"
text = 'Customer reviews indicate that many modern mobile devices are often unnecessarily * .' candidate = ["complication", "complicates", "complicate", "complicated"] print(part5_slover(text,candidate))
「def part5_slover(text, candidate):」関数内のエラーが出てる行のすぐ上に下記を追加して実行したら分かりますけど、「predictions」は「p」という文字が一つ入ってるだけです
print(outputs)
print(predictions)
print(type(predictions))
print(len(predictions))
print(masked_index)
一文字なので、参照できるのは下記だけです
predictions[0]
それなのに、「predictions[masked_index+1]」で「masked_index+1」(=16)番目を参照しようとして、エラーになってます
> outputs, _ = model(ids)
を実行した結果の時点の「outputs」が既にダメですよね
丁寧にありがとうございますm(_ _)m
勉強になります。
今コードを触れる環境にないので後ほど試してみます。
別件になりますが、良ければ教えて頂きたいです。outputsの後ろや、predicted indexesの前後についている -, や _, の働きについて知りたいです。調べてみましたがよく分かりませんでした…。
> _, の働きについて知りたいです。
https://mako-note.com/ja/python-underscore/#%E3%82%A2%E3%83%B3%E3%83%80%E3%83%BC%E3%82%B9%E3%82%B3%E3%82%A2%E3%81%AE%E3%81%BF
の「アンダースコアのみ」を見てください
ありがとうございます。
回答1件
あなたの回答
tips
プレビュー