人工智能開(kāi)發(fā)框架應(yīng)用 課后練習(xí)題及答案 項(xiàng)目8_第1頁(yè)
人工智能開(kāi)發(fā)框架應(yīng)用 課后練習(xí)題及答案 項(xiàng)目8_第2頁(yè)
人工智能開(kāi)發(fā)框架應(yīng)用 課后練習(xí)題及答案 項(xiàng)目8_第3頁(yè)
人工智能開(kāi)發(fā)框架應(yīng)用 課后練習(xí)題及答案 項(xiàng)目8_第4頁(yè)
人工智能開(kāi)發(fā)框架應(yīng)用 課后練習(xí)題及答案 項(xiàng)目8_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

項(xiàng)目8利用CycleGAN模型實(shí)現(xiàn)圖像風(fēng)格遷移一、簡(jiǎn)答題1.簡(jiǎn)述CycleGAN與DCGAN的異同之處。CycleGAN和DCGAN是兩種不同類(lèi)型的神經(jīng)網(wǎng)絡(luò)模型,它們?cè)诮Y(jié)構(gòu)和功能上有一些明顯的異同。下面是它們的異同之處:轉(zhuǎn)換、跨域圖像轉(zhuǎn)換等任務(wù);DCGAN的目標(biāo)是學(xué)習(xí)真實(shí)圖像的分布,以便生成具有良好質(zhì)量的合成圖像。采用了一個(gè)生成器和一個(gè)判別器的結(jié)構(gòu)。DCGAN主要用于無(wú)監(jiān)督DCGAN主要用于生成逼真的合成圖像。它們?cè)诮Y(jié)構(gòu)、功能上都有一定的差異。二、實(shí)操題1.8.1、8.28.3CycleGAN模型實(shí)現(xiàn)圖像風(fēng)格遷移模型的搭建和訓(xùn)練。8.1、8.28.3實(shí)施,核心代碼如下:importtorchfromtorch.utilsimportdataimporttorchvisionfromtorchvisionimporttransformsimportnumpyasnpimportmatplotlib.pyplotaspltimportglobfromPILimportImageimporttorch.nnasnnimporttorch.nn.functionalasFimportitertools#打開(kāi)第一張?zhí)O果圖像文件,返回PIL格式圖像image=Image.open('../data/trainA/n07740461_6908.jpg')#繪制圖像plt.imshow(image)#顯示圖像plt.show()#獲取訓(xùn)練數(shù)據(jù)集apple_path=glob.glob('../data/trainA/*.jpg')orange_path=glob.glob('../data/trainB/*.jpg')#獲取測(cè)試數(shù)據(jù)集apple_test_path=glob.glob('../data/testA/*.jpg')orange_test_path=glob.glob('../data/testB/*.jpg')#定義數(shù)據(jù)集類(lèi)classAppleOrangeDataset(data.Dataset):#初始化參數(shù)definit(self,img_path):#初始化保存圖像路徑的數(shù)組self.img_path=img_path#定義數(shù)據(jù)標(biāo)準(zhǔn)化等預(yù)處理操作self.transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize(0.50.5) #將圖像像素值歸一化到[-11]])#獲取指定索引的圖像數(shù)據(jù)defgetitem(self,index):#根據(jù)索引獲取圖像路徑img_path=self.img_path[index]#以PIL格式讀取圖像pil_img=Image.open(img_path)#對(duì)圖像進(jìn)行標(biāo)準(zhǔn)化等預(yù)處理pil_img=self.transform(pil_img)#返回處理后的圖像數(shù)據(jù)returnpil_img#獲取數(shù)據(jù)集的總樣本數(shù)deflen(self):#返回?cái)?shù)組img_path大小returnlen(self.img_path)#創(chuàng)建蘋(píng)果和橙子圖像的數(shù)據(jù)集對(duì)象apple_dataset=AppleOrangeDataset(paint_path)orange_dataset=AppleOrangeDataset(view_path)apple_test_dataset=AppleOrangeDataset(paint_test_path)orange_test_dataset=AppleOrangeDataset(view_test_path)#設(shè)置一個(gè)批次的樣本數(shù)batch_size=1#加載訓(xùn)練數(shù)據(jù)集和測(cè)試數(shù)據(jù)集apple_dl=torch.utils.data.DataLoader(apple_dataset,batch_size=batch_size,shuffle=True)orange_dl=torch.utils.data.DataLoader(orange_dataset,batch_size=batch_size,shuffle=True)apple_test_dl=torch.utils.data.DataLoader(apple_test_dataset,batch_size=batch_size,shuffle=True)orange_test_dl=torch.utils.data.DataLoader(orange_test_dataset,batch_size=batch_size,shuffle=True)#卷積層網(wǎng)絡(luò)類(lèi)classDownsample(nn.Module):definit(self,in_channels,out_channels):super(Downsample,self).init()#定義卷積層self.conv_relu=nn.Sequential(nn.Conv2d(in_channels,out_channels,kernel_size=3,stride=2,padding=1),nn.LeakyReLU(inplace=True),)#語(yǔ)句1定義批量歸一化self.bn=nn.InstanceNorm2d(out_channels)defforward(self,x,is_bn=True):#調(diào)用self.conv_relu函數(shù),進(jìn)行卷積操作x=self.conv_relu(x)ifis_bn:#調(diào)用self.bn函數(shù),進(jìn)行批量的歸一化處理x=self.bn(x)returnx#反卷積層網(wǎng)絡(luò)類(lèi)classUpsample(nn.Module):definit(self,in_channels,out_channels):super(Upsample,self).init()#定義反卷積層self.upconv_relu=nn.Sequential(nn.ConvTranspose2d(in_channels,out_channels,kernel_size=3,stride=2,padding=1,output_padding=1),nn.LeakyReLU(inplace=True))#定義批量歸一化self.bn=nn.InstanceNorm2d(out_channels)defforward(self,x,is_drop=False):#調(diào)用self.upconv_relu函數(shù),進(jìn)行反卷積操作x=self.upconv_relu(x)#調(diào)用self.bn函數(shù),進(jìn)行批量的歸一化處理x=self.bn(x)ifis_drop:#防止過(guò)擬合的處理x=F.dropout2d(x)returnx#生成器網(wǎng)絡(luò)類(lèi)classGenerator(nn.Module):#構(gòu)造方法初始化definit(self):super(Generator,self).init()#定義輸入為3x256x256的第一個(gè)卷積層self.down1=Downsample(3,64)#定義輸入為64x128x128的第二個(gè)卷積層self.down2=Downsample(64,128)#定義輸入為128x64x64的第三個(gè)卷積層self.down3=Downsample(128,256)#定義輸入為256x32x32的第四個(gè)卷積層self.down4=Downsample(256,512)#定義輸入為512x16x16的第五個(gè)卷積層self.down5=Downsample(512,512)#定義輸入為512x8x8的第六個(gè)卷積層self.down6=Downsample(512,512)#定義輸入為512x4x4的第一個(gè)反卷積層self.up1=Upsample(512,512)#定義輸入為1024x8x8的第二個(gè)反卷積層self.up2=Upsample(1024,512)#定義輸入為1024x16x16的第三個(gè)反卷積層self.up3=Upsample(1024,256)#定義輸入為512x32x32的第四個(gè)反卷積層self.up4=Upsample(512,128)#定義輸入為256x64x64的第五個(gè)反卷積層self.up5=Upsample(256,64)#定義輸入為128x128x128的第六個(gè)反卷積層self.last=nn.ConvTranspose2d(128,3,kernel_size=3,stride=2,padding=1,output_padding=1)#定義前向傳播的計(jì)算過(guò)程defforward(self,x):#進(jìn)行第一次卷積,得到64x128x128x1=self.down1(x,is_bn=False)#進(jìn)行第二次卷積,得到128x64x64x2=self.down2(x1)#進(jìn)行第三次卷積,得到256x32x32x3=self.down3(x2)#進(jìn)行第四次卷積,得到512x16x16x4=self.down4(x3)#進(jìn)行第五次卷積,得到512x8x8x5=self.down5(x4)#進(jìn)行第六次卷積,得到512x4x4x6=self.down6(x5)#進(jìn)行第一次反卷積,得到512x8x8x6=self.up1(x6,is_drop=True)#x5x6512x8x81024x8x8,作為下一次輸入x6=torch.cat([x5,x6dim=1)#進(jìn)行第二次反卷積,得到512x16x16x6=self.up2(x6,is_drop=True)#x4x6512x16x161024x16x16,作為下一次輸入x6=torch.cat([x4,x6dim=1)#進(jìn)行第三次反卷積,得到256x32x32x6=self.up3(x6,is_drop=True)#x4x6256x32x32512x32x32,作為下一次輸入x6=torch.cat([x3,x6dim=1)#進(jìn)行第四次反卷積,得到128x64x64x6=self.up4(x6)#x2x6128x64x64256x64x64,作為下一次輸入x6=torch.cat([x2,x6dim=1)#進(jìn)行第五次反卷積,得到64x128x128x6=self.up5(x6)#x1x664x128x128128x128x128,作為下一次輸入x6=torch.cat([x1,x6dim=1)#進(jìn)行第六次反卷積,得到3x256x256x6=torch.tanh(self.last(x6))returnx6#判別器網(wǎng)絡(luò)類(lèi)classDiscriminator(nn.Module):#構(gòu)造方法初始化definit(self):super(Discriminator,self).init()#定義輸入為3x256x256的第一個(gè)卷積層self.down1=Downsample(3,64)#定義輸入為64x128x128的第二個(gè)卷積層self.down2=Downsample(64,128)#定義輸入為128x64x64的第三個(gè)卷積層self.last=nn.Conv2d(128,1,3)#定義前向傳播的計(jì)算過(guò)程defforward(self,img):#進(jìn)行第一次卷積,得到64x128x128x=self.down1(img)#進(jìn)行第二次卷積,得到128x64x64x=self.down2(x)#進(jìn)行第三次卷積,得到1x32x32X=self.last(x)#進(jìn)行二分類(lèi)判斷x=torch.sigmoid(x)returnx#指定所使用的設(shè)備配置device=torch.device('cuda'iftorch.cuda.is_available()else'cpu')#創(chuàng)建生成器網(wǎng)絡(luò)類(lèi)的實(shí)例gen_AB=Generator().to(device)gen_BA=Generator().to(device)#創(chuàng)建判別器網(wǎng)絡(luò)類(lèi)的實(shí)例dis_A=Discriminator().to(device)dis_B=Discriminator().to(device)#定義損失函數(shù)bceloss_fntorch.nn.BCELoss() #定義二值交叉熵?fù)p失函數(shù)l1loss_fntorch.nn.L1Loss() #L1損失函數(shù),用于計(jì)算圖像之間的絕對(duì)誤差#語(yǔ)句1定義Adam優(yōu)化器,用于對(duì)兩個(gè)生成器進(jìn)行同時(shí)優(yōu)化gen_optimizer=torch.optim.Adam(itertools.chain(gen_AB.parameters(),gen_BA.parameters()),lr=2e-4,betas=(0.5,0.999))#定義判別器dis_A的優(yōu)化器dis_A_optimizer=torch.optim.Adam(dis_A.parameters(),lr=2e-4,betas=(0.5,0.999))#定義判別器dis_B的優(yōu)化器dis_B_optimizer=torch.optim.Adam(dis_B.parameters(),lr=2e-4,betas=(0.5,0.999))#圖像風(fēng)格轉(zhuǎn)換函數(shù)defgenerate_images(model,test_input):#利用CyclyGAN模型,將test_input轉(zhuǎn)為不同風(fēng)格的(假)圖像prediction=model(test_input).permute(0,2,3,1).detach().cpu().numpy()#將(假)圖像轉(zhuǎn)為ndarray類(lèi)型test_input=test_input.permute(0,2,3,1).cpu().numpy()#設(shè)置圖形窗口plt.figure(figsize=(10,6))display_list=[test_input[0],prediction[0]]title=['InputImage','GeneratedImage']#繪制網(wǎng)絡(luò)轉(zhuǎn)換前后的兩張圖像foriinrange(2):plt.subplot(1,2,i+1)plt.title(title[i])#將像素值從[-1,1]映射到[0,1]plt.imshow(display_list[i]*0.5+0.5)plt.axis('off')plt.show()#獲取測(cè)試集中一個(gè)批次的數(shù)據(jù)test_batch=next(iter(apple_test_dl))#將測(cè)試數(shù)據(jù)轉(zhuǎn)為模型可接受的形狀,并加載到device上test_input=torch.unsqueeze(test_batch[0],0).to(device)#設(shè)置訓(xùn)練次數(shù)num_epochs=20#初始化生成器和判別器損失值數(shù)組G_loss=[]D_loss=[]#進(jìn)行網(wǎng)絡(luò)訓(xùn)練forepochinrange(num_epochs):#初始化本次訓(xùn)練的生成器和判別器損失值D_epoch_loss=0G_epoch_loss=0forstep,(real_A,real_B)inenumerate(zip(apple_dl,orange_dl)):#將真實(shí)蘋(píng)果圖像加載到devicereal_A=real_A.to(device)#將真實(shí)橙子圖像加載到devicereal_B=real_B.to(device)################################第一階段:生成器網(wǎng)絡(luò)訓(xùn)練################################生成器網(wǎng)絡(luò)的參數(shù)梯度清零gen_optimizer.zero_grad()”””前向傳播:生成器gen_AB和gen_BA的相似損失”””#通過(guò)gen_AB將真實(shí)橙子圖像生成(假)橙子圖像same_B=gen_AB(real_B)#計(jì)算(假)橙子圖像和真實(shí)橙子圖像的L1損失(相似性損失)identity_B_loss=l1loss_fn(same_B,real_B)#通過(guò)gen_BA將真實(shí)蘋(píng)果圖像生成(假)蘋(píng)果圖像same_A=gen_BA(real_A)#計(jì)算(假)蘋(píng)果圖像和真實(shí)蘋(píng)果圖像的L1損失(相似性損失)identity_A_loss=l1loss_fn(same_A,real_A)”””前向傳播:生成器gen_AB和gen_BA的生成損失”””#通過(guò)gen_AB將真實(shí)蘋(píng)果圖像生成(假)橙子畫(huà)圖像fake_B=gen_AB(real_A)#通過(guò)判別器dis_B對(duì)(假)橙子圖像進(jìn)行預(yù)測(cè)D_pred_fake_B=dis_B(fake_B)#語(yǔ)句1計(jì)算判別器dis_B鑒別(假)橙子圖像的二值交叉熵?fù)p失(真假圖像#差異損失)gan_loss_AB=bceloss_fn(D_pred_fake_B,torch.ones_like(D_pred_fake_B,device=device))#通過(guò)gen_BA將真實(shí)橙子圖像生成(假)蘋(píng)果圖像fake_A=gen_BA(real_B)#通過(guò)判別器dis_A對(duì)(假)蘋(píng)果圖像進(jìn)行預(yù)測(cè)D_pred_fake_A=dis_A(fake_A)#計(jì)算判別器dis_A鑒別(假)蘋(píng)果圖像的二值交叉熵?fù)p失(真假圖像#差異損失)gan_loss_BA=bceloss_fn(D_pred_fake_A,torch.ones_like(D_pred_fake_A,device=device))”””前向傳播:生成器gen_AB和gen_BA的復(fù)原損失”””#通過(guò)生成器gen_BA將(假)橙子圖像再恢復(fù)為蘋(píng)果圖像recovered_A=gen_BA(fake_B)#計(jì)算恢復(fù)的蘋(píng)果圖像和真實(shí)蘋(píng)果圖像的L1損失(重建損失)cycle_loss_ABA=l1loss_fn(recovered_A,real_A)#通過(guò)生成器gen_AB將(假)蘋(píng)果圖像再恢復(fù)為橙子圖像recovered_B=gen_AB(fake_A)#計(jì)算恢復(fù)的橙子圖像和真實(shí)橙子圖像的L1損失(重建損失)cycle_loss_BAB=l1loss_fn(recovered_B,real_B)#計(jì)算生成器總體損失:兩個(gè)生成器各自的相似性損失、真假圖像#差異損失和重建損失g_loss=(identity_B_loss+identity_A_loss+gan_loss_AB+gan_loss_BA+cycle_loss_ABA+cycle_loss_BAB)”””后向傳播:兩個(gè)生成器的梯度計(jì)算”””#同時(shí)計(jì)算兩個(gè)生成器的梯度g_loss.backward()#更新兩個(gè)生成器的參數(shù)gen_optimizer.step()################################第二階段:判別器網(wǎng)絡(luò)訓(xùn)練################################將判別器dis_A網(wǎng)絡(luò)參數(shù)的梯度清零dis_A_optimizer.zero_grad()”””前向傳播:判別器dis_A的判別的損失”””#通過(guò)判別器dis_A對(duì)真實(shí)蘋(píng)果圖像進(jìn)行預(yù)測(cè)dis_A_real_output=dis_A(real_A)#計(jì)算dis_A鑒別真實(shí)蘋(píng)果圖像的判別損失dis_A_real_loss=bceloss_fn(dis_A_real_output,torch.ones_like(dis_A_real_output,device=device))#通過(guò)判別器dis_A對(duì)(假)蘋(píng)果圖像進(jìn)行預(yù)測(cè)dis_A_fake_output=dis_A(fake_A.detach())#計(jì)算dis_A鑒別(假)蘋(píng)果圖像的判別損失dis_A_fake_loss=bceloss_fn(dis_A_fake_output,torch.zeros_like(dis_A_fake_output,device=device))#計(jì)算判別器dis_A對(duì)于生成器gen_BA所生成圖像的總體判別損失dis_A_loss=(dis_A_real_loss+dis_A_fake_loss)*0.5”””后向傳播:判別器dis_A的梯度計(jì)算”””#計(jì)算判別器dis_A優(yōu)化器的梯度dis_A_loss.backward()#更新判別器dis_A的參數(shù)dis_A_optimizer.step()#將判別器dis_B網(wǎng)絡(luò)參數(shù)的梯度清零dis_B_optimizer.zero_grad()”””前向傳播:判別器dis_B的判別損失”””#通過(guò)判別器dis_B對(duì)真實(shí)橙子圖像進(jìn)行預(yù)測(cè)dis_B_real_output=dis_B(real_B)#計(jì)算dis_B鑒別真

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論