Как реализовать фильтр в тензорном потоке?

У меня есть сверточная нейронная сеть с тремя изображениями в качестве входных данных:

x_anchor = tf.placeholder('float', [None, 4900], name='x_anchor')
x_positive = tf.placeholder('float', [None, 4900], name='x_positive')
x_negative = tf.placeholder('float', [None, 4900], name='x_negative')

В пределах train функция, я кормить заполнителей с фактическими изображениями:

 input1, input2, input3 = training.next_batch(start,end)
    ....some other operations...
loss_value  = sess.run([cost], feed_dict={x_anchor:input1, x_positive:input2, x_negative:input3})

Я использую функцию триплетных потерь на этих трех входах (на самом деле это переменная стоимости выше):

def triplet_loss(d_pos, d_neg):

    margin = 0.2

    loss = tf.reduce_mean(tf.maximum(0., margin + d_pos - d_neg))

    return loss

Как я могу отфильтровать потери, так что только изображения с loss_value > 0 будут использоваться для обучения сети?

Как я могу реализовать что-то вроде:

if(loss_value for input1, input2, input3 > 0)
  use inputs to train network
else
 do nothing/try another input

Что я уже пробовал:

Я снимал изображения одно за другим (input1[0], input2[0], input3[0]), вычислял потери, и если потеря была положительной, я вычислял (и применял) градиенты. Но проблема в том, что я использую в своей модели выпадение, и мне приходится применять модель дважды на моих входах:

  1. Сначала рассчитать убыток и убедиться, что он больше 0

  2. Второй, чтобы запустить оптимизатор: это когда что-то идет не так. Как я упоминал ранее, я использую выпадение, поэтому результаты модели на моих входах отличаются, поэтому новые потери иногда будут равны 0, даже если потери, определенные на шаге 1, больше 0.

Я также пытался использовать tf.py_func но застрял.

1 ответ

Решение

Появилась новая функция TensorFlow, которая называется "AutoGraph". AutoGraph преобразует код Python, включая поток управления, print() и другие нативные функции Python, в чистый графовый код TensorFlow. Например:

@autograph.convert()
def huber_loss(a):
  if tf.abs(a) <= delta:
    loss = a * a / 2
  else:
    loss = delta * (tf.abs(a) - delta / 2)
  return loss

становится этим кодом во время выполнения из-за декоратора:

def tf__huber_loss(a):
  with tf.name_scope('huber_loss'):
    def if_true():
      with tf.name_scope('if_true'):
        loss = a * a / 2
        return loss,
    def if_false():
      with tf.name_scope('if_false'):
        loss = delta * (tf.abs(a) - delta / 2)
        return loss,
    loss = ag__.utils.run_cond(tf.less_equal(tf.abs(a), delta), if_true,
        if_false)
    return loss

То, что вы хотели сделать, можно было реализовать перед использованием tf.cond(),

Я узнал об этом через этот средний пост.

Другие вопросы по тегам