カスタムレイヤーに複数の出力がある場合は、リストのパッケージ化が必要です

カスタムレイヤーに複数の出力がある場合、compute_output_shapeの計算で
返された結果を[]でラップしを呼び出す必要があります
例:出力を返すと、インデックスは(output、indexes)にカプセル化されるため、「tuple」オブジェクトには属性「_keras_shape」エラーがありません。
たとえば、compute_output_shapeでは、return shape1、shape2の結果が自動的に追加され(shape1、shape2)、最後に[(shape1、shape2)]にカプセル化されるため、寸法が変更され、リストが作成されます。 -境界エラー。

方法:

改成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,)]

おすすめ

転載: blog.csdn.net/cyinfi/article/details/88017080