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

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

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

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

解決済

1回答

2800閲覧

事前学習済みBERTモデルをファインチューニングする時に入力でTypeErrorが発生する

退会済みユーザー

退会済みユーザー

総合スコア0

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

0クリップ

投稿2022/03/12 13:42

編集2022/03/14 14:14

前提・実現したいこと

【PyTorch】BERTを用いた文書分類入門」という記事を参考に、事前学習済みBERTモデルをファインチューニングしようとしています。

データセットや前処理は全て記事の通りに行い、Google Colaboratoryを使い、「ランタイムのタイプ」は「GPU」にしています。

発生している問題・エラーメッセージ

記事では特に言及されていなかったのですが、モデルの学習時の入力の型に問題があるようで、実行することができません。
Python・PyTorch、GoogleCoraboratory、もしくはTransformersのアップデート等で、入力の型を変更しなければならないでしょうか。
検索しても解決方法が見つからなかったので、質問させていただきます。

TypeError Traceback (most recent call last) in <module>() 19 20 # モデルの学習 ---> 21 log = train_model(dataset_train, dataset_valid, BATCH_SIZE, model, criterion, optimizer, NUM_EPOCHS, device=device) in train_model(dataset_train, dataset_valid, batch_size, model, criterion, optimizer, num_epochs, device) 55 56 # 順伝播 + 誤差逆伝播 + 重み更新 ---> 57 outputs = model(ids, mask) 58 loss = criterion(outputs, labels) 59 loss.backward() /usr/local/lib/python3.7/dist-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs) 1100 if not (self._backward_hooks or self._forward_hooks or self._forward_pre_hooks or _global_backward_hooks 1101 or _global_forward_hooks or _global_forward_pre_hooks): -> 1102 return forward_call(*input, **kwargs) 1103 # Do not call functions when jit is used 1104 full_backward_hooks, non_full_backward_hooks = [], [] n forward(self, ids, mask) 9 def forward(self, ids, mask): 10 _, out = self.bert(ids, attention_mask=mask) ---> 11 out = self.fc(self.drop(out)) 12 return out /usr/local/lib/python3.7/dist-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs) 1100 if not (self._backward_hooks or self._forward_hooks or self._forward_pre_hooks or _global_backward_hooks 1101 or _global_forward_hooks or _global_forward_pre_hooks): -> 1102 return forward_call(*input, **kwargs) 1103 # Do not call functions when jit is used 1104 full_backward_hooks, non_full_backward_hooks = [], [] /usr/local/lib/python3.7/dist-packages/torch/nn/modules/dropout.py in forward(self, input) 56 57 def forward(self, input: Tensor) -> Tensor: ---> 58 return F.dropout(input, self.p, self.training, self.inplace) 59 60 /usr/local/lib/python3.7/dist-packages/torch/nn/functional.py in dropout(input, p, training, inplace) 1167 if p < 0.0 or p > 1.0: 1168 raise ValueError("dropout probability has to be between 0 and 1, " "but got {}".format(p)) -> 1169 return _VF.dropout_(input, p, training) if inplace else _VF.dropout(input, p, training) 1170 1171 TypeError: dropout(): argument 'input' (position 1) must be Tensor, not str

該当のソースコード

BERT分類モデルの学習」で紹介されていたコードをまず、そのまま動かしています。

Python def calculate_loss_and_accuracy(model, criterion, loader, device): """ 損失・正解率を計算""" model.eval() loss = 0.0 total = 0 correct = 0 with torch.no_grad(): for data in loader: # デバイスの指定 ids = data['ids'].to(device) mask = data['mask'].to(device) labels = data['labels'].to(device) # 順伝播 outputs = model(ids, mask) # 損失計算 loss += criterion(outputs, labels).item() # 正解率計算 pred = torch.argmax(outputs, dim=-1).cpu().numpy() # バッチサイズの長さの予測ラベル配列 labels = torch.argmax(labels, dim=-1).cpu().numpy() # バッチサイズの長さの正解ラベル配列 total += len(labels) correct += (pred == labels).sum().item() return loss / len(loader), correct / total def train_model(dataset_train, dataset_valid, batch_size, model, criterion, optimizer, num_epochs, device=None): """モデルの学習を実行し、損失・正解率のログを返す""" # デバイスの指定 model.to(device) # dataloaderの作成 dataloader_train = DataLoader(dataset_train, batch_size=batch_size, shuffle=True) dataloader_valid = DataLoader(dataset_valid, batch_size=len(dataset_valid), shuffle=False) # 学習 log_train = [] log_valid = [] for epoch in range(num_epochs): # 開始時刻の記録 s_time = time.time() # 訓練モードに設定 model.train() for data in dataloader_train: # デバイスの指定 ids = data['ids'].to(device) mask = data['mask'].to(device) labels = data['labels'].to(device) # 勾配をゼロで初期化 optimizer.zero_grad() # 順伝播 + 誤差逆伝播 + 重み更新 outputs = model(ids, mask) loss = criterion(outputs, labels) loss.backward() optimizer.step() # 損失と正解率の算出 loss_train, acc_train = calculate_loss_and_accuracy(model, criterion, dataloader_train, device) loss_valid, acc_valid = calculate_loss_and_accuracy(model, criterion, dataloader_valid, device) log_train.append([loss_train, acc_train]) log_valid.append([loss_valid, acc_valid]) # チェックポイントの保存 torch.save({'epoch': epoch, 'model_state_dict': model.state_dict(), 'optimizer_state_dict': optimizer.state_dict()}, f'checkpoint{epoch + 1}.pt') # 終了時刻の記録 e_time = time.time() # ログを出力 print(f'epoch: {epoch + 1}, loss_train: {loss_train:.4f}, accuracy_train: {acc_train:.4f}, loss_valid: {loss_valid:.4f}, accuracy_valid: {acc_valid:.4f}, {(e_time - s_time):.4f}sec') return {'train': log_train, 'valid': log_valid} # パラメータの設定 DROP_RATE = 0.4 OUTPUT_SIZE = 4 BATCH_SIZE = 32 NUM_EPOCHS = 4 LEARNING_RATE = 2e-5 # モデルの定義 model = BERTClass(DROP_RATE, OUTPUT_SIZE) # 損失関数の定義 criterion = torch.nn.BCEWithLogitsLoss() # オプティマイザの定義 optimizer = torch.optim.AdamW(params=model.parameters(), lr=LEARNING_RATE) # デバイスの指定 device = 'cuda' if cuda.is_available() else 'cpu' # モデルの学習 log = train_model(dataset_train, dataset_valid, BATCH_SIZE, model, criterion, optimizer, NUM_EPOCHS, device=device)

試したこと

記事の出力にあるように、Tensorへ変換できていることは確認済みです。

# 正解ラベルのone-hot化 y_train = pd.get_dummies(train, columns=['CATEGORY'])[['CATEGORY_b', 'CATEGORY_e', 'CATEGORY_t', 'CATEGORY_m']].values y_valid = pd.get_dummies(valid, columns=['CATEGORY'])[['CATEGORY_b', 'CATEGORY_e', 'CATEGORY_t', 'CATEGORY_m']].values y_test = pd.get_dummies(test, columns=['CATEGORY'])[['CATEGORY_b', 'CATEGORY_e', 'CATEGORY_t', 'CATEGORY_m']].values # Datasetの作成 max_len = 20 tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') dataset_train = CreateDataset(train['TITLE'], y_train, tokenizer, max_len) dataset_valid = CreateDataset(valid['TITLE'], y_valid, tokenizer, max_len) dataset_test = CreateDataset(test['TITLE'], y_test, tokenizer, max_len) for var in dataset_train[0]: print(f'{var}: {dataset_train[0][var]}') #出力 ids: tensor([ 101, 25416, 9463, 1011, 10651, 1015, 1011, 2647, 2482, 4341, 2039, 2005, 4369, 3204, 2004, 18730, 8980, 102, 0, 0]) mask: tensor([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0]) labels: tensor([1., 0., 0., 0.])

質問いただいた内容

GitHubで公開されているコードをそのまま実行しても同じエラーになりました。
https://github.com/yamaru12345/nlp100/blob/master/chapter09_89.ipynb

TypeError: dropout(): argument 'input' (position 1) must be Tensor, not str

補足情報(FW/ツールのバージョンなど)

Python 3.7
simpletransformers-0.63.4-py3-none-any.whl

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/03/14 12:11

@jbpb0 ご質問ありがとうございます。 はい、そちらのgithubのファイルをGoogle Colabでそのまま実行しても同じエラーが表示されました。 https://github.com/yamaru12345/nlp100/blob/master/chapter09_89.ipynb ``` TypeError: dropout(): argument 'input' (position 1) must be Tensor, not str ```
guest

回答1

0

ベストアンサー

TypeError: dropout(): argument 'input' (position 1) must be Tensor, not str

dropout(): argument 'input' (position 1) must be Tensor, not str With Bert #8879

投稿2022/03/20 11:55

jbpb0

総合スコア7651

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問