Линейная регрессия TensorFlow — возврат NaN для весов, смещения и Inf для потерь

Я пытаюсь выполнить приведенную ниже линейную регрессию в TensorFlow, но мой результат - все Inf и NaN.

Мой входной набор данных должен быть Y = 0,5 * X + 2 + шум; где X - нормальное распределение размера (1000), а шум - гауссовский с (mu = 0,0 и sigma = 50)

Выход:

потери = 82662,945 Вт = 15974,369 б 24,379812

потери= 81293050000000,0 Вт= -508895600,0 б -775064,06

потери= 8,250697e+22 Вт= 16212403000000,0 b 24692003000,0

потери= 8,373905e+31 Вт= -5,1649487e+17 b -786638100000000,0

потеря = inf W = 1,6454498e + 22 b 2,5060722e + 19

потеря = inf W = -5,2420755e + 26 b -7,9838474e + 23

потеря = inf W = 1,6700204e + 31 b 2,543495e + 28

потеря = inf W = -5,320352e + 35 b -8,1030665e + 32

убыток= инф. W= инф. б инф.

потеря = inf W = nan b nan

потеря = нан W = нан б нан

потеря = нан W = нан б нан

потеря = нан W = нан б нан

import tensorflow as tf
from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt


noise=np.random.normal(0.0,50,1000)#.astype(np.float32)
x_data=np.random.uniform(0,1000,1000)#.astype(np.float32)
y_data=0.5*x_data+2+noise#.astype(np.float32)

plt.scatter(x_data,y_data,s=0.1)
plt.show()


X=tf.placeholder(shape=(1000,),dtype=tf.float32)
Y=tf.placeholder(shape=(1000,),dtype=tf.float32)

#Learning W and b over the epochs
W=tf.get_variable(name='Weight',dtype=tf.float32,shape(),initializer=tf.zeros_initializer())
b=tf.get_variable(name='Bias',dtype=tf.float32,shape=(),initializer=tf.zeros_initializer())

Y_pred= tf.add(tf.multiply(X, W),b)
loss = tf.reduce_mean(tf.square(Y_pred - Y))



optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.05).minimize(loss)

epochs=100
with tf.Session() as sess:
init=tf.global_variables_initializer()
sess.run(init)
for e in range(epochs):
    _,c=sess.run([optimizer,loss],feed_dict = {X: x_data,Y: y_data})
    print('loss=',c,'W=',sess.run(W),'b',sess.run(b))

#plt.scatter(x_data, y_data, 'ro', label='Original data')
plt.plot(x_data, sess.run(W) * x_data + sess.run(b), label='Fitted line')
plt.legend()
plt.show()
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
540
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Интуитивно градиентный спуск похож на попытку найти путь к дну долины, указывая направление спуска и делая шаг, а затем повторяя. На каждом этапе вы переоцениваете направление, исходя из того, что сейчас идет вниз. Если долина гладкая, без локальных понижений и размер вашего шага достаточно мал, вы в конце концов найдете дно.

Скорость обучения аналогична размеру шага.

Итак, при слишком высокой скорости обучения вы теперь можете представить, что делаете такой большой шаг, что перешагиваете через всю долину к точке выше на холме на противоположной стороне. Затем вы поворачиваетесь, чтобы снова указать вниз по склону (то есть примерно на 180 градусов) и смотрите в центр долины, но делаете шаг прямо через нее, чтобы еще выше подняться на другую сторону. И так все выше и выше по противоположным сторонам долины

Таким образом, резкое снижение скорости обучения до чего-то вроде этого, похоже, позволяет ему сходиться:

optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.000001).minimize(loss)

Спасибо! Однако я заметил, что стоимость моего убытка очень высока, его 2000++

Dude1234 29.05.2019 17:28

Кроме того, мне нужно разделить набор данных на тестирование и обучение, так как мне приступить к тестированию?

Dude1234 29.05.2019 17:28

@Dude1234 С удовольствием. :-) Рад, что смог помочь - если вы считаете, что это стоило того, и ответили на свой первоначальный вопрос, вы можете принять / проголосовать. Что касается ваших последующих вопросов - в stackoverflow обычно лучше задать своим последующим вопросам новый вопрос (сначала проверить, что он ранее не задавался, и проверить рекомендации по заданию вопросов и т. д.), чтобы каждый вопрос был кратким и автономным. может быть лучше опубликовать заново там, где все сообщество может посмотреть, а не комментировать здесь

Stewart_R 29.05.2019 17:48

Другие вопросы по теме