我是一名学习对象检测的学生。 我用FCN实现了一个简单的对象发现模型。精度为95%,但召回率为0。总之,该模型确定所有区域都没有对象。我使用softmax_cross_entropy作为误差函数。但是,如果模型判断对象所在的部分没有对象,那么我要犯一个大错误。我想我必须自己设计损失函数,该怎么办?
def model(X, P):
x = tf.cast(X, tf.float32)
x = x / 255.0
net = slim.conv2d(x, 32, kernel_size =(3, 3))
net = slim.max_pool2d(net, (2, 2)) # 128 160
net = slim.conv2d(net, 64, kernel_size =(3, 3))
net = slim.max_pool2d(net, (2, 2)) # 64 80
net = slim.conv2d(net, 128, kernel_size =(3, 3))
net = slim.max_pool2d(net, (2, 2)) # 32 40
net = slim.conv2d(net, 256, kernel_size =(3, 3))
net = slim.max_pool2d(net, (2, 2)) # 16 20
net = slim.conv2d(net, 512, kernel_size=(3, 3))
net = slim.max_pool2d(net, (2, 2)) # 8 10
net = tf.nn.dropout(net, keep_prob=P)
net = slim.conv2d(net, 2, kernel_size=(3, 3))
net = slim.max_pool2d(net, (2, 2)) # 4 5
X = tf.placeholder(tf.uint8 ,[None, 320, 256, 3])
Y = tf.placeholder(tf.int64, [None, 20])
P = tf.placeholder(tf.float32)
y = tf.reshape(Y, (-1, 5, 4))
logits = model(X,P)
arg = tf.argmax(logits, -1)
with tf.name_scope('Optimizer'):
cost = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=y))
optimizer = tf.train.AdadeltaOptimizer(0.001).minimize(cost)
答案 0 :(得分:2)
您正在使用sparse_softmax_cross_entropy
,这已经可以使您增加损失的权重:
tf.losses.sparse_softmax_cross_entropy(
labels,
logits,
weights=1.0,
...
权重充当损失的系数。如果提供标量, 那么损失就简单地按给定值缩放。如果权重是 形状为[batch_size]的张量,则损失权重应用于每个 相应的样本。
如果y为二进制(对象为1,空为0),则可以简单地将其乘以所需的因子,然后将其作为权重传递:
penalty_empty = 0.5
penalty_object = 1
weights = penalty_empty + y * (penalty_object - penalty_empty)