2

Я пытаюсь создать очень простой двоичный классификатор в Tensorflow для сгенерированных данных.Градиенты логических операторов в тензорном потоке

Я генерирую случайные данные из двух отдельных нормальных распределений. Затем я буду классифицировать полученные данные двоичному классу, если он меньше или больше числа, A.

В идеале A будет срезом в середине обоих нормалей. Например. если мои данные сгенерированы N (1,1) + N (-1,1), то A должно быть приблизительно 0.

Я запускаю ошибку «Без градиентов, предусмотренных для любой переменной ...» , В частности:

No gradients provided for any variable: ((None, <tensorflow.python.ops.variables.Variable object at 0x7fd9e3fae710>),) 

Я думаю, что это, возможно, придется делать с тем, что Tensorflow не может рассчитать градиенты для логических операторов. Моя классификация для любого заданного значения должна быть что-то вроде:

Учитывая точку данных х и значение:

[1,0]: если х <

[0,1 ]: если х> = A

Учитывая эту идею, вот мой расчет в Tensorflow для вывода:

my_output = tf.concat(0,[tf.to_float(tf.less(x_data, A)), tf.to_float(tf.greater_equal(x_data, A))]) 

ли это неправильный способ реализовать этот вывод? Существует ли нелогический функциональный эквивалент?

Спасибо. Если вы хотите, чтобы увидеть весь свой код, вот суть: https://gist.github.com/nfmcclure/46c323f0a55ae1628808f7a58b5d437f


Edit: Полный Трассировка стека:

Traceback (most recent call last): 

    File "<ipython-input-182-f8837927493d>", line 1, in <module> 
    runfile('/.../back_propagation.py', wdir='/') 

    File "/usr/local/lib/python3.4/dist-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 699, in runfile 
execfile(filename, namespace) 

    File "/usr/local/lib/python3.4/dist-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 88, in execfile 
exec(compile(open(filename, 'rb').read(), filename, 'exec'), namespace) 

    File "/.../back_propagation.py", line 94, in <module> 
train_step = my_opt.minimize(xentropy) 

    File "/usr/local/lib/python3.4/dist-packages/tensorflow/python/training/optimizer.py", line 192, in minimize 
name=name) 

    File "/usr/local/lib/python3.4/dist-packages/tensorflow/python/training/optimizer.py", line 286, in apply_gradients 
(grads_and_vars,)) 

ValueError: No gradients provided for any variable: ((None, <tensorflow.python.ops.variables.Variable object at 0x7fd9e3fae710>),) 
+0

Полная трассировка стека может помочь – KevinOrr

ответ

1

Обычно вы будете использовать функцию сигмовидной приколоть выход вашей функции в диапазоне от 0 до 1. Вы хотите обучить следующую функцию:

y = a * x_input + b, где a и b - обучаемые переменные.

Функция потерь вы бы использовали бы тогда tf.sigmoid_cross_entropy_with_logits

И оценить класс вы бы оценить сигмовидной (у)> 0,5. Более логичный оператор не имеет градиента для создания функции оптимизации.

+0

Спасибо, я, вероятно, перейду к сигмовидному или непрерывному приближению к функции шага. – nfmcclure

1

Функция порогового значения, которую вы пытаетесь использовать, не дифференцируема на пороге, а производная равна нулю везде. Как упоминалось в szabadaba, вы обычно используете сигмоидальную функцию как выход бинарного классификатора. Для классификации многоклассов используйте функцию softmax. Эти функции можно интерпретировать как дающие вам вероятность или уверенность в значении класса (что лучше, чем просто получение жесткого значения). Важно отметить, что градиенты хорошо себя ведут. Но вы должны заботиться о том, чтобы не насыщать единицы.

Например, см:

LeCun (1998). Эффективная обратная обработка.

В случае бинарной классификации ж/сигмоидальных выходов, он делает некоторые интересные моменты о пребывании в ненасыщенной режиме путем выбора конкретной функции сигмовидной, правильное отображение на класс метки для этого сигмовидного и т.д.

Возможно, было бы полезно прочитать учебник по логистической регрессии. Вот один для TensorFlow и один для Theano.

1

Я thnink может быть, вы не должны использовать my_output расчета потерь, becasuse может быть, ТФ не может Suppot вычислить обратный градиент в tf.less и tf.greater операция вы можете попробовать рассчитать потери функция в x_data