2016-05-10 2 views
1

Я тестирую среду Tensorflow с проблемой регрессии. Мой вход имеет много функций, а мой вывод - только один. На данный момент это работает, но я думаю, что моя функция Cost не точная для того, что я хочу, поэтому у меня довольно низкая точность.Neural Networks: проектирование Функция стоимости «недифференцируемая»/Tensorflow

Моя цель состоит в том, чтобы предсказать результат в пределах 10% диапазона фактического выпуска продукции, то есть для каждого выхода:

if (y_actual - y_predicted) < 0.1 * y_actual : 
    cost = 0 
else : 
    cost = 1 

Так что для предсказанного выходного вектора: [130, 35, 65, 43] против фактического выхода вектор [125, 10, 75, 40], я должен получить стоимость 2. (130 и 40 находятся в 10%, 35 и 65 нет)

В настоящее время я использую квадрат разницы.

cost = tf.reduce_sum(tf.squared_difference(y_predicted,y_)/(2*nb_batches)) 

Так на самом деле, я получаю довольно хороший прогноз на сумму выходов, но у меня есть только точность на 60%, если я считаю предсказание, чтобы быть точным, если он находится в 10% от фактического выпуска продукции. Моя точность записывается так:

with tf.name_scope('accuracy'): 
    with tf.name_scope('correct_prediction'): 
     correct_prediction = tf.less_equal(tf.abs((y_predicted-y_)), 0.1*tf.abs((y_))) # True if y_diff <= 10% * y_actual 
    with tf.name_scope('accuracy'): 
     accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) # count 1 if correct prediction is True ; else False ; Do the sum on all the data tested 
    tf.scalar_summary('accuracy', accuracy) 

Я пытался писать другие функции затрат, таких как:

cost = tf.reduce_sum(tf.cast((tf.greater_equal(tf.abs((y_predicted-y_)), 0.1*tf.abs(y_))),tf.float32) 

Но я получаю ошибку: No gradients provided for any variable. Я думаю, что это потому, что мы не можем получить производную от tf.cast.

Есть ли способ написать функцию потерь, которая бы соответствовала моим потребностям? Я знаю, что функция потерь, которую я хочу, не «выводима». Считаете ли вы, что преобразование его в выводимую функцию будет решением?

Я не уверен, что я был очень понятно ...

Спасибо за вашу помощь!

Пол

+0

Я думаю, что ошибка возникает, когда нет пути от ваших переменных к функции потерь. Может быть возможной ошибкой в ​​определении графика. – shekkizh

+0

Да, я думаю, что с tf.cast Tensorflow не сможет вернуться к переменным ... Но поскольку стоимость должна быть плавающей ... –

+0

Вы случайно не нашли работу для 'tf.cast '? –

ответ

1

Вместо того, чтобы использовать оператор сравнения, можно использовать
tf.nn.relu(tf.abs(y_predicted-y_)-tf.abs(y_))
получить дифференцируемые функции затрат.

Операция relu вычисляет max (0, x) и, таким образом, даст непрерывную версию того, что вы делали. Основное различие будет заключаться в том, что вы будете больше наказаны за то, что находитесь дальше, и, следовательно, у вас нет бинарного имущества (но обычно это то, к чему вы стремитесь в регрессии).
Это должно дать лучший результат, чем потери в квадрате.

+0

Спасибо за ваш ответ. Я думаю, что есть только опечатка: я думаю, что это должно быть tf.nn.relu (tf.abs (y_predicted-y_)) - 0.1 * tf.abs (y_)) Как вы уже сказали, одна ошибка " 27 "будет считаться 27 ошибками" 1 ", а для точности это не так. –

+0

На самом деле, я получил точность, которая была меньше, чем когда я использовал квадрат потерь ... Возможно, было бы «подсчитать» количество ненулевых значений, но я не знаю никакой функции TF, которая это делает, и тестирования np .count_nonzero, он не работает. Кроме того, мне было интересно, будет ли использование функции ошибки, то есть Erf (alpha * x), подходящей ... –

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