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

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

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

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

Q&A

0回答

575閲覧

trainer.callback_metricsが表示できない(空のdictが返却される)

hoge_9

総合スコア0

PyTorch

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

0グッド

0クリップ

投稿2023/03/25 14:38

実現したいこと

trainer.callback_metricsが表示できない(空のdictが返却される)

前提

以下のサイトのpytorch-lightningを使った学習をやったところ、全く同じソースを実行しているつもりなのですが、
https://free.kikagaku.ai/tutorial/basic_of_deep_learning/learn/pytorch_classification

一番最後のtrainer.callback_metricsの確認結果が表示されません。
※特に途中でエラーが発生しているということはないです。

ご教示いただきたいです。

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

trainer.callback_metricsで期待通りの値にならない(空のdictが返却される)
期待値:
{'loss': 0.05683613941073418,
'test_acc': 0.9750000238418579,
'test_loss': 0.10801426321268082,
'val_acc': 0.9750000238418579,
'val_loss': 0.16051073372364044}

私の環境:
{}

該当のソースコード

python

1import numpy as np 2import pandas as pd 3import torch 4 5df = pd.read_csv("./wine_class.csv") 6np.unique(df['Class'], return_counts=True) 7#→(array([1, 2, 3]), array([59, 71, 48])) 8 9x = df.drop('Class', axis=1) 10t = df['Class'] 11 12# サイズの確認 ((178, 10), (178,)) 13x.shape, t.shape 14 15# Tensor 形式へ変換 16x = torch.tensor(x.values, dtype=torch.float32) 17t = torch.tensor(t.values, dtype=torch.int64) 18t = t-1 19 20import torch.utils.data 21# 入力変数と目的変数をまとめて、ひとつのオブジェクト dataset に変換 22dataset = torch.utils.data.TensorDataset(x, t) 23 24# 各データセットのサンプル数を決定 25# train : val : test = 60% : 20% : 20% 26n_train = int(len(dataset) * 0.6) 27n_val = int((len(dataset) - n_train) * 0.5) 28n_test = len(dataset) - n_train - n_val 29 30# サンプル数の確認 (106, 36, 36) 31n_train, n_val, n_test 32 33# ランダムに分割を行うため、シードを固定して再現性を確保 34torch.manual_seed(0) 35 36# データセットの分割 37train, val, test = torch.utils.data.random_split(dataset, [n_train, n_val, n_test]) 38 39import pytorch_lightning as pl 40# バージョンの確認 '2.0.0' 41pl.__version__ 42 43import torch.nn as nn 44import torch.nn.functional as F 45 46# 学習データに対する処理 47class TrainNet(pl.LightningModule): 48 49 def train_dataloader(self): 50 return torch.utils.data.DataLoader(train, self.batch_size, shuffle=True) 51 52 def training_step(self, batch, batch_nb): 53 x, t = batch 54 y = self.forward(x) 55 loss = self.lossfun(y, t) 56 results = {'loss': loss} 57 return results 58 59# 検証データに対する処理 60class ValidationNet(pl.LightningModule): 61 62 def val_dataloader(self): 63 return torch.utils.data.DataLoader(val, self.batch_size) 64 65 def validation_step(self, batch, batch_nb): 66 x, t = batch 67 y = self.forward(x) 68 loss = self.lossfun(y, t) 69 y_label = torch.argmax(y, dim=1) 70 acc = torch.sum(t == y_label) * 1.0 / len(t) 71 results = {'val_loss': loss, 'val_acc': acc} 72 return results 73 74 def validation_end(self, outputs): 75 avg_loss = torch.stack([x['val_loss'] for x in outputs]).mean() 76 avg_acc = torch.stack([x['val_acc'] for x in outputs]).mean() 77 results = {'val_loss': avg_loss, 'val_acc': avg_acc} 78 return results 79 80# テストデータに対する処理 81class TestNet(pl.LightningModule): 82 83 def test_dataloader(self): 84 return torch.utils.data.DataLoader(test, self.batch_size) 85 86 def test_step(self, batch, batch_nb): 87 x, t = batch 88 y = self.forward(x) 89 loss = self.lossfun(y, t) 90 y_label = torch.argmax(y, dim=1) 91 acc = torch.sum(t == y_label) * 1.0 / len(t) 92 results = {'test_loss': loss, 'test_acc': acc} 93 return results 94 95 def test_end(self, outputs): 96 avg_loss = torch.stack([x['test_loss'] for x in outputs]).mean() 97 avg_acc = torch.stack([x['test_acc'] for x in outputs]).mean() 98 results = {'test_loss': avg_loss, 'test_acc': avg_acc} 99 return results 100 101# 学習データ、検証データ、テストデータへの処理を継承したクラス 102class Net(TrainNet, ValidationNet, TestNet): 103 104 def __init__(self, input_size=10, hidden_size=5, output_size=3, batch_size=10): 105 super(Net, self).__init__() 106 self.fc1 = nn.Linear(input_size, hidden_size) 107 self.fc2 = nn.Linear(hidden_size, output_size) 108 self.batch_size = batch_size 109 110 def forward(self, x): 111 x = self.fc1(x) 112 x = F.relu(x) 113 x = self.fc2(x) 114 return x 115 116 def lossfun(self, y, t): 117 return F.cross_entropy(y, t) 118 119 def configure_optimizers(self): 120 return torch.optim.SGD(self.parameters(), lr=0.1) 121 122from pytorch_lightning import Trainer 123# 学習に関する一連の流れを実行 124torch.manual_seed(0) 125 126net = Net() 127trainer = Trainer() 128 129trainer.fit(net) 130 131trainer.test() 132 133trainer.callback_metrics 134# {} が返ってくる

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

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

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

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

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

hoge_9

2023/03/26 11:10

回答ありがとうございます。 ご指摘の通り、pytorch_lightning 0.7.1で実行したところ同じ結果が得られました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問