在自定义层多输出时,需要在计算compute_output_shape 和 call 中
将返回结果用 [ ] 包装。
如:return output, indices 会封装成( output, indices)所以会有’tuple’ object has no attribute '_keras_shape’错误。
如:compute_output_shape中,return shape1, shape2结果会自动加(shape1, shape2)最后封装成[(shape1, shape2)],这样维度就改变了,会有list 越界错误。
方法:
改成return [value1, value2] , return [shape1, shape2]
def call(self, inputs):
res_es1 = inputs
res_es1 = K.tanh(K.dot(res_es1, self.Ws1))
res_att = K.softmax(K.dot(res_es1, self.Ws2))
res_es2 = K.batch_dot(res_att,inputs, axes=(1,1)) #shape(batch, r, hidden)
#计算l2 loss,使得每个分量所表示的尽量不同
l2_loss = K.batch_dot(res_es2, res_es2, axes=(2,2))
one_diago = K.ones_like(l2_loss)
loss_value = K.sum(K.square(l2_loss - one_diago))
return [res_es2, loss_value] #(res_es2, loss_value)表示tuple
def compute_output_shape(self, input_shape):
return [(None,self.r, input_shape[2]) , (1,)]