2

これは、実装したいカスタム正則化を説明するコードの小さなスニペットです。

# Code adapted from https://github.com/keras-team/keras/issues/5563

class CustomRegularization(Layer):
    def __init__(self, **kwargs):
        super(CustomRegularization, self).__init__(**kwargs)

    def call(self ,x ,mask=None):
        ld=x[0]
        rd=x[1]
        reg = K.dot(K.transpose(ld), rd)
        reg_norm = K.sqrt(K.sum(K.square(reg)))
        self.add_loss(reg_norm, x)
        return ld


    def compute_output_shape(self, input_shape):
        return (input_shape[0][0],input_shape[0][1])

def model():
    input1 = Input(shape=(224, 224, 3))
    input2 = Input(shape=(224, 224, 3))

    inp1 = Flatten()(input1)
    inp2 = Flatten()(input2)

    layer1 = Dense(1024, activation="sigmoid")
    x1_1 = layer1(inp1)
    x2_1 = layer1(inp2)

    layer2 = Dense(1024, activation="sigmoid")
    x1_2 = layer2(inp1)
    x2_2 = layer2(inp2)

    # get weights of layer1 and layer2

    layer1_wt = layer1.trainable_weights[0]
    layer2_wt = layer2.trainable_weights[0]

    # This is a regularization term on the weights of layer1 and layer2.
    regularization = CustomRegularization()([layer1_wt, layer2_wt])

    model = Model([input1, input2], [x1_2, x2_2, regularization])

if __name__ == "__main__":
    m = model()

これによりエラーが返さAttributeError: 'Variable' object has no attribute '_keras_history'れ、モデルを作成できません。このエラーは互換性のない出力が原因であることを知っています (入力は keras 入力レイヤーであるため)。[詳細については、issue #7362@fchollet'sのコメントを参照してください]。

ここでの主な問題は、layer1.trainable_weights[0] と layer2.trainable_weights[0] です。これらはtf.Variable(tensorflow 変数) であり、 ではありませんKeras Tensors。ケラステンソルに変換する必要があります。それ、どうやったら出来るの?

4

0 に答える 0