実現したいこと
PyTorchでNeural networkの正解率が最初から50%以上になりますが、学習は出来ているようです。
Neural networkの層構造を変えてもあまり変化がありません。
プログラムのどこかがおかしいのでしょうか?
前提
ここに質問の内容を詳しく書いてください。
(例)
PyTorchで2層のNeural networkを作っています。
発生している問題・エラーメッセージ
横軸にEpoch数、縦軸に正解率を取ると50epochでこのような学習結果になります。
該当のソースコード
##PyTorch_data_precision.py data=data.astype('f') label=label.values.astype('i') data=np.array(data,dtype=np.float32) label=label.reshape(-1) x = torch.tensor(data, dtype=torch.float32) t = torch.tensor(label, dtype=torch.int64) print(x.size()) print(t.size()) dataset = torch.utils.data.TensorDataset(x, t) # 各データセットのサンプル数を決定 # train : val: test = 80% : 20% : 0% n_train = int(len(dataset) * 0.8) n_val = int(len(dataset) * 0.2) n_test = len(dataset) - n_train - n_val # ランダムに分割を行うため、シードを固定して再現性を確保 torch.manual_seed(0) # データセットの分割 train, val, test = torch.utils.data.random_split(dataset, [n_train, n_val,n_test]) batch_size = 10 # shuffle はデフォルトで False のため、学習データのみ True に指定 train_dataloader = torch.utils.data.DataLoader(train, batch_size, shuffle=True) val_dataloader = torch.utils.data.DataLoader(val, batch_size) # Get cpu or gpu device for training. device = "cuda" if torch.cuda.is_available() else "cpu" print(f"Using {device} device") # Define model class NeuralNetwork(nn.Module): def __init__(self): super(NeuralNetwork, self).__init__() self.flatten = nn.Flatten() self.linear_relu_stack = nn.Sequential( nn.Linear(94, 31), nn.ReLU(), nn.Dropout(p=0.3), nn.Linear(31, 10), nn.ReLU(), nn.Dropout(p=0.5), nn.Linear(10, 2) ) def forward(self, x): x = self.flatten(x) logits = self.linear_relu_stack(x) return logits model = NeuralNetwork().to(device) #model.load_state_dict(torch.load("model.pth")) print(model) loss_fn = nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.01) scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.01) def df_train(dataloader, model, loss_fn, optimizer): size = len(dataloader.dataset) model.train() for batch, (X, y) in enumerate(dataloader): X, y = X.to(device), y.to(device) # Compute prediction error pred = model(X) loss = loss_fn(pred, y) # Backpropagation optimizer.zero_grad() loss.backward() optimizer.step() if (batch+1) % 10 == 0: loss, current = loss.item(), batch * len(X) print(f"loss: {loss:>7f} [{current:>5d}/{size:>5d}]") def df_val(dataloader, model, loss_fn): size = len(dataloader.dataset) num_batches = len(dataloader) model.eval() corr_list = [] test_loss, correct = 0, 0 with torch.no_grad(): for X, y in dataloader: X, y = X.to(device), y.to(device) pred = model(X) test_loss += loss_fn(pred, y).item() correct += (pred.argmax(1) == y).type(torch.float).sum().item() test_loss /= num_batches correct /= size corr_list.append(100*correct) print(f"Test Error: \\n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f} \\n") return corr_list epochs = 50 corr_epoch = [] for t in range(epochs): #correct = 0 train, val, test = torch.utils.data.random_split(dataset, [n_train, n_val,n_test]) train_dataloader = torch.utils.data.DataLoader(train, batch_size, shuffle=True) val_dataloader = torch.utils.data.DataLoader(val, batch_size) print(f"Epoch {t+1}\\n-------------------------------") df_train(train_dataloader, model, loss_fn, optimizer) df_val(val_dataloader, model, loss_fn) corr_list =df_val(val_dataloader, model, loss_fn) corr_epoch.append(corr_list) print("Done!")
試したこと
上のグラフはcorr_epochをCSVに書き出してエクセルで書いたものです。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。

回答1件
あなたの回答
tips
プレビュー