我正在尝试实现: 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定义中)。
有什么建议吗?
最好