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

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

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

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

PyTorch

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

Q&A

0回答

1731閲覧

深層学習の学習中に表示される精度が正しくない

退会済みユーザー

退会済みユーザー

総合スコア0

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

PyTorch

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

0グッド

0クリップ

投稿2020/06/22 14:27

先日から深層距離学習を行っているのですが、エポックごとの精度が異常ではないかと思っています。

というのも、下の方にのせているように、学習中の精度は一気に高くなっているのですが、metricで精度を測定すると、極端にひどい精度になってしまいます。

おそらく学習コードに不具合があるのだと思いますが、どこが問題なのか特定できずにいます。
是非、力をお借りしたいです。

不足している情報があればその都度追加いたします。

Python

1# dataloaderの作成 2def make_dataloaders(): 3 resize = 224 4 mean = (0.485, 0.456, 0.406) 5 std = (0.229, 0.224, 0.225) 6 transform = { 7 "train": transforms.Compose([ 8 transforms.RandomResizedCrop(resize, (0.08, 1.0), (0.7, 1.2)), 9 transforms.RandomRotation((-40, 40)), 10 transforms.RandomHorizontalFlip(), 11 transforms.ToTensor(), 12 transforms.Normalize(mean, std)]), 13 "val": transforms.Compose([ 14 transforms.Resize(resize), 15 transforms.CenterCrop(resize), 16 transforms.ToTensor(), 17 transforms.Normalize(mean, std)])} 18 19 train = torchvision.datasets.CIFAR10(root="./cifar10", train=True, transform=transform["train"], download=True) 20 val = torchvision.datasets.CIFAR10(root="./cifar10", train=False, transform=transform["val"], download=False) 21 train, _ = torch.utils.data.random_split(train, [10000, 40000]) 22 val, _ = torch.utils.data.random_split(val, [5000, 5000]) 23 24 # ミニバッチのサイズを指定 25 batch_size = 64 26 27 # DataLoaderを作成 28 train_dataloader = torch.utils.data.DataLoader( 29 train, batch_size=batch_size, shuffle=True) 30 val_dataloader = torch.utils.data.DataLoader( 31 val, batch_size=batch_size, shuffle=False) 32 33 # 辞書型にまとめる 34 dataloaders_dict = {"train": train_dataloader, "val": val_dataloader} 35 return dataloaders_dict 36 37 38# 学習用 39def train(model, metric_fc, dataloader, criterion, optimizer, device): 40 # 訓練モードに切り替える 41 model.train() 42 metric_fc.train() 43 44 epoch_loss = 0.0 # epochの損失和 45 epoch_corrects = 0 # epochの正解数 46 counter = 0 # データ数の合計 47 for inputs, targets in tqdm(dataloader): 48 inputs = inputs.to(device) 49 targets = targets.to(device) 50 51 features = model(inputs) 52 outputs = metric_fc(features, targets) 53 preds = torch.argmax(outputs, dim=1) 54 55 loss = criterion(outputs, targets) # 損失を求める 56 counter += inputs.size(0) 57 58 # パラメータを更新 59 optimizer.zero_grad() 60 loss.backward() 61 optimizer.step() 62 63 epoch_loss += loss.item() * inputs.size(0) # lossの合計を更新 64 epoch_corrects += torch.sum(preds == targets.data) # 正解数の合計を更新 65 66 log = OrderedDict([ 67 ('loss', epoch_loss / float(counter)), 68 ('acc1', epoch_corrects / float(counter)) 69 ]) 70 71 return log 72 73 74# 検証用 75def validate(model, metric_fc, dataloader, criterion, device): 76 # 検証モードに切り替える 77 model.eval() 78 metric_fc.eval() 79 80 epoch_loss = 0.0 # epochの損失和 81 epoch_corrects = 0 # epochの正解数 82 counter = 0 # データ数の合計 83 # 勾配計算を行わない 84 with torch.no_grad(): 85 for inputs, targets in tqdm(dataloader): 86 inputs = inputs.to(device) 87 targets = targets.to(device) 88 89 features = model(inputs) 90 outputs = metric_fc(features, targets) 91 preds = torch.argmax(outputs, dim=1) 92 93 loss = criterion(outputs, targets) 94 counter += inputs.size(0) 95 96 epoch_loss += loss.item() * inputs.size(0) # lossの合計を更新 97 epoch_corrects += torch.sum(preds == targets.data) # 正解数の合計を更新 98 99 log = OrderedDict([ 100 ('loss', epoch_loss / float(counter)), 101 ('acc1', epoch_corrects / float(counter)) 102 ]) 103 104 return log 105 106 107def main(): 108 random.seed(42) 109 np.random.seed(42) 110 torch.manual_seed(42) 111 torch.backends.cudnn.benchmark = True 112 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") 113 114 model = models.vgg16(True) 115 for i, (name, param) in enumerate(model.named_parameters()): 116 if i < 20: 117 param.requires_grad = False 118 else: 119 param.requires_grad = True 120 metric_fc = ArcFace(1000, 10) 121 optimizer = optim.SGD([ 122 {"params": model.parameters(), "lr": 1e-3}, 123 {"params": metric_fc.parameters(), "lr": 1e-2} 124 ], momentum=0.9) 125 126 dataloaders_dict = make_dataloaders() 127 criterion = nn.CrossEntropyLoss().to(device) 128 129 num_epochs = 3 130 131 model.to(device) 132 metric_fc.to(device) 133 134 scheduler = lr_scheduler.CosineAnnealingLR(optimizer, 135 T_max=num_epochs) 136 137 log = pd.DataFrame(index=[], columns=[ 138 'epoch', 'loss', 'acc1', 'val_loss', 'val_acc1']) 139 140 best_loss = float('inf') 141 for epoch in range(num_epochs): 142 train_log = train(model, metric_fc, dataloaders_dict["train"], 143 criterion, optimizer, device) 144 val_log = validate(model, metric_fc, dataloaders_dict["val"], criterion, device) 145 146 if (epoch + 1) % 1 == 0: 147 print(f'Epoch: {epoch+1}/{num_epochs} || Loss: {train_log["loss"]:.4f}', 148 f'|| Acc: {train_log["acc1"]:.4f} || val_Loss: {val_log["loss"]:.4f}', 149 f'|| val_Acc: {val_log["acc1"]:.4f}') 150 151 tmp = pd.Series([ 152 epoch, 153 train_log['loss'], 154 train_log['acc1'], 155 val_log['loss'], 156 val_log['acc1'], 157 ], index=['epoch', 'loss', 'acc1', 'val_loss', 'val_acc1']) 158 159 log = log.append(tmp, ignore_index=True) 160 log.to_csv('model/logs/log.csv', index=False) 161 162 if val_log['loss'] < best_loss: 163 torch.save(model.state_dict(), "model/params/base_model.pth") 164 torch.save(metric_fc.state_dict(), "model/params/metric_fc.pth") 165 best_loss = val_log['loss']

⇩実行結果(1epochでかなり高い精度が出ている)

Python

1main() 2 3100%|██████████| 157/157 [02:06<00:00, 1.24it/s] 4100%|██████████| 79/79 [00:52<00:00, 1.51it/s] 5Epoch: 1/3 || Loss: 5.8279 || Acc: 0.5718 || val_Loss: 1.0594 || val_Acc: 0.9714 6100%|██████████| 157/157 [02:06<00:00, 1.24it/s] 7100%|██████████| 79/79 [00:52<00:00, 1.50it/s] 8Epoch: 2/3 || Loss: 0.9778 || Acc: 0.9999 || val_Loss: 0.5691 || val_Acc: 0.9998 9100%|██████████| 157/157 [02:06<00:00, 1.24it/s] 10100%|██████████| 79/79 [00:52<00:00, 1.50it/s] 11Epoch: 3/3 || Loss: 0.8159 || Acc: 1.0000 || val_Loss: 0.4474 || val_Acc: 1.0000

⇩学習済みパラメータを用いて検証する

Python

1def do_test(net, dataloader): 2 net.eval() 3 net.to(device) 4 5 Y,pred = [], [] 6 with torch.no_grad(): 7 for inputs, labels in tqdm(dataloader): 8 inputs = inputs.to(device) 9 labels = labels.to(device) 10 11 outputs = net(inputs) 12 pred += [int(l.argmax().cpu()) for l in outputs] 13 Y += [int(l.cpu()) for l in labels] 14 15 print(classification_report(Y, pred)) 16 17 18device = torch.device("cuda" if torch.cuda.is_available() else "cpu") 19net = models.vgg16(False) 20net.load_state_dict(torch.load("./model/params/base_model.pth", map_location=device)) 21metric_fc = nn.Linear(1000, 10, bias=False) 22metric_fc.load_state_dict(torch.load("./model/params/metric_fc.pth", map_location=device)) 23net = nn.Sequential(net, metric_fc) 24net.eval().to(device) 25 26dataloaders_dict = make_dataloaders() 27do_test(net, dataloaders_dict["val"])

⇩検証結果

Python

1100%|██████████| 79/79 [00:47<00:00, 1.67it/s] 2 precision recall f1-score support 3 4 0 0.00 0.00 0.00 505 5 1 0.00 0.00 0.00 510 6 2 0.00 0.00 0.00 485 7 3 0.00 0.00 0.00 490 8 4 0.00 0.00 0.00 487 9 5 0.00 0.00 0.00 513 10 6 0.00 0.00 0.00 519 11 7 0.10 1.00 0.18 498 12 8 0.00 0.00 0.00 486 13 9 0.00 0.00 0.00 507 14 15 accuracy 0.10 5000 16 macro avg 0.01 0.10 0.02 5000 17weighted avg 0.01 0.10 0.02 5000 18 19/usr/local/lib/python3.6/dist-packages/sklearn/metrics/_classification.py:1272: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior. 20 _warn_prf(average, modifier, msg_start, len(result))

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問