我在使用 Siamese Network 执行两项任务时遇到一些问题:
任务是:
numberNode = [512,400,200,256]
def build_network(input_shape):
model = Sequential()
model.add(Dense(numberNode[0],
input_shape=input_shape,
activation='linear'
))
model.add(Dense(numberNode[1],
activation='linear'
))
model.add(Dense(numberNode[2]
,activation='relu'
))
model.add(Dense(numberNode[3]
,activation='relu'
))
return model;
dimInput = (512,)
imgA = Input(shape=dimInput)
imgB = Input(shape=dimInput)
net = build_network(dimInput)
net.summary()
featVecsA = net(imgA)
featVecsB = net(imgB)
distance = Lambda(chebyshevDistance, output_shape=outputShapeFunction)([featVecsA, featVecsB])
model = Model(inputs=[imgA, imgB], outputs=distance)
为了训练网络,我使用 AT&T 数据集和 Contrastive Loss 函数来减少相似受试者之间的切比雪夫距离并增加不同受试者之间的切比雪夫距离
earlyStopper = EarlyStopping(patience=5, verbose=1)
sgd = Adam(learning_rate=0.00005)
model.compile(loss=contrastive_loss, optimizer=sgd)
def contrastive_loss(y_true, y_pred):
margin = 1.5
return K.mean(y_true * 0.5 * K.square(y_pred) + (1-y_true) * 0.5 * K.square(K.maximum(margin - y_pred, 0)))
我的解决方案是根据 0.5 的阈值进行二值化,但实际上在我获得的 4000 对的测试集上结果并不出色:
True Acceptance: 600
False Acceptance: 89
False Rejection: 1376
True Rejection: 1887
我不明白我的方法是否正确,因为即使在第一个任务中,网络也会立即过度拟合。我尝试改变网络结构、激活函数和学习率,但没有任何改进。
我解决问题的方法正确吗?