代码之家  ›  专栏  ›  技术社区  ›  Charles

基于keras的快速梯度符号法

  •  3
  • Charles  · 技术社区  · 6 年前

    我现在正在研究 this paper . 实施 快速梯度符号法

    如果我们把损失函数定义为 l(\theta,x,y) 哪里 x y \theta 参数。 而不是最小化 ,目标是最小化 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
    

    model.compile(loss=customLoss(model.inputs),...)
    

    你有什么办法让我实现这个目标吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   SiHa    6 年前

    正确的损失函数是:

    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)