微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

凯拉斯连体网络和三元组丢失

如何解决凯拉斯连体网络和三元组丢失

我想建立一个能够验证图像(例如人脸)的网络。据我了解,最好的解决方案是具有三重态损失的连体网络。我没有找到任何现成的实现,所以我决定创建自己的实现。

但是我对Keras有疑问。例如,这是网络的结构:

network structure

代码是这样的:

    function initOnReady() {
        var widget = window.tvWidget = new TradingView.widget({
            // debug: true,// uncomment this line to see Library errors and warnings in the 

            fullscreen: true,symbol: 'AAPL',interval: '1D',container_id: "tv_chart_container",//  BEWARE: no trailing slash is expected in Feed URL
            datafeed: new datafeeds.UDFCompatibledatafeed("<data Feed url>"),library_path: "charting_library/",locale: getParameterByName('lang') || "en",disabled_features: ["use_localstorage_for_settings"],enabled_features: ["study_templates"],charts_storage_url: 'https://saveload.Tradingview.com',charts_storage_url: 'http://{$smarty.server.HTTP_HOST}',charts_storage_api_version: "1.1",client_id: 'Tradingview.com',user_id: 'public_user_id',});

    };

我只定义了一个嵌入模型。这是否意味着一旦模型开始训练,每个输入的权重都将相同?

如果是,如何从embedding = Sequential([ Flatten(),Dense(1024,activation='relu'),Dense(64),Lambda(lambda x: K.l2_normalize(x,axis=-1)) ]) input_a = Input(shape=shape,name='anchor') input_p = Input(shape=shape,name='positive') input_n = Input(shape=shape,name='negative') emb_a = embedding(input_a) emb_p = embedding(input_p) emb_n = embedding(input_n) out = Concatenate()([emb_a,emb_p,emp_n]) model = Model([input_a,input_p,input_n],out) model.compile(optimizer='adam',loss=<triplet_loss>) 提取嵌入权重?

解决方法

是的,在三元组损失函数中,权重应该在所有三个网络中共享,即锚定,积极和消极。 在Tensorflow 1.x中,可以实现重量共享,您可以在reuse=True中使用tf.layers

但是在Tensorflow 2.x中,由于tf.layers已移至tf.keras.layersreuse功能已被删除。 要实现权重共享,您可以编写一个自定义层,该层采用父层并重用其权重。

下面是执行相同操作的示例示例。

class SharedConv(tf.keras.layers.Layer):
    def __init__(
        self,filters,kernel_size,strides=None,padding=None,dilation_rates=None,activation=None,use_bias=True,**kwargs
    ):
        self.filters = filters
        self.kernel_size = kernel_size
        self.strides = strides
        self.padding = padding
        self.dilation_rates = dilation_rates
        self.activation = activation
        self.use_bias = use_bias
        super().__init__(*args,**kwargs)

   def build(self,input_shape):
       self.conv = Conv2D(
           self.filters,self.kernel_size,padding=self.padding,dilation_rate=self.dilation_rates[0]
       )
       self.net1 = Activation(self.activation)
       self.net2 = Activation(self.activation)

   def call(self,inputs,**kwargs):
       x1 = self.conv(inputs)
       x1 = self.act1(x1)
       x2 = tf.nn.conv2d(
                inputs,self.conv.weights[0],strides=self.strides,dilations=self.dilation_rates[1]
              )
        if self.use_bias:
            x2 = x2 + self.conv.weights[1]
        x2 = self.act2(x2)
        return x1,x2
,

我将回答如何提取嵌入(reference from my Github post):

我训练有素的暹罗模型如下所示: siamese_model.summary()

image

请注意,我新重新定义的模型与以黄色突出显示的模型基本相同

然后重新定义了我想用于提取嵌入内容的模型(应该与您定义的模型相同,只是现在它不再具有像暹罗这样的多个输入),如下所示:

siamese_embeddings_model = build_siamese_model(input_shape)

siamese_embeddings_model .summary()

image

然后,我刚刚从训练有素的暹罗模型中提取权重并将其设置为新模型

embeddings_weights = siamese_model.layers[-3].get_weights()

siamese_embeddings_model.set_weights(embeddings_weights )

然后,您可以提供新图像以从新模型中提取嵌入内容

vector = siamese.predict(image)

len(vector[0])由于我的密集层(输出矢量)而将打印150张

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。