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

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

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

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

深層学習

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

PyTorch

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

Q&A

0回答

2694閲覧

pytorchで画像分類問題を取り扱っているが損失関数の値が収束しないので原因が知りたい

oinari03

総合スコア59

CUDA

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

深層学習

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

PyTorch

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

0グッド

0クリップ

投稿2020/09/07 04:41

編集2020/09/07 06:07

やろうとしていること

犬とに猫の画像分類問題を自作データセットで行おうとしています。

画像の枚数は100枚ほどで、画像サイズは256x256x3になっている画像で検証しようとしていて、犬と猫でのlabelでの分類はできていると思います。

ここで、次にlossの値を収束させるようにと考え、かなり手伝ってもらいましたが、lossのグラフを出すことに成功しました。
しかし、lossの値が思うようになだらかに収束していなので、それの原因とアドバイスを頂けないかと思いましたので、どうかよろしくお願いいたします。

得られた結果(損失のグラフ)

イメージ説明

出したのは、epochごとのlossのグラフです。
こちらのような結果になってしまい、まったく見当がつかない状態です。

ソースコード

実行コード(train.py)
バッチサイズ=32,epoch=100

import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim import model,dataset from model import * from tqdm import tqdm from torch.autograd import Variable import numpy as np from matplotlib import pyplot as plt #一つの機能を作ったら→pritで確認 device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') # 上でgpuの設定device if __name__ == "__main__": # modelの定義 model = model.Net().to(device) model.train() # optimizerの定義 optimizer = torch.optim.SGD( model.parameters(), lr=0.001, momentum=0.9, weight_decay=0.0001) # datasetの定義 # training train_dataset = dataset.MyDatasets( root_dir="./animal_dataset", key="train", ) train_loader = torch.utils.data.DataLoader( train_dataset, batch_size=32, shuffle= True ) # validation valid_dataset = dataset.MyDatasets( root_dir="./animal_dataset", key="val", ) valid_loader = torch.utils.data.DataLoader( valid_dataset, batch_size=32, shuffle= True ) # batch = len(next(iter(train_loader))) #2 # for i in train_loader: # print(i) # for i in valid_loader: # print(i) # iterationの確定 sample_size = len(train_dataset) #129 # num_iters = sample_size // 32 #129 // 32 = 32.03 #loss criterion = nn.CrossEntropyLoss() losses = [] #start epoch epoch_num = 100 for epoch in range(epoch_num): # loop over the dataset multiple times epoch_loss = 0 for i, data in enumerate(train_loader, 0): # get the inputs; data is a list of [inputs, labels] inputs, labels = data[0].to(device), data[1].to(device) # print("label={}".format(labels)) print("inputs={}".format(inputs)) # zero the parameter gradients optimizer.zero_grad() # forward + backward + optimize outputs = model(inputs) loss = criterion(outputs, labels) # print(loss) epoch_loss += loss # losses.append(epoch_loss// epoch + 1) losses.append(np.mean(float(epoch_loss))) # print(losses) print('Finished Training') def plot_history(losses): fig, ax = plt.subplots() epochs = np.arange(1, len(losses) + 1) # 損失の推移 ax.set_title("Loss") ax.plot(epochs, losses) ax.set_xlabel("Epoch") plt.savefig('loss.png') plot_history(losses)

実行結果

個人的にいかがおかしいのではないかと思い、以下をprintしていますので、こちらの実行結果を貼ります。

inputs, labels = data[0].to(device), data[1].to(device) print("label={}".format(labels))

結果

$ python train.py label=tensor([0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0], device='cuda:0') torch.Size([32, 9216]) label=tensor([0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1], device='cuda:0') torch.Size([32, 9216]) label=tensor([0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0], device='cuda:0') torch.Size([32, 9216]) label=tensor([1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0], device='cuda:0') torch.Size([32, 9216]) label=tensor([1], device='cuda:0') torch.Size([1, 9216]) label=tensor([0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1], device='cuda:0') torch.Size([32, 9216]) label=tensor([0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1], device='cuda:0') torch.Size([32, 9216]) label=tensor([0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0], device='cuda:0') torch.Size([32, 9216]) label=tensor([0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1], device='cuda:0') torch.Size([32, 9216]) label=tensor([1], device='cuda:0') torch.Size([1, 9216]) Finished Training

次にinputの中身を表示したいと思います。

まとめ

個人的にはlossの値がおかしいのだろうなとは思っていますが、具体的にどうおかしくて、どう訂正すればいいのかが見当がつきません。
bathsizeを4などに増やしたらむしろlossが上がってしまいました...

できれば画像を増やす以外の方法を教えていただけるとありがたいです。

なぜ、lossが振動してしまってるんでしょうかね....
labelが正しい形になっていないんですかね。その正しい形って何ですかね。
やっぱりどこをどういじればいいのかわからないのです。

ですので、どこの値をみてどこを変更すればいいのか教えていただけると幸いです。

深層学習についての知識が乏しい中やろうとしていることであり、基礎が足りないような気もしていますが、どうかご教授くださいませ。

また、足りない情報や補足があれば追記いたしますのでご指摘よろしくお願いいたします。

参考

lossのドキュメント(pytorch)

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

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

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

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

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

meg_

2020/09/07 12:06

> 画像の枚数は100枚ほどで 犬と猫はそれぞれ何枚ですか?
退会済みユーザー

退会済みユーザー

2020/09/07 14:01

このコードはゼロから作ったものでしょうか? ゼロから作ったコード:全体にポカが含まれていてもおかしくありません。まずはネットワークを小さくしてトイプロブレムのMNISTでちゃんと使えるか検証した方が良いです。 ほぼ実績のあるコード:ハイパーパラメータか画像の問題が疑われます。学習率を3-5桁下げてみる、画像をcv2.imshowか何かをしてちゃんと入っているか確認する、をしてはいかがでしょうか?
oinari03

2020/09/07 14:07

画像はそれぞれ100枚ずつになっています コードはすべてゼロから作ったものになります。 なるほど....
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問