我目前正在研究this paper 。用异方差神经网络实现快速梯度符号方法。
如果我们将损失函数定义为0
,其中l(\theta,x,y)
是特征,x
是标签,y
是参数。
我们的目标不是最小化\theta
,而是最小化l(\theta,x,y)
,其中
l(\theta,x,y)+l(\theta,x',y)
这是我的尝试(没有成功):
x'=x+\eps*\sign(\nabla_x l(\theta,x,y))
然后调用此损失函数
def customLoss(x):
def neg_log_likelihood(y_true, y_pred):
def neg_log(y_t,y_p):
inter=(y_p[...,0,None]-y_t)/K.clip(y_p[...,1,None],K.epsilon(),None)
val=K.log(K.clip(K.square(y_p[...,1,None]),K.epsilon(),None))+K.square(inter)
return val
val=neg_log(y_true,y_pred)
deriv=K.gradients(val,x)
xb=x+0.01*K.sign(deriv)
out=model.predict(xb)
valb=neg_log(y_true,out)
return K.mean(val+valb,axis=-1)
return neg_log_likelihood
您有任何想法该如何实施吗?
答案 0 :(得分:1)
正确的损失函数是:
def customLoss(x):
def neg_log_likelihood(y_true, y_pred):
def neg_log(y_t,y_p):
inter=(y_p[...,0,None]-y_t)/K.clip(y_p[...,1,None],K.epsilon(),None)
val=K.log(K.clip(K.square(y_p[...,1,None]),K.epsilon(),None))+K.square(inter)
return val
val=neg_log(y_true,y_pred)
deriv=K.gradients(val,x)
xb=x+0.01*K.sign(deriv)
out=model(xb)
valb=neg_log(y_true,out)
return K.mean(val+valb,axis=-1)
return neg_log_likelihood
区别在于model(xb)
返回张量而model.predict(xb)
不返回张量。