Я делаю свой первый градиентный спуск, когда-либо , после курса по машинному обучению.
Но, похоже, он не работает должным образом, поскольку колеблется (сходится, затем расходится, затем сходится ...) и, в конце, результат не оценивается.
Может быть, это потому, что я не нормализовал свои X и Y, но я не знаю, как это сделать ...
Я пробовал способ с sklearn StandardScaler, но получил ошибку.
Я не знаю, что происходит не так.
Я использую Tensorflow 1.3.0 и jupyter.
Вот мой код:
#from sklearn.preprocessing import StandardScaler
#scaler=StandardScaler()
n_epochs=1000
learning_rate=0.01
X=tf.constant(housing_data_plus_bias,dtype=tf.float32,name="X")
#X_norm=scaler.fit_transform(X)
Y=tf.constant(housing.target.reshape(-1,1),dtype=tf.float32,name="Y")
theta=tf.Variable(tf.random_uniform([n+1,1],-1.0,1.0),name="theta")
y_pred=tf.matmul(X,theta,name="predictions") #eq 1.4
error=y_pred - Y
mse=tf.reduce_mean(tf.square(error),name="mse") #eq 1.5
gradients= (2/(m*mse) ) * tf.matmul(tf.transpose(X),error)
training_op = tf.assign(theta,theta - learning_rate * gradients)
init=tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
print(" Y ")
print(Y.eval())
print(" X ")
print(X.eval())
for epoch in range(n_epochs):
if epoch%100==0:
print("Epoch",epoch,"MSE =",mse.eval())
sess.run(training_op)
best_theta=theta.eval()
и вот что я получаю:
Y
[[4.526]
[3.585]
[3.521]
...
[0.923]
[0.847]
[0.894]]
X
[[ 1. 8.3252 41. ... 2.5555556 37.88
-122.23 ]
[ 1. 8.3014 21. ... 2.1098418 37.86
-122.22 ]
[ 1. 7.2574 52. ... 2.80226 37.85
-122.24 ]
...
[ 1. 1.7 17. ... 2.3256352 39.43
-121.22 ]
[ 1. 1.8672 18. ... 2.1232092 39.43
-121.32 ]
[ 1. 2.3886 16. ... 2.616981 39.37
-121.24 ]]
Epoch 0 MSE = 511820.7
Epoch 100 MSE = 775760.0
Epoch 200 MSE = 2181710.8
Epoch 300 MSE = 115924.266
Epoch 400 MSE = 7663049.0
Epoch 500 MSE = 2283198.2
Epoch 600 MSE = 586127.75
Epoch 700 MSE = 7143360.5
Epoch 800 MSE = 15567712.0
Epoch 900 MSE = 2333040.0
Но что не так?
Я думал, что нормализация позволит только сходиться быстрее.