如何使用两个孩子功能训练模型以进行对象检测?

时间:2018-06-29 03:04:25

标签: tensorflow machine-learning conv-neural-network object-detection

我正在尝试实施吴安德教授为object detection描述的模型(解释从10:00开始)。

他将输出向量的第一个元素描述为检测到对象的概率,然后是匹配对象的边界框的坐标(匹配对象时)。输出向量的最后一部分是模型知道的所有类的softmax。

正如他解释的那样,对于存在检测的情况,使用简单的平方误差就可以了,并且只需 var x = +prompt("iteration count") for(var i = 0; i < x;i++){ document.write(i) } 的平方差即可。我知道这是一种幼稚的方法。我只是想将其实现用于学习体验。

我的问题

  1. 如何在张量流中实现这种有条件的损失?
  2. 在处理批处理时,如何处理y^[0] - y[0]的这种条件。

1 个答案:

答案 0 :(得分:1)

  

如何在张量流中实现这种条件损失?

您可以将损失函数转换为:

Error = mask[0]*(y^[0]-y[0])**2 + mask[1]*(y^[1]-y[1])**2 ... mask[n]*(y^[n]-y[n])**2),
where mask = [1, 1,...1] for y[0] = 1 and [1, 0, ...0] for y[0] = 0
  

在处理a时,如何处理有关y ^ [0]的条件   批处理。

对于批处理,您可以像下面这样即时构建蒙版:

mask = tf.concat([tf.ones((tf.shape(y)[0],1)),y[:,0][...,None]*y[:,1:]], axis=1)

代码:

y_hat_n = np.array([[3, 3, 3, 3], [3,3,3,3]])
y_1 = np.array([[1, 1, 1, 1], [1,1,1,1]])
y_0 = np.array([[0, 1, 1, 1], [0,1,1,1]])


y = tf.placeholder(tf.float32,[None, 4])
y_hat = tf.placeholder(tf.float32,[None, 4])
mask = tf.concat([tf.ones((tf.shape(y)[0],1)),y[:,0][...,None]*y[:,1:]], axis=1)

error = tf.losses.mean_squared_error(mask*y, mask*y_hat)

with tf.Session() as sess:

   print(sess.run([mask,error], {y:y_0, y_hat:y_hat_n}))
   print(sess.run([mask,error], {y:y_1, y_hat:y_hat_n}))

# Mask and error
#[array([[1., 0., 0., 0.],
#   [1., 0., 0., 0.]], dtype=float32), 2.25]

#[array([[1., 1., 1., 1.],
#   [1., 1., 1., 1.]], dtype=float32), 4.0]