我希望将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
答案 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'])
我认为重用上面的链接看起来比自己编写网络要好得多