使用Keras的快速渐变符号方法

时间:2018-09-12 10:20:22

标签: python keras

我目前正在研究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

您有任何想法该如何实施吗?

1 个答案:

答案 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)不返回张量。