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

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

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

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

PyTorch

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

CNN (Convolutional Neural Network)

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

Q&A

解決済

1回答

1501閲覧

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

Sky

総合スコア10

CUDA

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

PyTorch

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

CNN (Convolutional Neural Network)

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

0グッド

0クリップ

投稿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 ))

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

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

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

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

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

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 の「質問をした後に自己解決してしまった」には、「後から読む人のためにも、具体的な解決手順を記載してください。」と書かれてます
guest

回答1

0

自己解決

ありがとうございました!

投稿2022/05/23 07:57

Sky

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問