Как реализовать фильтр в тензорном потоке?
У меня есть сверточная нейронная сеть с тремя изображениями в качестве входных данных:
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]), вычислял потери, и если потеря была положительной, я вычислял (и применял) градиенты. Но проблема в том, что я использую в своей модели выпадение, и мне приходится применять модель дважды на моих входах:
Сначала рассчитать убыток и убедиться, что он больше 0
Второй, чтобы запустить оптимизатор: это когда что-то идет не так. Как я упоминал ранее, я использую выпадение, поэтому результаты модели на моих входах отличаются, поэтому новые потери иногда будут равны 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()
,
Я узнал об этом через этот средний пост.