Я пытаюсь выполнить приведенную ниже линейную регрессию в 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()
Вы аккуратно воссоздали простой пример проблема взрывающегося градиента.
Вы можете прочитать о возможных решениях, но самым простым для игрушечного примера может быть снижение скорости обучения.
Интуитивно градиентный спуск похож на попытку найти путь к дну долины, указывая направление спуска и делая шаг, а затем повторяя. На каждом этапе вы переоцениваете направление, исходя из того, что сейчас идет вниз. Если долина гладкая, без локальных понижений и размер вашего шага достаточно мал, вы в конце концов найдете дно.
Скорость обучения аналогична размеру шага.
Итак, при слишком высокой скорости обучения вы теперь можете представить, что делаете такой большой шаг, что перешагиваете через всю долину к точке выше на холме на противоположной стороне. Затем вы поворачиваетесь, чтобы снова указать вниз по склону (то есть примерно на 180 градусов) и смотрите в центр долины, но делаете шаг прямо через нее, чтобы еще выше подняться на другую сторону. И так все выше и выше по противоположным сторонам долины
Таким образом, резкое снижение скорости обучения до чего-то вроде этого, похоже, позволяет ему сходиться:
optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.000001).minimize(loss)
Кроме того, мне нужно разделить набор данных на тестирование и обучение, так как мне приступить к тестированию?
@Dude1234 С удовольствием. :-) Рад, что смог помочь - если вы считаете, что это стоило того, и ответили на свой первоначальный вопрос, вы можете принять / проголосовать. Что касается ваших последующих вопросов - в stackoverflow обычно лучше задать своим последующим вопросам новый вопрос (сначала проверить, что он ранее не задавался, и проверить рекомендации по заданию вопросов и т. д.), чтобы каждый вопрос был кратким и автономным. может быть лучше опубликовать заново там, где все сообщество может посмотреть, а не комментировать здесь
Спасибо! Однако я заметил, что стоимость моего убытка очень высока, его 2000++