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

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

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

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

機械学習

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

Python

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

Q&A

解決済

1回答

2778閲覧

ミニバッチ学習がうまくいかない(PyTorchでSin波回帰)

ususio_ot

総合スコア1

PyTorch

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

機械学習

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

Python

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

0グッド

0クリップ

投稿2021/10/03 13:18

編集2021/10/03 13:30

前提・実現したいこと

PyTorchでSin波の回帰をしたいです.
回帰は初心者ですが,分類問題は実装をしたことがあり,
そのときのソースコードを転用(損失関数等変更)しています.

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

バッチサイズが1のときとりあえず学習が進む(Loss<0.01)のに,
バッチサイズを2以上にすると学習が進みません(Loss>0.1).
以下,関係あるかはわかりませんが出ている警告文です.

Using a target size (torch.Size([10])) that is different to the input size (torch.Size([10, 1])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size. return F.mse_loss(input, target, reduction=self.reduction)

該当のソースコード

Python

1import numpy as np 2import torch 3import torch.nn as nn 4import torch.nn.functional as F 5import torch.optim as optim 6import torch.utils.data as data 7 8seed = 0 9 10class MLPNet(nn.Module): 11 def __init__(self, N_r, N_y): 12 super(MLPNet, self).__init__() 13 self.fc1 = nn.Linear(N_r, 100) 14 self.fc2 = nn.Linear(100,100) 15 self.fc3 = nn.Linear(100,100) 16 self.fc4 = nn.Linear(100, N_y) 17 self.dropout1 = nn.Dropout2d(0.2) 18 self.dropout2 = nn.Dropout2d(0.2) 19 self.dropout3 = nn.Dropout2d(0.2) 20 21 def forward(self, x): 22 x = F.relu(self.fc1(x)) 23 x = self.dropout1(x) 24 x = F.relu(self.fc2(x)) 25 x = self.dropout2(x) 26 x = F.relu(self.fc3(x)) 27 x = self.dropout3(x) 28 return self.fc4(x) 29 30class MLP: 31 def __init__(self, N_r, N_y, batch=10, epoch=100): 32 self.N_r = N_r 33 self.N_y = N_y 34 self.batch = batch 35 self.epoch = epoch 36 37 self.device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") 38 torch.manual_seed(seed) 39 40 self.model = MLPNet(N_r, N_y).to(self.device) 41 self.criterion = nn.MSELoss() 42 self.optimizer = optim.Adam(self.model.parameters(), lr=0.01) 43 44 def train(self, R, Y): 45 dataset = data.TensorDataset(torch.from_numpy(R).float(), 46                    torch.from_numpy(Y).float().reshape(-1)) 47 dataloader = data.DataLoader(dataset=dataset, batch_size=self.batch, shuffle=True) 48 self.model.train() 49 for e in range(self.epoch): 50 for i, (r, y) in enumerate(dataloader): 51 r, y = r.to(self.device), y.to(self.device) 52 self.optimizer.zero_grad() 53 output = self.model(r) 54 loss = self.criterion(output, y) 55 loss.backward() 56 self.optimizer.step() 57 if(e%10==0): 58 print ('Epoch [%d/%d], Loss: %.4f' % (e, self.epoch, loss.item())) 59 60if __name__ == "__main__": 61 output = MLP(2,1) 62 X = np.random.uniform(0, 5, 200) 63 Y = np.sin(X).reshape(-1,1) 64 X = np.hstack((X.reshape(-1,1), np.ones(200).reshape(-1,1))) #定数項を追加 65 output.train(X,Y)

試したこと

dataloaderのshuffle=Falseにもしてみました.
学習率の変更もしてみました.
rとyをprintして正しくsinの関係になっていることを確認しました.
バッチサイズ2以上のときの学習後モデル出力を確認すると入力によらず~0でした.

同じソースコードで分類問題は解けています
(損失関数はCrossEntropyLoss,datasetのYについてfloatではなくlong).

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

Spyder(Python3.8)
numpy 1.19.5
torch 1.9.0

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問者様が懸念していた警告の影響で、正常な学習データの並びと異なる並びで学習されてしまっていたようです。

以下を修正すると、警告が取れて、学習も進みますので、お試しください。

修正前

Python

1 dataset = data.TensorDataset(torch.from_numpy(R).float(), 2                    torch.from_numpy(Y).float().reshape(-1))

修正後

Python

1 dataset = data.TensorDataset(torch.from_numpy(R).float(), 2 torch.from_numpy(Y).float().reshape(-1, 1))

投稿2021/10/03 13:31

toast-uz

総合スコア3266

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

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

ususio_ot

2021/10/03 13:35

正しく学習が進むことを確認いたしました. rとyがsinの関係になっていたので無関係だろうと思い込んでしまっていました. 警告文そのままが原因で申し訳ないです.助かりました,ありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問