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

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

ただいまの
回答率

87.59%

u-netでlossが下がらない原因について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,229

score 15

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のマスク画像です。コードの詳細部分はところどころ****で略しています。
もし可能性として考えられるものがありましたら、教えていただきたいです。よろしくお願いいたします。

def main(gpu, epoch, ites, bsize, trfolder, trlabel, modelname):
    chainer.cuda.get_device(gpu).use()
    net = UNET()
    net.to_gpu()
    opt = chainer.optimizers.Adam()
    opt.setup(net)
    stime = time.clock()
    train = data.TrainData(trfolder, trlabel)
    x_train = train.get_len()
    train_batchnum = -(-x_train // bsize) 
    print('epoch    time     train/loss test/loss ')
    for ep in range(1, 1+epoch):
        train_loss_sum = cp.float32(0)
        train.shuffle()
        for b in range(ites):
            x_batch, y_batch, r_batch = train.u_data(b, min(b + bsize, x_train))
            x, y = Variable(cuda.to_gpu(x_batch)), Variable(cuda.to_gpu(y_batch))
            r = Variable(cuda.to_gpu(r_batch))
            h = net(x)
            loss = *****
            net.cleargrads()
            loss.backward()
            opt.update()
            train_loss_sum += loss.data
        print('{0:5} {1:7.1f} {2:.6f}'.format(ep, time.clock()-stime, float(train_loss_sum)/ites)
        chainer.serializers.save_npz('{}_{}'.format(modelname, ep), net)
import cv2
import os
import numpy as np
import random
import sys
import math

class TrainData:
    def __init__(self, folder, labelfolder):
        self.lst = []
        files = os.listdir(folder)
        for i in range(len(files)):
            img = cv2.imread(folder + files[i], 0).astype(np.float32) / 255.0
            img = cv2.resize(img, (W_img, H_img), interpolation=cv2.INTER_NEAREST)
            label = cv2.imread(labelfolder + files[i])
            label = cv2.resize(label, (W_label, H_label), interpolation=cv2.INTER_NEAREST)
            labelb = np.zeros_like(label)
            labelb[**********] = 1
            label = labelb[:, :, 0]
            self.lst.append((img, label, files[i]))

    def shuffle(self):
        np.random.shuffle(self.order)

    def get_len(self):
        return len(self.lst)

    def u_data(self, _from, _to):
        x = np.empty((batchsize, 1, W_img, H_img), dtype=np.float32)
        y = np.empty((batchsize, 1 , W_label, H_label), dtype=np.float32)
        for i in range(_from, _to):
            img, label, fname = self.lst[self.order[i]]
            height = img.shape[0]                         
            width = img.shape[1]                          
            center = (int(width/2), int(height/2))
            angle = *****
            scale = *****
            trans = cv2.getRotationMatrix2D(center, angle , scale)
            img = cv2.warpAffine(img, trans, (W_img,H_img))
            label = cv2.warpAffine(label, trans, (W_label,H_label))  
            x[i-_from, :, :, :] = img
            y[i-_from, :, :, :] = label     
            ratio = np.maximum(np.float32(np.count_nonzero(label)), *****) / ((*****)*batchsize)
            r = np.where(y > *****, *****, *****).astype(np.float32)    
        return x, y, r
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

for b in range(ites):
の部分を for b in range(0, len(test), bsize): 
に変更し、ラベルの数値を見直しましたら無事にlossは収束いたしました

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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