我正在使用预先训练的VGG16网络训练暹罗CNN,并添加几层,然后计算相似度函数(两个图像特征之间的绝对距离)。 VGG16瓶颈后的模型如下:
left_input = Input(input_shape)
right_input = Input(input_shape)
model.add(Dense(1024, activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.30))
model.add(Dense(1024, activation='sigmoid'))
encoded_l = model(left_input)
encoded_r = model(right_input)
L1_layer = Lambda(lambda tensors:K.abs(tensors[0] - tensors[1]))
L1_distance = L1_layer([encoded_l, encoded_r])
L1_distance = K.pow(L1_distance, 3)
prediction = Dense(1,activation='sigmoid',bias_initializer=initialize_bias)(L1_distance)
siamese_net = Model(inputs=[left_input,right_input],outputs=prediction)
该模型在大量类中表现不佳。我想知道激活函数是否存在问题:对于两个相同的图像,L1_distance将为0,因此网络将必须训练一个无限的偏差以获得1的输出,这感觉不正确。
我已经搜索了TF激活函数,但找不到对称函数,该对称函数在0处本质上为1,在+/- Inf处本质上为0。我尝试了一个tf.math.reciprocal层的变通办法,但感觉不对(而且效果也不佳)。
我应该尝试编写自定义激活功能吗?有更好的方法吗?