Линейная регрессия Tensorflow NaN выход - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь написать код для алгоритма машинного обучения, чтобы изучить как концепции машинного обучения, так и Tensorflow. Алгоритм, который я пытаюсь написать:

(недостаточно репутации для вставки изображения) https://i.imgur.com/lxgC7YV.png

«Что эквивалентно кусочно-линейной модели регрессии».

Из (Уравнение 7):

https://arxiv.org/pdf/1411.3315.pdf

Я загрузил векторы, на которых хочу это сделать. И инициализировал мои заполнители и переменные:

size = len(originalVecs)
_x1 = tf.placeholder(tf.float64, shape=[size, 300], name="x1-input")
_x2 = tf.placeholder(tf.float64, shape=[size, 300], name="x2-input")

_w = tf.Variable(tf.random_uniform([300,300], -1, 1, dtype = tf.float64), name="weight1")

Мой прогноз, стоимость и шаг обучения я установил так:

prediction = tf.matmul(_x1,_w)
cost = tf.reduce_sum(tf.square(tf.norm(prediction - _x2)))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cost)

После инициализации я тренируюсь со следующим:

for i in range(10000):
    sess.run(train_step, feed_dict={_x1: timedVecs, _x2 : originalVecs})
    if i % 1001 == 0:
        print('Epoch ', i)
        print('Prediction ', sess.run(prediction, feed_dict={_x1: timedVecs, _x2 : originalVecs}).shape)

Когда я запускаю свой код, он дико нестабилен и просто растет в течение примерно 20 итераций, чтобы просто напечатать NaN. Я думаю, что делаю пару вещей неправильно, но я не знаю, как исправить.

Форма прогноза - [20 300], когда я ожидаю, что он будет [1300]. Я хочу, чтобы он предсказывал, основываясь на единичных x1 и x2, а не на всех сразу, а затем попытался извлечь из суммы ошибок для всех точек данных (что я предполагаю кусочно). Однако я не знаю, как это сделать, так как думаю, что в настоящее время я минимизирую на основе матрицы 20 300, а не суммы 20 1300 матриц.

Я полагаю, что matmul верна, так как умножение является элементным?

Я ввожу свои входные данные в виде списка np-массивов. Каждый массив np является точкой данных с 300 измерениями.

Спасибо.

1 Ответ

0 голосов
/ 17 ноября 2018

Вообще я бы избегал квадратных корней в потерях. Проблема в том, что производная от x**0.5 равна 0.5 * x**-0.5, что означает деление на x. Если x равен нулю, это приведет к появлению NaN. В этом случае квадратный корень берется из tf.norm и сразу же следует tf.square, но операции не объединяются и не отменяются.

Упрощение выражения потери до tf.reduce_sum(tf.square(prediction - _x2)) должно сделать вещи более стабильными.

...