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

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

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

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

Python

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

Q&A

解決済

1回答

530閲覧

PyTorchでNeural networkの正解率が最初から50%以上になります

kak

総合スコア27

PyTorch

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

Python

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

0グッド

0クリップ

投稿2023/05/02 08:33

実現したいこと

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

meg_

2023/05/02 08:37

> PyTorchでNeural networkの正解率が最初から50%以上になりますが、学習は出来ているようです。 > Neural networkの層構造を変えてもあまり変化がありません。 > プログラムのどこかがおかしいのでしょうか? 質問の意図は何でしょうか?「最初から50%以上」では何か問題があるのでしょうか?
can110

2023/05/02 08:48 編集

データについても具体的な情報を提示すると回答えられやすくなるかと思います。 (たんにデタラメに回答しても半分は正解するようなデータだったりしないでしょうか?)
jbpb0

2023/05/02 11:43

最終層が「nn.Linear(10, 2)」ということは、2値分類なので、デタラメでも約半分(50%)当たりますよね > 正解率が最初から50%以上 初回エポックの学習がされた後なので、50%よりもちょっと良くなった、のではないですかね
kak

2023/05/02 14:50

皆さまご回答ありがとうございます。 >meg_様 コインの裏表と同じで無限回すれば確率1/2に収束するのでしょうが、ミニバッチを10に設定しているので、もう少しバラツキながら学習に伴い正解率が上がっていくのを期待していました。 >can110様、jbpb0様 jbpb0様のご指摘のように93個のパラメータを入れて2択の結果が得られるようなデータです。アウトプットが2択のデータである限り、1/2に近い正解率になるということでしょうか? 仰る通り初回学習後でした。少し高めに出るのは納得しました。 以前Chainerで同じようなNeural networkで2択のアウトプットを作成した時に正解率が20-30%程度から上がっていったので、そのような学習効率を期待していました。 Dropoutやschedulerを入れて学習を邪魔してみても最初から1/2の確率だったので、これでいいのか疑問でした。損失関数は最初のエポック0.68から最終的に0.1まで下がっているので学習出来ているのは分かりました。 アウトプット2択では正解率50%が100%近くまで上がるという学習経過でいいのであれば安心です。 ありがとうございました。
guest

回答1

0

自己解決

アウトプット2択では正解率50%が100%近くまで上がるという学習経過でいいのであれば安心です。
ありがとうございました。

投稿2023/05/03 22:13

kak

総合スコア27

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問