我正在尝试实现一个暹罗网络,就像在这个纸中
在本文中,它们使用交叉熵作为损失函数。
我使用STL-10数据集进行训练,除了最后一个logit层之外,我用VGG-13 CNN网络代替了本文中使用的3层网络。
这是我的损失函数代码
def loss(pred,true_pred):
cross_entropy_loss = tf.multiply(-1.0,tf.reduce_mean(tf.add(tf.multiply(true_pred,tf.log(pred)),tf.multiply((1-true_pred),tf.log(tf.subtract(1.0,pred))))))
total_loss = tf.add(tf.reduce_sum(tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)),cross_entropy_loss,name='total_loss')
return cross_entropy_loss,total_loss
with tf.device('/gpu:0'):
h1 = siamese(feed_image1)
h2 = siamese(feed_image2)
l1_dist = tf.abs(tf.subtract(h1,h2))
with tf.variable_scope('pred') as scope:
predictions = tf.contrib.layers.fully_connected(l1_dist,1,activation_fn = tf.sigmoid,weights_initializer = tf.contrib.layers.xavier_initializer(uniform=False),weights_regularizer = tf.contrib.layers.l2_regularizer(tf.constant(0.001, dtype=tf.float32)))
celoss,cost = loss(predictions,feed_labels)
with tf.variable_scope('adam_optimizer') as scope:
optimizer = tf.train.AdamOptimizer(learning_rate=0.001)
opt = optimizer.minimize(cost)然而,当我进行培训时,费用几乎保持不变,为0.6932。
我在这里用过亚当优化器。
但以前我用过动量优化器。我试过改变学习率,但成本仍然一样。
所有的预测值经过几次迭代后收敛到0.5,。
在获取两批图像(input1和input2)的输出后,我取它们的L1距离,并将一个完全连接的层与单个输出和sigmoid激活函数连接起来。
h1和h2包含VGG-13网络的最后一个完全连接层(而不是logit层)的输出。
由于输出激活函数为sigmoid,且由于预测值在0.5左右,因此可以计算出两个网络输出的加权L1距离之和接近于零。
我不明白我哪里出了问题。如果能提供一点帮助,我们将不胜感激。
发布于 2018-12-02 05:46:02
我认为不收敛可能是由于梯度消失造成的。您可以使用损失和张力板跟踪渐变。有关更多细节,您可以参考此回答。
几个优化(可能):
1)不要自己写交叉熵。您可以使用logits使用sigmoid交叉熵,因为它确保了如文件所示的稳定性:
max(x, 0) - x * z + log(1 + exp(-abs(x)))( 2)做一些称重归一化可能会引起不良反应。
3)使正则化损失保持较小。您可以阅读这个答案获得更多信息。
4)我不认为tf.abs L1距离是必要的。
这是我修改的代码。希望能帮上忙。
mode = "training"
rl_rate = .1
with tf.device('/gpu:0'):
h1 = siamese(feed_image1)
h2 = siamese(feed_image2)
l1_dist = tf.subtract(h1, h2)
# is it necessary to use abs?
l1_dist_norm = tf.layers.batch_normalization(l1_dist, training=(mode=="training"))
with tf.variable_scope('logits') as scope:
w = tf.get_variable('fully_connected_weights', [tf.shape(l1_dist)[-1], 1],
weights_initializer = tf.contrib.layers.xavier_initializer(uniform=False), weights_regularizer = tf.contrib.layers.l2_regularizer(tf.constant(0.001, dtype=tf.float32))
)
logits = tf.tensordot(l1_dist_norm, w, axis=1)
xent_loss = tf.nn.sigmoid_cross_entropy_with_logits(logits=logits, labels=feed_labels)
total_loss = tf.add(tf.reduce_sum(rl_rate * tf.abs(tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES))), (1-rl_rate) * xent_loss, name='total_loss')
# or:
# weights = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
# l1_regularizer = tf.contrib.layers.l1_regularizer()
# regularization_loss = tf.contrib.layers.apply_regularization(l1_regularizer, weights)
# total_loss = xent_loss + regularization_loss
with tf.variable_scope('adam_optimizer') as scope:
optimizer = tf.train.AdamOptimizer(learning_rate=0.0005)
opt = tf.contrib.layers.optimize_loss(total_loss, global_step, learning_rate=learning_rate, optimizer="Adam", clip_gradients=max_grad_norm, summaries=["gradients"]) https://stackoverflow.com/questions/50724377
复制相似问题