前提・実現したいこと
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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/03 13:35