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

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

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

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

Python

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

解決済

なぜコピペなのに精度が全然違うのか

Ark
Ark

総合スコア12

PyTorch

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

Python

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

3回答

-1評価

0クリップ

1228閲覧

投稿2022/05/29 13:46

編集2022/06/03 05:10

サイトと同じ精度を実現したい

pytorch初学者です。大学で音声感情認識の研究をしていて、実装がうまく行かなかったので練習に立ち返ることにし、MNISTをCNNで学習させるプログラムをコピペして実行しました。出典はこちらです。

でも実際に動かしてみると、出典サイトでは96%程度のテスト精度が出ていたのに対し、手元の環境では54.6%しか出ませんでした。

データセットも前処理もモデルも同じなのになぜこうも結果に差が出るのかがわからずとてもモヤモヤしています。音声感情認識のモデルを実装したときも、論文のとおりに作っても中々精度が出ず、方向性がわからなくなり練習に戻ってきました。

知りたいこと

・訓練ロスとテストロス、訓練精度とテスト精度の記録を入れた
・torch.to()関数でGPUを利用するようにした
以外はすべてサイトのコピペです。やっていることは同じなのになぜこうも精度が違うのかが知りたいです。問題のコードと、40エポック経過後のロスと精度の推移を添付します。どうかよろしくお願いします。

補足:上記2つの改変を消して実行してみましたが、結果は変わらなかったのでこれらは原因ではないことがわかりました。

実行環境

CPU: Intel® Xeon(R) Silver 4208 CPU @ 2.10GHz × 16
GPU: NVIDIA GeForce RTX 2080 Ti/PCIe/SSE2
OS: Ubuntu 18.04.5 LTS
開発環境: Jupyter Notebook

コード

すべてJupyter Notebook上で実行しました。実行したセルごとにまとめて添付します。

モジュールのインポート

python

import torch import torchvision import torchvision.transforms as transforms import numpy as np import matplotlib.pyplot as plt import torch.nn as nn import torch.nn.functional as F import torch.optim as optim

MNISTをロードする

python

transform = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, ), (0.5, ))]) trainset = torchvision.datasets.MNIST(root='../data', train=True, download=True, transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=100, shuffle=True, num_workers=2) testset = torchvision.datasets.MNIST(root='../data', train=False, download=True, transform=transform) testloader = torch.utils.data.DataLoader(testset, batch_size=100, shuffle=False, num_workers=2) classes = tuple(np.linspace(0, 9, 10, dtype=np.uint8))

CNNモデルの定義

python

class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 32, 3) # 28x28x32 -> 26x26x32 self.conv2 = nn.Conv2d(32, 64, 3) # 26x26x64 -> 24x24x64 self.pool = nn.MaxPool2d(2, 2) # 24x24x64 -> 12x12x64 self.dropout1 = nn.Dropout2d() self.fc1 = nn.Linear(12 * 12 * 64, 128) self.dropout2 = nn.Dropout2d() self.fc2 = nn.Linear(128, 10) def forward(self, x): x = F.relu(self.conv1(x)) x = self.pool(F.relu(self.conv2(x))) x = self.dropout1(x) x = x.view(-1, 12 * 12 * 64) x = F.relu(self.fc1(x)) x = self.dropout2(x) x = self.fc2(x) return x

学習用コード

python

model = Net().to('cuda') criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9) epochs = 40 #ロスと精度記録用のリスト train_loss = [] test_loss = [] train_accuracy = [] test_accuracy = [] for epoch in range(epochs): running_loss = 0.0 #学習する for i, (inputs, labels) in enumerate(trainloader, 0): # zero the parameter gradients optimizer.zero_grad() # forward + backward + optimize inputs = inputs.to('cuda') labels = labels.to('cuda') outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() # print statistics running_loss += loss.item() if i % 100 == 99: print('[{:d}, {:5d}] loss: {:.3f}' .format(epoch + 1, i + 1, running_loss / 100)) train_loss.append(running_loss / i) correct = 0 total = 0 # テストデータを一周 with torch.no_grad(): running_test_loss = 0 for index, (images, labels) in enumerate(testloader): images = images.to('cuda') labels = labels.to('cuda') outputs = model(images) loss = criterion(outputs, labels) running_test_loss += loss.item() _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() test_loss.append(running_test_loss / index) test_accuracy.append(correct / total) correct = 0 total = 0 # 訓練データを一周 with torch.no_grad(): running_loss = 0 for index, (images, labels) in enumerate(trainloader): images = images.to('cuda') labels = labels.to('cuda') outputs = model(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() train_accuracy.append(correct / total) print('Finished Training')

結果の出力

ロスの出力と結果

python

plt.plot(train_loss, label='train_loss') plt.plot(test_loss, label='test_loss') plt.legend() plt.plot()

ロスの推移

精度の出力と結果

python

plt.plot(train_accuracy, label='train_accuracy') plt.plot(test_accuracy, label='test_accuracy') plt.legend() plt.plot()

精度の推移

追記:やってみたこと

・見た感じ、パラメータ数が足りていないのかと思ったので、畳み込み層を1つ追加してみた
→精度は変わらなかった

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

jbpb0

2022/05/29 23:46 編集

> 訓練ロスとテストロス、訓練精度とテスト精度の記録を入れた をやらない場合は、質問者さんの環境でも96%くらいになるのでしょうか?
quickquip

2022/05/30 04:03

グラフが2つ、コードが1つ、コードでグラフを書いている様子はない、では、このコードを何だと思って読めばいいのかわかりません。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

PyTorch

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

Python

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