コード例 #1
0
    def Loss_on_layer_GAN(self, image, finding, impression, decoder, D):
        '''
        Pretrain genertaor with batch
        :image image batch
        :text text batch
        '''

        image1 = F.interpolate(image, size=(64, 64))
        image2 = F.interpolate(image, size=(128, 128))
        image3 = F.interpolate(image, size=(256, 256))
        real_img = [image1,image2,image3]
        bsz = self.batch_size
        #hidden = self.encoder.init_hidden(bsz)
        words_emb, sent_emb = self.encoder(finding, impression)
        words_emb, sent_emb = words_emb.detach(), sent_emb.detach()
        mask1 = (finding == 0)
        mask2 = (impression == 0)
        mask = torch.cat((mask1, mask2), 1)
        num_words = words_emb.size(2)
        if mask.size(1) > num_words:
            mask = mask[:, :num_words]

        pre_image, _, mu, logvar = decoder(sent_emb, words_emb, mask)

        # Train Discriminator

        self.D_optimizer.zero_grad()
        total_D_loss = 0

        for i in range(3):
            pre_fake = D[i](pre_image[i], mu.detach())
            pre_real = D[i](real_img[i], mu.detach())
            gradient_penalty, gradients = cal_gradient_penalty(D[i], real_img[i], pre_image[i], mu.detach(), "cuda")

            D_loss = pre_fake.mean() - pre_real.mean() + gradient_penalty
            total_D_loss += D_loss
            D_loss.backward(retain_graph=True)

        self.D_optimizer.step()

        # Train Generator

        self.G_optimizer.zero_grad()
        G_loss = 0
        for i in range(3):
            pre_fake = D[i](pre_image[i], mu.detach())

            adv_loss = - self.adv_loss_ratio * pre_fake.mean()
            adv_loss.backward(retain_graph=True)

            content_loss = self.pix_loss_ratio * self.G_criterion(pre_image[i].float(),
                                                                  real_img[i].float())
            content_loss.backward(retain_graph=True)

            G_loss += content_loss
            G_loss += adv_loss

        self.G_optimizer.step()

        return total_D_loss, G_loss, pre_image[-1], real_img[-1]
コード例 #2
0
    def Loss_on_layer_GAN(self, image, finding, impression, decoder, D):
        '''
        Pretrain genertaor with batch
        :image image batch
        :text text batch
        '''

        image1 = F.interpolate(image, size=(64, 64))
        image2 = F.interpolate(image, size=(128, 128))
        image3 = F.interpolate(image, size=(256, 256))
        real_img = [image1, image2, image3]
        txt_emded, hidden = self.encoder(finding, impression)
        pre_image, mu, logvar = decoder(txt_emded)

        # Train Discriminator

        self.D_optimizer.zero_grad()
        total_D_loss = 0

        for i in range(3):
            pre_fake = D[i](pre_image[i], mu.detach())
            pre_real = D[i](real_img[i], mu.detach())
            gradient_penalty, gradients = cal_gradient_penalty(
                D[i], real_img[i], pre_image[i], mu.detach(), "cuda")

            D_loss = pre_fake.mean() - pre_real.mean() + gradient_penalty
            total_D_loss += D_loss
            D_loss.backward(retain_graph=True)

        self.D_optimizer.step()

        # Train Generator

        self.G_optimizer.zero_grad()
        G_loss = 0
        for i in range(3):
            pre_fake = D[i](pre_image[i], mu.detach())

            adv_loss = -self.adv_loss_ratio * pre_fake.mean()
            adv_loss.backward(retain_graph=True)

            content_loss = self.pix_loss_ratio * self.G_criterion(
                pre_image[i].float(), real_img[i].float())
            content_loss.backward(retain_graph=True)

            G_loss += content_loss
            G_loss += adv_loss

        self.G_optimizer.step()

        return total_D_loss, G_loss, pre_image[-1], real_img[-1]
コード例 #3
0
ファイル: trainer_wgan-gp.py プロジェクト: user432/XRayGAN
    def Loss_on_layer_GAN(self, image, finding, impression, decoder, D):
        '''
        Pretrain genertaor with batch
        :image image batch
        :text text batch
        '''

        txt_emded, hidden = self.encoder(finding, impression)
        pre_image = decoder(txt_emded)

        # Train Discriminator

        self.D_optimizer.zero_grad()
        pre_fake = D(pre_image, txt_emded)
        pre_real = D(image, txt_emded)
        gradient_penalty, gradients = cal_gradient_penalty(
            D, image, pre_image, txt_emded, "cuda")

        D_loss = pre_fake.mean() - pre_real.mean() + gradient_penalty
        D_loss.backward(retain_graph=True)

        self.D_optimizer.step()

        # Train Generator

        self.G_optimizer.zero_grad()

        pre_fake = D(pre_image, txt_emded)

        adv_loss = -self.adv_loss_ratio * pre_fake.mean()
        adv_loss.backward(retain_graph=True)

        content_loss = self.pix_loss_ratio * self.G_criterion(
            pre_image.float(), image.float())
        content_loss.backward(retain_graph=True)

        G_loss = content_loss + adv_loss

        self.G_optimizer.step()

        return D_loss, G_loss, pre_image, image