CausalStyleAdv / methods /tool_func.py
YuqianFu's picture
Upload folder using huggingface_hub
197d4ca verified
import torch
import torch.nn as nn
import random
import numpy as np
import torch.nn.functional as F
EPS=0.00001
#P_THRED = 0.2
P_THRED = 0.4
START_EPS = 16/255
def calc_mean_std(feat, eps=1e-5):
# eps is a small value added to the variance to avoid divide-by-zero.
size = feat.size()
assert (len(size) == 4)
N, C = size[:2]
feat_var = feat.view(N, C, -1).var(dim=2) + eps
feat_std = feat_var.sqrt().view(N, C, 1, 1)
feat_mean = feat.view(N, C, -1).mean(dim=2).view(N, C, 1, 1)
return feat_mean, feat_std
def fgsm_attack(init_input, epsilon, data_grad):
# random start init_input
init_input = init_input + torch.empty_like(init_input).uniform_(START_EPS, START_EPS)
sign_data_grad = data_grad.sign()
adv_input = init_input + epsilon*sign_data_grad
return adv_input
def changeNewAdvStyle(input_fea, new_styleAug_mean, new_styleAug_std, p_thred):
if(new_styleAug_mean=='None'):
return input_fea
p = np.random.uniform()
if( p < p_thred):
return input_fea
feat_size = input_fea.size()
ori_style_mean, ori_style_std = calc_mean_std(input_fea)
normalized_fea = (input_fea - ori_style_mean.expand(feat_size)) / ori_style_std.expand(feat_size)
styleAug_fea = normalized_fea * new_styleAug_std.expand(feat_size) + new_styleAug_mean.expand(feat_size)
return styleAug_fea
def consistency_loss(scoresM1, scoresM2, type='euclidean'):
if(type=='euclidean'):
avg_pro = (scoresM1 + scoresM2)/2.0
matrix1 = torch.sqrt(torch.sum((scoresM1 - avg_pro)**2,dim=1))
matrix2 = torch.sqrt(torch.sum((scoresM2 - avg_pro)**2,dim=1))
dis1 = torch.mean(matrix1)
dis2 = torch.mean(matrix2)
dis = (dis1+dis2)/2.0
elif(type=='KL1'):
avg_pro = (scoresM1 + scoresM2)/2.0
matrix1 = torch.sum( F.softmax(scoresM1,dim=-1) * (F.log_softmax(scoresM1, dim=-1) - F.log_softmax(avg_pro,dim=-1)), 1)
matrix2 = torch.sum( F.softmax(scoresM2,dim=-1) * (F.log_softmax(scoresM2, dim=-1) - F.log_softmax(avg_pro,dim=-1)), 1)
dis1 = torch.mean(matrix1)
dis2 = torch.mean(matrix2)
dis = (dis1+dis2)/2.0
elif(type=='KL2'):
matrix = torch.sum( F.softmax(scoresM2,dim=-1) * (F.log_softmax(scoresM2, dim=-1) - F.log_softmax(scoresM1,dim=-1)), 1)
dis = torch.mean(matrix)
elif(type=='KL3'):
matrix = torch.sum( F.softmax(scoresM1,dim=-1) * (F.log_softmax(scoresM1, dim=-1) - F.log_softmax(scoresM2,dim=-1)), 1)
dis = torch.mean(matrix)
else:
return
return dis