0

我想让 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 中遇到了一些错误。我试过没有连接但没有成功。

我想实现与文章类似的东西: 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

4

1 回答 1

2

我想我在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'])

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

于 2020-07-08T04:17:02.210 回答