2017-02-11 13 views
0

Я тренирую многоцелевую нейронную сеть в TensorFlow с моей собственной функцией потерь и не могу найти документацию о том, как пакетная обработка взаимодействует с этой функциональностью.Как пакетная обработка взаимодействует с функцией потерь в TensorFlow?

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

def fitness(predictions,actual): 

    absTensor = tf.abs(predictions) 
    sumTensor = tf.reduce_sum(absTensor) 
    oneTensor = tf.constant(1.0) 

    isGTOne = tf.greater(sumTensor,oneTensor) 

    def norm(): return predictions/sumTensor 
    def unchanged(): return predictions 

    predictions = tf.cond(isGTOne,norm,unchanged) 

    etc... 

Но когда я нахожусь проходя через партию оценок, я чувствую, что эта функция потерь нормализует весь набор входов для суммирования до 1 в этой точке, а не каждого индивидуального набора, суммирующего до 1. Т.е.
[[.8, .8], [.8, .8]] -> [[.25, .25], [. 25,25]]
, а не желаемый
[[.8, .8], [.8, .8]] -> [[.5, .5], [.5, .5]]

Может ли кто-нибудь разъяснить или успокоить мои подозрения? Если так работает моя функция, как мне это изменить?

ответ

2

Вы должны указать ось уменьшения для операций сокращения, в противном случае все оси будут уменьшены. Традиционно это первое измерение вашего тензора. Итак, строка 2 должна выглядеть так:

sumTensor = tf.reduce_sum(absTensor, 0) 

После того, как вы внесете это изменение, у вас возникнет другая проблема. sumTensor больше не будет скаляром и, следовательно, больше не будет иметь смысла в качестве условия для tf.cond (то есть, что означает ветвление на запись партии?). То, что вы действительно хотите, это tf.select, так как вы не хотите, чтобы логика ветвления принимала партию. Например:

isGTOne = tf.greater(sumTensor,oneTensor) 

norm = predictions/sumTensor 

predictions = tf.select(isGTOne,norm,predictions) 

Но, глядя на это сейчас, я даже не стал бы условно нормализовать записи. Так как теперь вы работаете с зернистостью пакета, я не думаю, что вы можете получить производительность от нормализации ввода партии по одному за раз. Тем более, что разделение на самом деле не является дорогостоящим побочным эффектом. Также возможно:

def fitness(predictions,actual): 

    absTensor = tf.abs(predictions) 
    sumTensor = tf.reduce_sum(absTensor, 0) 

    predictions = predictions/sumTensor 

    etc... 

Надеюсь, что это поможет!

+0

Это прекрасно. Спасибо. Есть ли где-то в документах, которые говорят об этом поведении? Я бы хотел прочитать, если не будет ничего неожиданного. – liqiudilk

+0

Какое поведение вы искали в документах? Использовать [tf.select docs] (https://www.tensorflow.org/api_docs/python/control_flow_ops/comparison_operators#select). – suharshs

 Смежные вопросы

  • Нет связанных вопросов^_^