質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

9023閲覧

No module named 'transformers.models'エラーが出ています、どうしたらいいですか。

fatima2022

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/04/29 08:54


自然言語処理モデル(BERT)を利用した日本語の文章分類 〜GoogleColab & Pytorchによるファインチューニングしています。
--> 138 from transformers import BertForSequenceClassification, AdamW, BertConfig
139
140

3 frames
/usr/lib/python3.7/importlib/init.py in import_module(name, package)
125 break
126 level += 1
--> 127 return _bootstrap._gcd_import(name[level:], package, level)
128
129

ModuleNotFoundError: No module named 'transformers.models'

#BERTで二値分類するプログラム(Google Colab用)

##■tensorflowのバージョンを2に指定
%tensorflow_version 2.x

##■transformerをインストール
!pip install transformers

##■pytorchをimportし、GPUが使えれば、実行環境をGPUに変更
import torch
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

##■pandasをimportし、データを読み込むボールドテキスト
import pandas as pd
df = pd.read_csv("sinaq001.csv", delimiter=',', header=None, names=['label', 'sentence'])
print(f'データサイズ: {df.shape}')
df.sample(10)

##■必要なデータを、リスト(sentences, labels, labels2)に格納
sentences = df.sentence.values
labels = df.label.values
sentences = sentences[1:]
labels = labels[1:]
labels2 = []
for l in labels:
l2 = int(l)
labels2.append(l2)

##■形態素解析器(MeCab), 辞書(IPADIC), pythonバインディング(fugashi)のインストール
!apt install aptitude swig
!aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y
!pip install mecab-python3
!pip install ipadic
!pip install fugashi

##■ 日本語BERT Tokenizerの準備。(モデルは既にライブラリ内に準備されている)
from transformers.tokenization_bert_japanese import BertJapaneseTokenizer
tokenizer = BertJapaneseTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking')

##■
##■ データを処理する。
##■
input_ids = []
attention_masks = []
inds = []

1文づつ処理

for sent in sentences:
token_words = tokenizer.tokenize(sent)
encoded_dict = tokenizer.encode_plus(
sent,
add_special_tokens = True, # Special Tokenの追加
truncation=True,
max_length = 200, # 文章の長さを固定(Padding/Trancatinating)
pad_to_max_length = True,# PADDINGで埋める
return_attention_mask = True, # Attention maksの作成
return_tensors = 'pt', # Pytorch tensorsで返す
)

# 単語IDを取得 input_ids.append(encoded_dict['input_ids']) # Attention maskの取得 attention_masks.append(encoded_dict['attention_mask'])

リストに入ったtensorを縦方向(dim=0)へ結合

input_ids = torch.cat(input_ids, dim=0)
attention_masks = torch.cat(attention_masks, dim=0)

for i in range(0,len(labels2)):
inds.append(i)
inds = torch.tensor(inds)

tenosor型に変換

print(labels2)
labels = torch.tensor(labels2)

確認

print('Original: ', sentences[0])
print('Token IDs:', input_ids[0])

##■
##■ 学習データ・テストデータ準備。
##■
from torch.utils.data import TensorDataset, random_split
from torch.utils.data import DataLoader, RandomSampler, SequentialSampler

データセットクラスの作成

dataset = TensorDataset(input_ids, attention_masks, labels, inds)

90%地点のIDを取得

train_size = int(0.9 * len(dataset))
val_size = len(dataset) - train_size

データセットを分割

train_dataset, val_dataset = random_split(dataset, [train_size, val_size])

print('訓練データ数:{}'.format(train_size))
print('検証データ数: {} '.format(val_size))

データローダーの作成

batch_size = 32

訓練データローダー

train_dataloader = DataLoader(
train_dataset,
sampler = RandomSampler(train_dataset), # ランダムにデータを取得してバッチ化
batch_size = batch_size
)

検証データローダー

validation_dataloader = DataLoader(
val_dataset,
sampler = SequentialSampler(val_dataset), # 順番にデータを取得してバッチ化
batch_size = batch_size
)

##■
##■ BERT転移学習(学習済みデータを利用し、分類モデルを構築)
##■

##■ 準備
#!pip install transformers==3.5.1
from transformers import BertForSequenceClassification, AdamW, BertConfig

BertForSequenceClassification 学習済みモデルのロード

model = BertForSequenceClassification.from_pretrained(
'cl-tohoku/bert-base-japanese-whole-word-masking', # 日本語Pre trainedモデルの指定
num_labels = 2, # ラベル数(今回はBinayなので2、数値を増やせばマルチラベルも対応可)
output_attentions = False, # アテンションベクトルを出力するか
output_hidden_states = False, # 隠れ層を出力するか
)

モデルをGPUへ転送

model.cuda()

最適化手法の設定

optimizer = AdamW(model.parameters(), lr=2e-5)

訓練パートの定義

def train(model):
model.train() # 訓練モードで実行
train_loss = 0
for batch in train_dataloader:# train_dataloaderはword_id, mask, labelを出力する点に注意
b_input_ids = batch[0].to(device)
b_input_mask = batch[1].to(device)
b_labels = batch[2].to(device)
optimizer.zero_grad()
loss, logits = model(b_input_ids,
token_type_ids=None,
attention_mask=b_input_mask,
labels=b_labels)
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
optimizer.step()
train_loss += loss.item()
return train_loss

テストパートの定義

def validation(model):
model.eval()# 訓練モードをオフ
val_loss = 0
with torch.no_grad(): # 勾配を計算しない
for batch in validation_dataloader:
b_input_ids = batch[0].to(device)
b_input_mask = batch[1].to(device)
b_labels = batch[2].to(device)
with torch.no_grad():
(loss, logits) = model(b_input_ids,
token_type_ids=None,
attention_mask=b_input_mask,
labels=b_labels)
val_loss += loss.item()
return val_loss

##■ 学習の実行
max_epoch = 4
train_loss_ = []
test_loss_ = []

for epoch in range(max_epoch):
train_ = train(model)
test_ = train(model)
train_loss_.append(train_)
test_loss_.append(test_)

##■ テストデータを分類して結果を表示
import numpy as np
model.eval()# 訓練モードをオフ
for batch in validation_dataloader:
print("one batch")
b_input_ids = batch[0].to(device)
b_input_mask = batch[1].to(device)
b_labels = batch[2].to(device)
b_inds = batch[3].to(device)
a=[]
for id in batch[3]:
sent = sentences[id]
if len(sent)>20:
sent = sent[:20]
a.append(sent)#sentences[id])
#a2 = torch.tensor(a)
#b_sents = a.to(device)
with torch.no_grad():
# 学習済みモデルによる予測結果をpredsで取得
preds = model(b_input_ids,
token_type_ids=None,
attention_mask=b_input_mask)

logits_df = pd.DataFrame(preds[0].cpu().numpy(), columns=['logit_0', 'logit_1']) ## np.argmaxで大き方の値を取得 pred_df = pd.DataFrame(np.argmax(preds[0].cpu().numpy(), axis=1), columns=['pred_label']) label_df = pd.DataFrame(b_labels.cpu().numpy(), columns=['true_label']) source_df = pd.DataFrame(b_inds.cpu().numpy(), columns=['source_id']) sents_df = pd.DataFrame(a, columns=['source_sent']) accuracy_df = pd.concat([logits_df, pred_df, label_df, source_df, sents_df], axis=1) print(accuracy_df)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2021/04/29 08:58

pythonのコードの一番最初の行のすぐ上に ```python だけの行を追加してください また、pythonのコードの一番最後の行のすぐ下に ``` だけの行を追加してください 現状、コードがとても読み辛いです 質問にコードを載せる際に上記をやってくれたら、他人がコードを読みやすくなり、コードの実行による現象確認もやりやすくなるので、回答されやすくなります
y_waiwai

2021/04/29 09:19

このままではコードが読めないので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
guest

回答1

0

最近まで使えていたはずのモジュールがインポートできなくなったと同じ原因ではないでしょうか。

transformersのお使いのバージョンでtransformers.modelsがあるかどうかを調べてた方が良いと思います。

投稿2021/04/29 09:54

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問