如何解决凯拉斯连体网络和三元组丢失
我想建立一个能够验证图像(例如人脸)的网络。据我了解,最好的解决方案是具有三重态损失的连体网络。我没有找到任何现成的实现,所以我决定创建自己的实现。
但是我对Keras有疑问。例如,这是网络的结构:
代码是这样的:
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.layers
且reuse
功能已被删除。
要实现权重共享,您可以编写一个自定义层,该层采用父层并重用其权重。
下面是执行相同操作的示例示例。
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()
请注意,我新重新定义的模型与以黄色突出显示的模型基本相同
我然后重新定义了我想用于提取嵌入内容的模型(应该与您定义的模型相同,只是现在它不再具有像暹罗这样的多个输入),如下所示:
siamese_embeddings_model = build_siamese_model(input_shape)
siamese_embeddings_model .summary()
然后,我刚刚从训练有素的暹罗模型中提取权重并将其设置为新模型
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 举报,一经查实,本站将立刻删除。