TensorFlow2.4搭建Siamese网络如何创建embedding比较子模型
问题原因
你触发报错的核心原因是构造comparer模型时,inputs参数要求传入Keras输入张量对象(由tf.keras.Input构造),而你直接传入了维度数值EMBEDDING_SIZE,TensorFlow会把两个相同的整数识别为重复输入,因此抛出冗余错误。
修复方案
你只需要在原有代码的基础上,新增单独的embedding输入节点,复用已定义的距离计算层、sigmoid输出层即可,保证权重和训练用的完整模型完全对齐,输出结果一致。修改后的完整create_encoder_siamese函数关键部分如下:
def create_encoder_siamese(pairs, cfg): # 原来的euclidean_distance函数、encoder构造、完整训练模型构造部分全部保留不变 # --------------- 原有代码部分,无需修改 --------------- def euclidean_distance(vects): x, y = vects sum_square = tf.math.reduce_sum(tf.math.square(x - y), axis=1, keepdims=True) return tf.math.sqrt(tf.math.maximum(sum_square, tf.keras.backend.epsilon())) # 原有MobileNetV2定义、encoder构造、完整模型构造的代码全部保留 # 直到构造完output_layer之后,新增以下代码: # --------------------------------------------------- # --------------- 新增comparer模型构造代码 --------------- # 定义两个独立的embedding输入层 emb_input1 = tf.keras.Input(shape=(EMBEDDING_SIZE,), name='embedding_1') emb_input2 = tf.keras.Input(shape=(EMBEDDING_SIZE,), name='embedding_2') # 复用已定义的计算逻辑,保证和完整训练模型权重完全一致 comparer_distance = tf.keras.layers.Lambda(euclidean_distance)([emb_input1, emb_input2]) comparer_output = output_layer(comparer_distance) # 构造comparer模型 comparer = tf.keras.Model(inputs=[emb_input1, emb_input2], outputs=comparer_output, name='comparer') # --------------------------------------------------- # 原有模型编译部分保留 model.compile(optimizer='Adam', loss=tfa.losses.ContrastiveLoss(margin=cfg['train']['margin']), metrics='accuracy') print() print('Number of layers to train:', len(model.trainable_variables)) # 返回三个模型 return model, encoder, comparer
三个模型的作用
- 完整
model:用于训练,输入图像对即可输出0~1范围的相似度指标,训练完成后encoder和comparer的权重会自动同步,无需额外训练 encoder:输入单张图像,输出对应1D embedding,可提前离线批量计算所有图像的embedding存储,大幅减少部署时的重复计算comparer:输入两个提前计算好的embedding,直接输出和完整模型完全一致的0~1范围相似度指标,部署时不需要跑图像特征提取逻辑,推理效率提升数倍
内容的提问来源于stack exchange,提问作者fuyas
相关产品推荐
相关产品推荐

