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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pytorch制作CNN的类印象图 class impression(类别生成图)及生成对抗攻击样本

發布時間:2025/3/8 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pytorch制作CNN的类印象图 class impression(类别生成图)及生成对抗攻击样本 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??本文給出完整代碼實現CNN模型的類別可視化輸入圖像——類印象圖,并基于此生成對抗樣本圖像。

1,完整代碼

??在上一篇文章中,我給出了CNN特征可視化的代碼,在此基礎上稍加修改就可以得到根據各類別反饋生成的輸入圖像。還是先給出完整代碼:

import torch import torchvision.models as models import cv2 import time t0 = time.time()mu = 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)/stdbatch_size = 1 num_classes = 1000model = models.resnet18(pretrained=True).cuda() for params in model.parameters():params.requires_grad = False model.eval() ''' mask = torch.zeros((batch_size,3,224,224), dtype=torch.bool).cuda() mask[:,:,100:-100,100:-100] = True ''' for clas in range(num_classes):data = torch.rand(batch_size,3,224,224).cuda()data.requires_grad = True#optimizer = torch.optim.SGD([data], lr=6)#, momentum=0.99)optimizer = torch.optim.Adam([data], lr=0.1, weight_decay=1e-6)label = torch.tensor([clas]).cuda()one_hot= torch.zeros((batch_size,num_classes), dtype=torch.bool).cuda()label = label.reshape(-1,1)one_hot.scatter_(1, label, 1)for i in range(4001):data1 = (data - data.min()) / (data.max() - data.min())#data1 = data1 * maskdata1 = normalize(data1)optimizer.zero_grad()outputs = model(data1)loss = - outputs[one_hot].sum()loss.backward()optimizer.step()print('class:',outputs.max(1)[1].item())print('time: %.2f'%(time.time()-t0))data_i = data.clone()data_i = (data_i - data_i.min()) / (data_i.max() - data_i.min())#data_i = (data_i*mask)data_i = data_i[0].permute(1,2,0).data.cpu().numpy()*255data_i = data_i[...,::-1].astype('uint8') #注意cv2使用BGR順序cv2.imwrite('./class_impress/class_%d.png'%clas,data_i)

注意:這里損失函數使用的目標類別的輸出值最大,按說像常規分類網絡那樣使用交叉熵CE也是可以的,但是畫出來的可視化效果不好,沒有使用這個損失的效果好。

2,效果圖

圖1.幾種ImageNet預訓練網絡的類印象圖

??這些生成的圖片看起來僅僅似乎有一些該類別對應圖像的影子,AlexNet的生成圖還能看出點東西,其他幾個網絡的生成圖人眼很難辨認。但使用原模型進行驗證,可以發現這種生成圖目標類別的識別概率都接近100%。
??也有一些技術能夠使生成的圖片效果更好,甚至達到非常清晰悅目的程度,但這不是本文的目的,感興趣的可以看我另一篇文章,生成的圖片效果更好。

3,小區域生成圖

??我們還可以對輸入施加約束,比如只在圖像的某個小區域內產生圖像,見代碼中的mask部分。這樣生成的圖片雖然只有極小的部分,但仍然可以使識別網絡產生接近100%的目標類別識別概率。下圖給出用預訓練ResNet18產生的100x100和24x24兩種尺寸的類別生成圖例子。

圖2.僅在小范圍內生成的類印象圖

4,生成攻擊性對抗樣本

??為什么要在小區域內生成類印象圖呢,想必大家已經猜到了,這會是一種對抗攻擊方案。既然這樣的小圖片可以產生很強的網絡識別概率,那么我們把這個小圖片加入到其他自然圖片中,我們不就得到了一種對抗樣本攻擊方法嗎?我們把class0對應的100x100生成圖和class8對應的24x24生成圖添加到原始圖片中,得到的部分對抗樣本示例如下圖。

圖3.添加小區域類印象圖構成的對抗樣本

??使用100x100補丁圖攻擊時,我在5000張ImageNet圖像像測試,達到了100%的攻擊率,使用24x24補丁圖攻擊時,也達到了30%的攻擊率。
??但需要指出的是,這只是一種白盒攻擊手段,我上述試驗中的小區域補丁圖是在ResNet18中生成的,它的攻擊圖片也只對ResNet18模型有效,如果換成其他模型攻擊失效。這也說明,我們用這種方法生成的類印象圖是一種非常過擬合的與模型強相關的結果,并不是一種普適的只與類別相關的類印象圖。所以,類印象圖這個詞很準確,它只是特定模型對某個類別的“印象”。找到一種廣大神經網絡共同的類印象,才能找到一種黑盒攻擊方法,這作為我以后思考的問題吧。

總結

以上是生活随笔為你收集整理的pytorch制作CNN的类印象图 class impression(类别生成图)及生成对抗攻击样本的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。