日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pytorch简单代码实现deep dream图(即CNN特征可视化 features visualization)

發(fā)布時間:2025/3/8 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pytorch简单代码实现deep dream图(即CNN特征可视化 features visualization) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

??本文給出完整代碼實現(xiàn)CNN特征的可視化輸入圖像,也就是簡單的deep dream圖,有助于更好的理解CNN工作原理,并掌握用梯度上升法生成滿足要求輸入圖像的技術(shù)。更清晰美觀的deep dream圖需要加入一些其他技巧,可以參考我另一篇文章。

1,原理

??深度網(wǎng)絡(luò)的常規(guī)工作過程是,給定輸入樣本及標(biāo)簽,前向處理后的輸出結(jié)果和標(biāo)簽計算出某種損失函數(shù),再由損失函數(shù)反向傳播求網(wǎng)絡(luò)各參數(shù)的梯度,根據(jù)此梯度更新參數(shù),以使損失函數(shù)減小,逐漸訓(xùn)練得到一個逼近標(biāo)簽的網(wǎng)絡(luò)。
??有趣的是,我們也可以反向思維,固定網(wǎng)絡(luò)的參數(shù)不變,而是優(yōu)化輸入圖像。根據(jù)某項指標(biāo)求得輸入圖像的梯度,再根據(jù)此梯度優(yōu)化輸入,就可以得到滿足要求的輸入圖像。由于往往需要最大化某種指標(biāo),與通常最小化損失函數(shù)的梯度下降法不同,所以這種方法也被稱為梯度上升法。在程序?qū)崿F(xiàn)上,為了利用SGD,Adam等成熟的梯度下降優(yōu)化算法,我們只需要給指標(biāo)加個負(fù)號,也就變成和梯度下降一樣了。
??如果我們把特征圖的某個部分的均值作為最大化的指標(biāo),此時就可以得到使指定特征圖部分最大響應(yīng)的輸入圖,也就能夠直觀的看出指定部分的特征圖到底處理的是什么類型的特征。這個指定的特征圖部分可以是某個層,也可以是某個層的某個通道,甚至也可以是某個通道上某個元素。我們先來看單個元素的情況:

2,指定特征圖單個元素的最大響應(yīng)輸入圖像可視化

import torch import torchvision.models as models import cv2 import time t0 = time.time()model = models.resnet18(pretrained=True).cuda() batch_size = 1for params in model.parameters():params.requires_grad = False model.eval()def hook(module,inp,out):global featuresfeatures = outdata = torch.rand(batch_size,3,224,224).cuda() data.requires_grad=Truemu = torch.Tensor([0.485, 0.456, 0.406]).unsqueeze(-1).unsqueeze(-1).cuda() std = torch.Tensor([0.229, 0.224, 0.225]).unsqueeze(-1).unsqueeze(-1).cuda() unnormalize = lambda x: x*std + mu normalize = lambda x: (x-mu)/std#optimizer = torch.optim.SGD([data], lr=1, momentum=0.99) #參數(shù)需根據(jù)實際情況再調(diào) optimizer = torch.optim.Adam([data], lr=0.1, weight_decay=1e-6) myhook = model.layer2.register_forward_hook(hook) n,h,w = 0,3,8 for i in range(4001):x = (data - data.min()) / (data.max() - data.min())x = normalize(x)_ = model(x)loss = - features[:,n,h,w].mean() #指定元素#loss = - features[:,n,:,:].mean() #指定通道#loss = - features.mean() #指定層optimizer.zero_grad()loss.backward()optimizer.step()if i%100==0:print('data.abs().mean():',data.abs().mean().item())print('loss:',loss.item())print('time: %.2f'%(time.time()-t0)) myhook.remove() data_i = data[0] data_i = (data_i - data_i.min()) / (data_i.max() - data_i.min()) data_i = data_i.permute(1,2,0).data.cpu().numpy()*255 data_i = data_i[...,::-1].astype('uint8') #注意cv2使用BGR順序 cv2.imwrite('./feature_visual/layer2_filter%d.png'%n,data_i)

完整代碼如上,我們以torchvision中的預(yù)訓(xùn)練resnet18為例,按照大的模塊劃分,resnet18中有4個layer,畫出每個layer中某個元素對應(yīng)的輸入特征圖如下:

圖1.resnet18不同層指定元素的最大響應(yīng)輸入圖像

從圖中還可以看出,每個特征元素在輸入圖像上的感受野有多大,顯然越靠后層元素的感受野越大。

3,指定通道

圖2.resnet18不同層指定通道最大響應(yīng)輸入圖像

可以看出,前序?qū)拥妮斎腠憫?yīng)圖都是一些均勻的紋理圖,顯然是圖像的更基礎(chǔ)的組成要素;隨著網(wǎng)絡(luò)越深,輸入響應(yīng)圖則逐漸呈現(xiàn)出更加全局性的一些圖像概念,以及更加高級和接近實物的一些圖像概念,有些似乎是某種實物的形狀特征。
我們還可以看出,單個通道的響應(yīng)中可以看到多個類別的圖像的“影子”,所以通道并不是類別依賴的。

4,指定層

圖3.resnet18不同層最大響應(yīng)輸入圖像

5,其他一些網(wǎng)絡(luò)

圖4.其他網(wǎng)絡(luò)最末卷積層不同通道的最大響應(yīng)輸入圖像

可以看出,不同網(wǎng)絡(luò)的風(fēng)格還是很不相同的,其中densenet不像別的那么惡心,還挺好看。

總結(jié)

以上是生活随笔為你收集整理的pytorch简单代码实现deep dream图(即CNN特征可视化 features visualization)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。