1. CycleGAN的簡(jiǎn)介
? ? ? ? pix2pix可以很好地處理匹配數(shù)據(jù)集圖像轉(zhuǎn)換爽室,但是在很多情況下匹配數(shù)據(jù)集是沒(méi)有的或者是很難收集到的汁讼,但是我們可以很容易的得到兩個(gè)領(lǐng)域大量的非匹配數(shù)據(jù)。2017年有兩篇非常相似的論文CycleGAN和DiscoGAN阔墩,提出了一種解決非匹配數(shù)據(jù)集的圖像轉(zhuǎn)換方案嘿架。而且CycleGAN在轉(zhuǎn)換的過(guò)程中,只是將A領(lǐng)域圖像的某些特性轉(zhuǎn)換成B領(lǐng)域的一些特性啸箫,圖像的其余大部分內(nèi)容都沒(méi)有改變耸彪。CycleGAN 能實(shí)現(xiàn)兩個(gè)相近數(shù)據(jù)集之間的轉(zhuǎn)換。
2. CycleGAN的網(wǎng)絡(luò)結(jié)構(gòu)
? ? ? ? 該結(jié)構(gòu)中忘苛,生成器相當(dāng)于一個(gè)自編碼網(wǎng)絡(luò)蝉娜,前半部分進(jìn)行編碼唱较,后半部分進(jìn)行解碼,而且生成器G和生成器F的結(jié)構(gòu)完全相同召川,其中生成器G負(fù)責(zé)實(shí)現(xiàn)由X到Y(jié)的轉(zhuǎn)換绊汹,生成器F負(fù)責(zé)實(shí)現(xiàn)由Y到X的轉(zhuǎn)換,它們的輸入扮宠、輸出的大小均為(batch_size, n_channel, cols, rows)西乖,判別器的輸入為(batch_size, n_channel, cols, rows), 判別器的輸出為(batch_size, 1, s1, s2)。
3. CycleGAN的損失函數(shù)
(1)對(duì)抗損失
對(duì)抗損失的作用是坛增,使生成的目標(biāo)領(lǐng)域的圖像和目標(biāo)領(lǐng)域的真實(shí)圖像盡可能地接近获雕。
(2)循環(huán)損失
循環(huán)損失的作用是,使生成的圖像盡可能多的保留原始圖像的內(nèi)容收捣。
在網(wǎng)絡(luò)訓(xùn)練的過(guò)程中是將G和F聯(lián)合起來(lái)一起訓(xùn)練的届案,和是單獨(dú)進(jìn)行訓(xùn)練的。
G-F聯(lián)合網(wǎng)絡(luò)的損失函數(shù)為:
fake_B = G_AB(real_A)
loss_GAN_AB = torch.nn.MSELoss(D_B(fake_B), valid)
fake_A = G_BA(real_B)
loss_GAN_BA = torch.nn.MSELoss(D_A(fake_A), valid)
loss_G_GAN = (loss_GAN_AB + loss_GAN_BA) / 2? ? ? #? 生成器的對(duì)抗損失
recov_A = G_BA(fake_B)
loss_cycle_A = torch.nn.L1Loss(recov_A, real_A)
recov_cycle_B = G_AB(fake_A)
loss_cycle_B = torch.nn.L1Loss(recov_B, real_B)
loss_cycle = (loss_cycle_A + loss_cycle_B) / 2? ? ? ? ? #? 生成器的循環(huán)損失
Loss_G = loss_G_GAN + lambda_cycle * loss_cycle
的損失函數(shù)為:?
loss_real = torch.nn.MSELoss(D_A(real_A), valid)
fake_A = fake_A_buffer.push_and_pop(fake_A)
loss_fake = torch.nn.MSELoss(D_A(fake_A.detach()), fake)
loss_D_A = (loss_real + loss_fake) / 2
的損失函數(shù)為:?
loss_real = torch.nn.MSELoss(D_B(real_B), valid)
fake_B = fake_B_buffer.push_and_pop(fake_B)
loss_fake = torch.nn.MSELoss(D_B(fake_B.detach(), fake)
loss_D_B = (loss_real + loss_fake) / 2