试图写一个暹罗网络

时间:2020-07-08 00:55:15

标签: machine-learning deep-learning tf.keras siamese-network

我希望将2个或多个相同的网络输出到另一个网络中

def getSimpleAdditionModel():
    seq_conv_model = [
        layers.Dense(32, activation='relu', input_shape=[2]),
        layers.Dense(32, activation='relu'),
        layers.Dense(1)
    ]
    seq_model = tf.keras.Sequential(seq_conv_model)
    return seq_model


def outputModel(output1, output2):
    deq = [
        layers.Dense(32,activation='relu')(Concatenate([output1, output2])),
        layers.Dense(32, activation='relu'),
        layers.Dense(1)
    ]
    seq_model = tf.keras.Sequential(deq)
    return seq_model


input1 = layers.Input(shape=(2,))
input2 = layers.Input(shape=(2,))

seqmodel = getSimpleAdditionModel()
output_x1 = seqmodel(input1)
output_x2 = seqmodel(input2)


model = models.Model([input1, input2], outputModel(output_x1, output_x2))

optimizer = tf.keras.optimizers.RMSprop(0.001)
model.compile(loss='mse',
              optimizer=optimizer,
              metrics=['mae', 'mse'])

但是当我尝试将output_x1和output_x2用作另一个网络的输入时,在outputModel内出现了一些错误。我尝试没有Concatenate,但没有成功。

我想实现与本文相似的东西: https://medium.com/predict/face-recognition-from-scratch-using-siamese-networks-and-tensorflow-df03e32f8cd0 无需使用转换神经网络

对于上面代码的一些错误,我得到了:

TypeError: The added layer must be an instance of class Layer. Found: Tensor("dense_6/Identity:0", shape=(None, 32), dtype=float32)
Stack is :
  File "SiameseAddition.py", line 53, in <module>
    model = models.Model([input1, input2], outputModel(output_x1, output_x2))
  File "SiameseAddition.py", line 40, in outputModel
    seq_model = tf.keras.Sequential(deq)

如果在outputModel方法中,我改为执行以下操作:

def outputModel(output1, output2):
    deq = [
        layers.Dense(32,activation='relu')(output1, output2),
TypeError: call() takes 2 positional arguments but 3 were given
File "SiameseAddition.py", line 40, in <module>
    model = models.Model([input1, input2], outputModel(output_x1, output_x2))

完整的代码可以在以下位置找到: https://trinket.io/python/ceafe7a256

1 个答案:

答案 0 :(得分:1)

我想我在https://github.com/aspamers/siamese/blob/master/siamese.py上找到了有关如何建立暹罗网络的确切信息。 我创建模型的方式看起来是完全错误的。像上面一样,我正在使用功能性API,并且运行起来更加流畅。 方法变为:

def getSimpleAdditionModel(input_shape):
    model_input = Input(shape=input_shape)
    layer = layers.Dense(32, activation='relu')(model_input)
    layer = layers.Dense(32, activation='relu')(layer)
    layer = layers.Dense(1)(layer)
    return tf.keras.Model(model_input, layer)



def outputModel(embedding_shape):
    embedding_a = Input(shape=embedding_shape)
    embedding_b = Input(shape=embedding_shape)

    layer = layers.Concatenate()([embedding_a, embedding_b])
    layer = layers.Dense(32,activation='relu')(layer)
    layer = layers.Dense(32, activation='relu')(layer)
    layer = layers.Dense(1)(layer)

    return tf.keras.Model([embedding_a, embedding_b], layer)

input1 = [2]
input2 = [2]
input_a = Input(shape=input1)
input_b = Input(shape=input2)


base_model = getSimpleAdditionModel(input1)
processed_a = base_model(input_a)
processed_b = base_model(input_b)

optimizer = tf.keras.optimizers.RMSprop(0.001)

oModel = outputModel(base_model.output_shape)
head = oModel([processed_a, processed_b])

model = tf.keras.Model([input_a, input_b], head)
model.compile(loss='mse',
              optimizer=optimizer,
              metrics=['mae', 'mse'])

我认为重用上面的链接看起来比自己编写网络要好得多