如何在 Keras 中使用预训练的 CNN 实现连体网络?

Posted

技术标签:

【中文标题】如何在 Keras 中使用预训练的 CNN 实现连体网络?【英文标题】:How to Implement Siamese Network using pretrained CNNs in Keras? 【发布时间】:2021-04-12 22:12:55 【问题描述】:

我正在使用 Keras 为 224x224x3 大小的图像开发一个用于人脸识别的连体网络。 Siamese Network 的架构是这样的:

对于 CNN 模型,我正在考虑使用已经在 Keras.applications 模块中预训练的 InceptionV3 模型。

#Assume all the other modules are imported correctly

from keras.applications.inception_v3 import InceptionV3

IMG_SHAPE=(224,224,3)

def return_siamese_net():

  left_input=Input(IMG_SHAPE)
  right_input=Input(IMG_SHAPE)

  model1=InceptionV3(include_top=False, weights="imagenet", input_tensor=left_input) #Left SubConvNet
  model2=InceptionV3(include_top=False, weights="imagenet", input_tensor=right_input) #Right SubConvNet

  #Do Something here

  distance_layer = #Do Something
  prediction = Dense(1,activation='sigmoid')(distance_layer) # Outputs 1 if the images match and 0 if it does not

  siamese_net = #Do Something  
  return siamese_net

model=return_siamese_net()
  

由于模型是预训练的,所以我遇到了错误,我现在一直在为双网络实现距离层。

我应该在两者之间添加什么才能使这个 Siamese Network 正常工作?

【问题讨论】:

I get error since the model is pretrained您遇到的错误是什么? @AkshaySehgal 属性错误:功能对象没有值: 【参考方案1】:

在使用距离层之前,一个非常重要的注意事项是考虑到您只有一个卷积神经网络。

共享权重实际上仅指一个卷积神经网络,并且权重是共享的,因为在传递一对图像时使用相同的权重(取决于使用的损失函数)以计算特征和随后的嵌入每个输入图像。

您将只有一个神经网络,并且块逻辑需要如下所示:

def euclidean_distance(vectors):
    (features_A, features_B) = vectors
    sum_squared = K.sum(K.square(features_A - features_B), axis=1, keepdims=True)
    return K.sqrt(K.maximum(sum_squared, K.epsilon()))


image_A = Input(shape=...)
image_B = Input(shape=...)
feature_extractor_model = get_feature_extractor_model(shape=...)
features_A = feature_extractor(image_A)
features_B = feature_extractor(image_B)
distance = Lambda(euclidean_distance)([features_A, features_B])
outputs = Dense(1, activation="sigmoid")(distance)
siamese_model = Model(inputs=[image_A, image_B], outputs=outputs)

当然,特征提取器模型可以是来自 Keras/TensorFlow 的预训练网络,并改进了输出分类层。

主要逻辑应该和上面一样,当然,如果你想使用三元组损失,那将需要三个输入(Anchor、Positive、Negative),但一开始我建议坚持基础。

此外,最好查阅此文档:

    https://www.pyimagesearch.com/2020/11/30/siamese-networks-with-keras-tensorflow-and-deep-learning/ https://towardsdatascience.com/one-shot-learning-with-siamese-networks-using-keras-17f34e75bb3d

【讨论】:

有什么方法可以让神经网络学习图像的相似性,而不是使用余弦相似度、欧几里得距离或 L1 距离等相似度函数? 由于这些是 One-Shot Learning 的一部分,因此距离函数不同于具有交叉熵等的典型函数。还有一个对比损失,但最近使用最多的是余弦相似度距离。 我在我的模型中使用了你的想法,它奏效了,但现在又出现了另一个问题。如果可以的话,你能看看这个问题吗?提前致谢***.com/questions/65644501/… 我在那里回答了你的问题

以上是关于如何在 Keras 中使用预训练的 CNN 实现连体网络?的主要内容,如果未能解决你的问题,请参考以下文章

使用预训练 vgg19 tensorflow,Keras 在 CNN 自动编码器中定义自定义损失(感知损失)

使用 keras 使用预训练的 VGG 实现感知损失

带有keras的CNN,准确性保持不变并且没有提高

在 keras 的输出阶段组合多个预训练模型

如何在 Keras 中使用 CNN 处理马萨诸塞州道路数据集?

使用Python,Keras和TensorFlow训练第一个CNN