通过它们的渐变连接两个Keras层

时间:2018-08-22 18:10:11

标签: neural-network keras loss-function

我正在尝试实现: https://github.com/aditya1503/Siamese-LSTM/

在Keras中。在此代码中,有一个网络初始化阶段,其中发生以下情况(在Theano代码中):

    if training==True:        
        gradi = tensor.grad(cost, wrt=tnewp.values())#/bts
        grads=[]
        l=len(gradi)
        for i in range(0,l/2):
            gravg=(gradi[i]+gradi[i+l/2])/(4.0)
        #print i,i+9
            grads.append(gravg)
        for i in range(0,len(tnewp.keys())/2):
                grads.append(grads[i])

        self.f_grad_shared, self.f_update = adadelta(lr, tnewp, grads,emb11,mask11,emb21,mask21,y, cost)

在Keras中,我尝试实现自己的优化器(捆绑的Adadelta的副本),其中在get_updates()中应用上述代码,例如:

def get_updates(self, loss, params):        
    gradi = self.get_gradients(loss, params)

    grads = []      
    l = len(gradi)   # for 2 LSTMs, l = 6, 3 'weights' per each
    half_l = int(l / 2)
    print(half_l)
    for i in range(0, half_l):
        gravg = (gradi[i] + gradi[i + half_l]) / (4.0)
        grads.append(gravg)

    alt_half_l = int(len(params) / 2)
    print(alt_half_l)
    for i in range(0, alt_half_l):
        grads.append(grads[i])

    shapes = [K.int_shape(p) for p in params]

这可以编译,没有错误,但是我每批的损失从0.08变为0.4(因此,它不起作用)。

我的猜测是,我应该只操作一次这些渐变,并且在训练期间多次调用get_updates。但是,我不知道如何将上面的代码放在优化器之外(例如,在Model定义中)。

有什么建议吗?

最好

0 个答案:

没有答案