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

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

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

CUDAは並列計算プラットフォームであり、Nvidia GPU(Graphics Processing Units)向けのプログラミングモデルです。CUDAは様々なプログラミング言語、ライブラリ、APIを通してNvidiaにインターフェイスを提供します。

PyTorch

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

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

解決済

機械学習 CNN 学習が進まない時の対処を教えて下さい。

Sky
Sky

総合スコア8

CUDA

CUDAは並列計算プラットフォームであり、Nvidia GPU(Graphics Processing Units)向けのプログラミングモデルです。CUDAは様々なプログラミング言語、ライブラリ、APIを通してNvidiaにインターフェイスを提供します。

PyTorch

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

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

1回答

0評価

0クリップ

194閲覧

投稿2022/05/21 10:20

機械学習で学習が進まない理由を教えてください。

CNNでCIFAR10の10クラス分類をしたいのですが、以下を実行しても、0エポック目からのtrain loss、train accuracy がともに変化しません。(順に2.3,0.1くらいです)
どのように改良すれば学習が進むようになるのでしょうか?
エポックやバッチサイズ、学習率は変えてみましたがそこまでの変化はありませんでした。

(前処理としてZCA白色化を行っています。またバッチ数は64、初期学習率は0.01です。
optimizerはAdam、損失関数はクロスエントロピーを用いました。
畳み込みは3回、全結合層は2層で、活性化関数はreluです。)

import numpy as np import pandas as pd import torch from torchvision import transforms from tqdm import tqdm_notebook as tqdm from PIL import Image from sklearn.model_selection import train_test_split import numpy as np import pandas as pd import torch from torchvision import transforms from tqdm import tqdm_notebook as tqdm from PIL import Image from sklearn.model_selection import train_test_split import torch.nn as nn import torch.optim as optim import torch.autograd as autograd import torch.nn.functional as F class BatchNorm(nn.Module): def __init__(self, shape, epsilon=np.float32(1e-5)): super().__init__() self.gamma = nn.Parameter(torch.tensor(np.ones(shape, dtype='float32'))) self.beta = nn.Parameter(torch.tensor(np.zeros(shape, dtype='float32'))) self.epsilon = epsilon def forward(self, x): mean = torch.mean(x, (0, 2, 3), keepdim=True) std = torch.std(x, (0, 2, 3), keepdim=True) x_normalized = (x - mean) / (std**2 + self.epsilon)**0.5 return self.gamma * x_normalized + self.beta class Conv(nn.Module): def __init__(self, filter_shape, function=lambda x: x, stride=(1, 1), padding=1): super().__init__() # Heの初期値 fan_in = filter_shape[1] * filter_shape[2] * filter_shape[3] # filter_shape: (出力チャンネル数)x(入力チャンネル数)x(縦の次元数)x(横の次元数) fan_out = filter_shape[0] * filter_shape[2] * filter_shape[3] self.W = nn.Parameter(torch.tensor(rng.normal( 0, np.sqrt(2/fan_in), size=filter_shape ).astype('float32'))) # バイアスはフィルタごとなので, 出力フィルタ数と同じ次元数 self.b = nn.Parameter(torch.tensor(np.zeros((filter_shape[0]), dtype='float32'))) self.function = function self.stride = stride self.padding = padding def forward(self, x): u = F.conv2d(x, self.W, bias=self.b, stride=self.stride, padding=self.padding) return self.function(u) class Pooling(nn.Module): def __init__(self, ksize=(2, 2), stride=(2, 2), padding=0): super().__init__() self.ksize = ksize self.stride = stride self.padding = padding def forward(self, x): return F.avg_pool2d(x, kernel_size=self.ksize, stride=self.stride, padding=self.padding) class Flatten(nn.Module): def __init__(self): super().__init__() def forward(self, x): print(x.size[0]) return x.view(x.size()[0], -1) class Dense(nn.Module): def __init__(self, in_dim, out_dim, function=lambda x: x): super().__init__() # He Initialization # in_dim: 入力の次元数、out_dim: 出力の次元数 self.W = nn.Parameter(torch.tensor(rng.normal( 0, np.sqrt(2/in_dim), size=(in_dim, out_dim) ).astype('float32'))) self.b = nn.Parameter(torch.tensor(np.zeros([out_dim]).astype('float32'))) self.function = function def forward(self, x): return self.function(torch.matmul(x, self.W) + self.b) class Activation(nn.Module): def __init__(self, function=lambda x: x): super().__init__() self.function = function def __call__(self, x): return self.function(x) rng = np.random.RandomState(1234) random_state = 42 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") print(device) conv_net = nn.Sequential( nn.Conv2d(3, 32, 3), # 32x32x3 -> 30x30x32 nn.BatchNorm2d(32), nn.ReLU(), nn.AvgPool2d(2), # 30x30x32 -> 15x15x32 nn.Conv2d(32, 64, 3), # 15x15x32 -> 13x13x64 nn.BatchNorm2d(64), nn.ReLU(), nn.AvgPool2d(2), # 13x13x64 -> 6x6x64 nn.Conv2d(64, 128, 3), # 6x6x64 -> 4x4x128 nn.BatchNorm2d(128), nn.ReLU(), nn.AvgPool2d(2), # 4x4x128 -> 2x2x128 nn.Flatten(), nn.Linear(2*2*128, 256), nn.ReLU(), nn.Linear(256, 10) ) def init_weights(m): # Heの初期化 if type(m) == nn.Linear or type(m) == nn.Conv2d: torch.nn.init.kaiming_normal_(m.weight) m.bias.data.fill_(0.0) conv_net.apply(init_weights) n_epochs = 300 lr = 0.1 device = 'cuda' conv_net.to(device) optimizer = optim.Adam(conv_net.parameters(), lr=lr) loss_function = nn.CrossEntropyLoss() for epoch in range(n_epochs): losses_train = [] losses_valid = [] if epoch < 100: lr = 0.01 elif epoch < 200: lr = 0.002 elif epoch < 300: lr = 0.0001 conv_net.train() n_train = 0 acc_train = 0 for x, t in dataloader_train: n_train += t.size()[0] conv_net.zero_grad() # 勾配の初期化 x = x.to(device) # テンソルをGPUに移動 t = t.to(device) y = conv_net.forward(x) # 順伝播 loss = loss_function(y, t) # 誤差(クロスエントロピー誤差関数)の計算 loss.backward() # 誤差の逆伝播 optimizer.step() # パラメータの更新 pred = y.argmax(1) # 最大値を取るラベルを予測ラベルとする acc_train += (pred == t).float().sum().item() losses_train.append(loss.tolist()) conv_net.eval() n_val = 0 acc_val = 0 for x, t in dataloader_valid: n_val += t.size()[0] x = x.to(device) # テンソルをGPUに移動 t = t.to(device) y = conv_net.forward(x) # 順伝播 loss = loss_function(y, t) # 誤差(クロスエントロピー誤差関数)の計算 pred = y.argmax(1) # 最大値を取るラベルを予測ラベルとする acc_val += (pred == t).float().sum().item() losses_valid.append(loss.tolist()) print('EPOCH: {}, Train [Loss: {:.3f}, Accuracy: {:.3f}], Valid [Loss: {:.3f}, Accuracy: {:.3f}]'.format( epoch, np.mean(losses_train), acc_train/n_train, np.mean(losses_valid), acc_val/n_val ))

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

jbpb0

2022/05/21 23:27

> 前処理としてZCA白色化を行っています。 は、性能がある程度出てからやったらいいと思います それをやるかどうかは、直接は質問内容とは関係無いかもしれませんが、何が起きてるかよく分からない場合は、できるだけシンプルな状態で確認する方が、原因分析がしやすくなります
jbpb0

2022/05/22 23:42

もっと簡単な問題で実行してみたら、いかがでしょうか たとえば、真っ白な画像と真っ黒な画像だけ使って、白黒画像を判別させてみるとか (「ZCA白色化」は無しで) もしそれでもうまくいかないなら、コードに問題がある可能性があります
Sky

2022/05/23 07:56

ご丁寧にありがとうございます! おかげさまで無事解決できました!
jbpb0

2022/05/23 11:42

https://teratail.com/help#resolve-myself の「質問をした後に自己解決してしまった」には、「後から読む人のためにも、具体的な解決手順を記載してください。」と書かれてます

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

CUDA

CUDAは並列計算プラットフォームであり、Nvidia GPU(Graphics Processing Units)向けのプログラミングモデルです。CUDAは様々なプログラミング言語、ライブラリ、APIを通してNvidiaにインターフェイスを提供します。

PyTorch

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

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。