u-netを使用した2クラス分類の学習のlossが下がらない原因が分かりません。
現在のlossはこのようになっています。
学習率を変えたりしましたが全く改善されません。入力のサイズはあっていると思いますので入力の値の形式に問題があるのかもしれないと現在考えています。
ネットワークはchainerを使用したu-netです。入力画画像(batchsize×1×W_img×H_img)に対してラベル画像(batchsize×1×W_label×H_label)を対応させて学習しています。(W_label≒W_img,H_label≒H_img)ラベル画像は01のマスク画像です。コードの詳細部分はところどころ****で略しています。
もし可能性として考えられるものがありましたら、教えていただきたいです。よろしくお願いいたします。
python
1 2def main(gpu, epoch, ites, bsize, trfolder, trlabel, modelname): 3 chainer.cuda.get_device(gpu).use() 4 net = UNET() 5 net.to_gpu() 6 opt = chainer.optimizers.Adam() 7 opt.setup(net) 8 stime = time.clock() 9 train = data.TrainData(trfolder, trlabel) 10 x_train = train.get_len() 11 train_batchnum = -(-x_train // bsize) 12 print('epoch time train/loss test/loss ') 13 for ep in range(1, 1+epoch): 14 train_loss_sum = cp.float32(0) 15 train.shuffle() 16 for b in range(ites): 17 x_batch, y_batch, r_batch = train.u_data(b, min(b + bsize, x_train)) 18 x, y = Variable(cuda.to_gpu(x_batch)), Variable(cuda.to_gpu(y_batch)) 19 r = Variable(cuda.to_gpu(r_batch)) 20 h = net(x) 21 loss = ***** 22 net.cleargrads() 23 loss.backward() 24 opt.update() 25 train_loss_sum += loss.data 26 print('{0:5} {1:7.1f} {2:.6f}'.format(ep, time.clock()-stime, float(train_loss_sum)/ites) 27 chainer.serializers.save_npz('{}_{}'.format(modelname, ep), net) 28
python
1import cv2 2import os 3import numpy as np 4import random 5import sys 6import math 7 8class TrainData: 9 def __init__(self, folder, labelfolder): 10 self.lst = [] 11 files = os.listdir(folder) 12 for i in range(len(files)): 13 img = cv2.imread(folder + files[i], 0).astype(np.float32) / 255.0 14 img = cv2.resize(img, (W_img, H_img), interpolation=cv2.INTER_NEAREST) 15 label = cv2.imread(labelfolder + files[i]) 16 label = cv2.resize(label, (W_label, H_label), interpolation=cv2.INTER_NEAREST) 17 labelb = np.zeros_like(label) 18 labelb[**********] = 1 19 label = labelb[:, :, 0] 20 self.lst.append((img, label, files[i])) 21 22 def shuffle(self): 23 np.random.shuffle(self.order) 24 25 def get_len(self): 26 return len(self.lst) 27 28 def u_data(self, _from, _to): 29 x = np.empty((batchsize, 1, W_img, H_img), dtype=np.float32) 30 y = np.empty((batchsize, 1 , W_label, H_label), dtype=np.float32) 31 for i in range(_from, _to): 32 img, label, fname = self.lst[self.order[i]] 33 height = img.shape[0] 34 width = img.shape[1] 35 center = (int(width/2), int(height/2)) 36 angle = ***** 37 scale = ***** 38 trans = cv2.getRotationMatrix2D(center, angle , scale) 39 img = cv2.warpAffine(img, trans, (W_img,H_img)) 40 label = cv2.warpAffine(label, trans, (W_label,H_label)) 41 x[i-_from, :, :, :] = img 42 y[i-_from, :, :, :] = label 43 ratio = np.maximum(np.float32(np.count_nonzero(label)), *****) / ((*****)*batchsize) 44 r = np.where(y > *****, *****, *****).astype(np.float32) 45 return x, y, r
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。