pytorch faz impressão de classe de mapa de impressão de classe CNN (mapa de geração de categoria) e gera amostras de ataque adversário

  Este artigo fornece um código completo para implementar a imagem de entrada de visualização de categoria do modelo CNN - o mapa de impressão de classe, e gera uma imagem de amostra adversária com base nisso.

1. Código completo

  No artigo anterior , forneci o código para visualização dos recursos da CNN, com base nisso, com uma pequena modificação, pode-se obter a imagem de entrada gerada de acordo com o feedback de cada categoria. Ou forneça o código completo primeiro:

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)/std

batch_size = 1
num_classes = 1000

model = 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 * mask
        data1 = 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()*255
    data_i = data_i[...,::-1].astype('uint8')  #注意cv2使用BGR顺序
    cv2.imwrite('./class_impress/class_%d.png'%clas,data_i)

Nota: O valor de saída da categoria alvo usada pela função de perda é o maior. Diz-se que é possível usar CE de entropia cruzada como uma rede de classificação convencional, mas o efeito de visualização desenhado não é bom, e o efeito de usar essa perda não é tão bom.

2. Renderização

insira a descrição da imagem aqui

Figura 1. Diagramas de impressão de classe de várias redes pré-treinadas ImageNet

  Essas imagens geradas parecem ter apenas algumas sombras das imagens correspondentes desta categoria. As imagens geradas pela AlexNet ainda podem ver algo, e as imagens geradas de várias outras redes são difíceis de reconhecer pelos olhos humanos. Porém, utilizando o modelo original para verificação, verifica-se que a probabilidade de reconhecimento da categoria alvo deste gráfico gerado é próxima de 100%.
  Existem também algumas tecnologias que podem melhorar as imagens geradas, até mesmo em um nível muito claro e agradável, mas esse não é o objetivo deste artigo. Se você estiver interessado, pode ler meu outro artigo, e as imagens geradas são melhores .

3. Mapa de geração de pequenas áreas

  Também podemos impor restrições na entrada, como gerar imagens apenas em uma pequena área da imagem, veja a seção de máscara no código. Embora as imagens geradas desta forma tenham apenas uma parte muito pequena, ainda pode fazer com que a rede de reconhecimento gere uma probabilidade de reconhecimento da categoria alvo próxima de 100%. A figura abaixo mostra exemplos de gráficos de geração de categorias de tamanhos 100x100 e 24x24 gerados por ResNet18 pré-treinado.
insira a descrição da imagem aqui

Figura 2. Mapa de impressão de classe gerado apenas em um pequeno intervalo

4. Gere amostras adversárias ofensivas

  Por que gerar um mapa de impressão de classe em uma área pequena? Presumivelmente, todos já adivinharam que este será um esquema anti-ataque. Como uma imagem tão pequena pode gerar uma forte probabilidade de reconhecimento de rede, se adicionarmos essa imagem pequena a outras imagens naturais, não teremos um método contra ataques de amostra? Adicionamos à imagem original a imagem gerada 100x100 correspondente à classe0 e a imagem gerada 24x24 correspondente à classe8, e alguns exemplos de amostras adversárias obtidas são mostrados na figura abaixo.

insira a descrição da imagem aqui

Figura 3. Adicionando um exemplo adversário composto por um mapa de impressão de classe de área pequena

  Ao usar um mapa de patch 100x100 para atacar, testei 5.000 imagens ImageNet e alcancei uma taxa de ataque de 100%. Ao usar um mapa de patch 24x24 para atacar, também atingiu uma taxa de ataque de 30%.
  Mas deve-se ressaltar que este é apenas um método de ataque de caixa branca. A imagem de patch de pequena área no meu experimento acima foi gerada no ResNet18 e sua imagem de ataque só é válida para o modelo ResNet18. Se for substituída por outros modelos , o ataque falhará. Isso também mostra que o mapa de impressão de classe que geramos com este método é um resultado muito sobreajustado e fortemente correlacionado com o modelo, e não um mapa de impressão de classe universal relacionado apenas a categorias. Então, o termo mapa de impressão de classe é muito preciso, é apenas a “impressão” de uma determinada classe por um determinado modelo. Somente encontrando uma impressão de classe comum da vasta rede neural poderemos encontrar um método de ataque de caixa preta.Esta será uma questão para eu pensar no futuro.

Acho que você gosta

Origin blog.csdn.net/Brikie/article/details/115484702
Recomendado
Clasificación