DP-GAN 損失

先ほど、ジェネレーターとディスクリミネーターの構成について見てきました。
ジェネレータの損失公式:
ここに画像の説明を挿入
ここに画像の説明を挿入
最初に偽の画像と実際の画像を弁別器に入力します:
次に最初の損失を確認します: パラメータは弁別器を通した偽の画像の出力マスクと、損失計算用の本物のラベルです。以下に対応します。
ここに画像の説明を挿入
ここで、損失は以下に対応します。

class losses_computer():
    def __init__(self, opt):
        self.opt = opt
        if not opt.no_labelmix:
            self.labelmix_function = torch.nn.MSELoss()

    def loss(self, input, label, for_real):#true
        #--- balancing classes ---
        weight_map = get_class_balancing(self.opt, input, label)
        #--- n+1 loss ---
        target = get_n1_target(self.opt, input, label, for_real)
        loss = F.cross_entropy(input, target, reduction='none')
        if for_real:
            loss = torch.mean(loss * weight_map[:, 0, :, :])
        else:
            loss = torch.mean(loss)
        return loss

1: まずカテゴリのバランスをとり、入力サイズは (1,36,256,512)、ラベル サイズは (1,35,256,512) です。
ここに画像の説明を挿入
最初にラベルの各チャンネルのすべての値を加算し、最後に C 値のみを加算します残っています。
ここに画像の説明を挿入
次に、class_occurence の最初の値を 0 (ラベルの最初の値は空) に置き換え、リストの値を 0 と比較し、カテゴリの合計である True の数を数えます。
次に、合計カテゴリの重みを見つけます。画像には 24 個のカテゴリがあり、合計ラベル マップには 35 個のカテゴリがあり、欠落しているカテゴリは inf です。
ここに画像の説明を挿入
argmaxに従ってラベルのチャネルインデックスを取得し、1チャネルのマ​​スクマップを出力します。
ここに画像の説明を挿入
カテゴリに従って、対応する重量値を見つけます。
ここに画像の説明を挿入
次に、ラベルとラベルが次のように入力されます。ここに画像の説明を挿入
まず、入力と同じサイズのすべて 1 の行列を取得します。この行列は cuda 上に配置され、1 で埋められ、更新する必要がなく、入力と同じ次元を持ちます。
ここに画像の説明を挿入
次に、ラベルのインデックスを取得し、すべての値が 35 になるように all-1 行列のターゲット圧縮チャネル次元と numclass を乗算し、それをラベルのカテゴリ値に追加します。加算後の値は 35 より大きい必要があるため、つまり、クランプは 34 未満の値を 34 に置き換えます。 (クランプが機能しないように感じます)、35 を引いて 1 を加算することは、すべての値に 1 を加算することと同じです。ラベルのカテゴリ値。最後に、ディスクリミネータのデコーダ出力と実ラベル
に対してクロスエントロピー計算が実行されます損失とカテゴリの重みを乗算し、平均を計算して最終的な損失を求めます。次に、2 番目の損失があります。ジェネレーターは、ディスクリミネーターをだますことができる結果を生成することを望んでおり、フェイクによって生成される画像は可能な限り本物である必要があります。スコアは、弁別器のエンコーダー部分の 2 つの出力です。GANloss 時:損失時:
ここに画像の説明を挿入

ここに画像の説明を挿入

ここに画像の説明を挿入


ここに画像の説明を挿入

ここに画像の説明を挿入
ジェネレーターは patch_loss を完全には実装していません。損失を小さくするには、D が最終的にチャネル 1 の値、つまりシグモイド後の各ピクセルの出力値を出力するため、-1+D(x) が 0 に近づく必要があります。が [0,1] 内にある場合、-1+D(x) を最小化するには、出力は可能な限り 1 でなければなりません。つまり、出力は可能な限り正確である必要があります。
ここに画像の説明を挿入
ここに画像の説明を挿入
得られた 2 つの GANloss が平均に加算され、その後、前の対決の損失に加算されます。
3 番目は、特徴マッチング損失です。入力は、デコーダを介した本物の画像と偽の画像の 5 つの中間変数の出力です。
ここに画像の説明を挿入
ここに画像の説明を挿入
ループを通じて各出力ペア間の MSE 損失を計算します。ここに画像の説明を挿入
生成された結果を前の 2 つの損失に加算します。
最終出力: 合計損失、[敵対的損失、なし]。
ここに画像の説明を挿入
次に、損失は平均化されて逆伝播されます。
次に、弁別器の損失について説明します。
式によると、GAN 損失は、偽の画像と実際の画像によって生成された中間変数を計算し、それらを加算する必要があります。ジェネレーターは E(z,l) を計算する必要はありません。
ここに画像の説明を挿入
コードでは、ターゲットの True と False を制御することで 2 つの損失が計算されます。
ここに画像の説明を挿入
ここに画像の説明を挿入
損失には次のものが含まれます。
1: 弁別器を介して偽画像によって取得されたマスクと本物のラベルによって対立損失が計算されます。
2: 実画像は、識別器によって得られたマスクと実ラベルを通じて対立損失を計算します。
3: 2 つの GAN 損失。
4: ラベル ミックスは、
ここに画像の説明を挿入
ここに画像の説明を挿入
最初にラベル上のカテゴリ値を取得し、次にカテゴリ値を走査し、マスク内のカテゴリをランダムに 0 または 1 に置き換えます。次に、それを実際のイメージと乗算し、target_map を反転して、fake_image と乗算します。最後に追加します。最後に、混合イメージと新しい target_map を出力します。
混合画像は弁別器に入力され、ラベルミックス損失が計算されます。4
つのパラメーター: [0,1] で置き換えられたマスク、弁別器を介した mix_image の出力、弁別器を介した fake_image の出力、および弁別器を介した real_image の出力識別子。
ここに画像の説明を挿入
ここに画像の説明を挿入
生成された label_mix 損失は、元の 3 つの損失に追加されます。
これで弁別器損失の計算が完了します。

おすすめ

転載: blog.csdn.net/qq_43733107/article/details/132035310