やろうとしていること
犬とに猫の画像分類問題を自作データセットで行おうとしています。
画像の枚数は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が正しい形になっていないんですかね。その正しい形って何ですかね。
やっぱりどこをどういじればいいのかわからないのです。
ですので、どこの値をみてどこを変更すればいいのか教えていただけると幸いです。
深層学習についての知識が乏しい中やろうとしていることであり、基礎が足りないような気もしていますが、どうかご教授くださいませ。
また、足りない情報や補足があれば追記いたしますのでご指摘よろしくお願いいたします。
参考
あなたの回答
tips
プレビュー