pix2pixHD---モデル---識別子

ジェネレーターを構築した後、ディスクリミネーターを構築します。
まず、ディスクリミネータの入力、つまりラベルとジェネレータの出力をそれぞれ見てみましょう。
ここに画像の説明を挿入
トレーニング中、ディスクリミネーター チャネルの入力は、ジェネレーターの出力に条件を加えたもの (ラベルとインスタンスを連結したもの) に等しくなります。チャンネル追加は画像連結です。
ここに画像の説明を挿入
サンプル画像を使用する場合、弁別器の入力チャネルの数が 1 つ増加し、ネットワーク ファイルの define_D を呼び出して弁別器の設計を表示します。まず、いくつかのパラメーターを指定します。弁別器はマルチスケール弁別器
です
ここに画像の説明を挿入
ここに画像の説明を挿入

class MultiscaleDiscriminator(nn.Module):
    def __init__(self, input_nc, ndf=64, n_layers=3, norm_layer=nn.BatchNorm2d, 
                 use_sigmoid=False, num_D=3, getIntermFeat=False):
        super(MultiscaleDiscriminator, self).__init__()
        self.num_D = num_D
        self.n_layers = n_layers
        self.getIntermFeat = getIntermFeat
     
        for i in range(num_D):
            netD = NLayerDiscriminator(input_nc, ndf, n_layers, norm_layer, use_sigmoid, getIntermFeat)
            if getIntermFeat:                                
                for j in range(n_layers+2):
                    setattr(self, 'scale'+str(i)+'_layer'+str(j), getattr(netD, 'model'+str(j)))                                   
            else:
                setattr(self, 'layer'+str(i), netD.model)

        self.downsample = nn.AvgPool2d(3, stride=2, padding=[1, 1], count_include_pad=False)

    def singleD_forward(self, model, input):
        if self.getIntermFeat:
            result = [input]
            for i in range(len(model)):
                result.append(model[i](result[-1]))
            return result[1:]
        else:
            return [model(input)]

    def forward(self, input):        
        num_D = self.num_D
        result = []
        input_downsampled = input
        for i in range(num_D):
            if self.getIntermFeat:
                model = [getattr(self, 'scale'+str(num_D-1-i)+'_layer'+str(j)) for j in range(self.n_layers+2)]
            else:
                model = getattr(self, 'layer'+str(num_D-1-i))
            result.append(self.singleD_forward(model, input_downsampled))
            if i != (num_D-1):
                input_downsampled = self.downsample(input_downsampled)
        return result

まず forward 関数を見てください。getIntermFeat が True に等しく、次に属性を取得する getattr があり、次に属性を設定する setattr が必要です。
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
scale2_layer0/1/2/3/4、scale1_layer0/1/2/3/4、scale2_layer0/1/2/3/4 に対応する属性を取得します。ここでは 2 つの手順を説明します。最初の getattr(netD, 'model'+
ここに画像の説明を挿入
str
( j))) netDに対応するmodel0/1/2/3/4に対応する属性を取得します。

# Defines the PatchGAN discriminator with the specified arguments.
class NLayerDiscriminator(nn.Module):
    def __init__(self, input_nc, ndf=64, n_layers=3, norm_layer=nn.BatchNorm2d, use_sigmoid=False, getIntermFeat=False):
        super(NLayerDiscriminator, self).__init__()
        self.getIntermFeat = getIntermFeat
        self.n_layers = n_layers

        kw = 4
        padw = int(np.ceil((kw-1.0)/2))
        sequence = [[nn.Conv2d(input_nc, ndf, kernel_size=kw, stride=2, padding=padw), nn.LeakyReLU(0.2, True)]]

        nf = ndf
        for n in range(1, n_layers):
            nf_prev = nf
            nf = min(nf * 2, 512)
            sequence += [[
                nn.Conv2d(nf_prev, nf, kernel_size=kw, stride=2, padding=padw),
                norm_layer(nf), nn.LeakyReLU(0.2, True)
            ]]

        nf_prev = nf
        nf = min(nf * 2, 512)
        sequence += [[
            nn.Conv2d(nf_prev, nf, kernel_size=kw, stride=1, padding=padw),
            norm_layer(nf),
            nn.LeakyReLU(0.2, True)
        ]]

        sequence += [[nn.Conv2d(nf, 1, kernel_size=kw, stride=1, padding=padw)]]

        if use_sigmoid:
            sequence += [[nn.Sigmoid()]]

        if getIntermFeat:
            for n in range(len(sequence)):
                setattr(self, 'model'+str(n), nn.Sequential(*sequence[n]))
        else:
            sequence_stream = []
            for n in range(len(sequence)):
                sequence_stream += sequence[n]
            self.model = nn.Sequential(*sequence_stream)

    def forward(self, input):
        if self.getIntermFeat:
            res = [input]
            for n in range(self.n_layers+2):
                model = getattr(self, 'model'+str(n))
                res.append(model(res[-1]))
            return res[1:]
        else:
            return self.model(input)     

model0/1/2/3/4 属性に対応する値を取得します。ini
ここに画像の説明を挿入
に移動して属性を設定する方法を見つけます。まずシーケンスの長さを調べます。for ループに従って、model0 などの対応する属性を設定します。ここに画像の説明を挿入
シーケンスは 5 つの畳み込みと 1 つのシグモイドで構成されます。全長 6。
ここに画像の説明を挿入
次に 6 をトラバースします。model0/1/2/3/4/5 はそれぞれシーケンスの最初の 5 つのリストに対応します。
ここに画像の説明を挿入
次に、5回トラバースし、そのたびにモデルに対応する操作を取り出し、生成された結果をリストに入れます。最初のものは入力され、後者は順番に排出され、最後の処理の結果を取得します。このように 5 回処理すると、リストには 6 つの値があり、最終的に入力を除くすべての値が出力されます。
ここに画像の説明を挿入
差別化は終わった。

おすすめ

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