Здесь у вас есть проблема с градиентом. Это потому, что ваши X и Y , и, следовательно, значения разностей находятся в величине 10 1 , поэтому квадратные разности (потери) имеют величину 10 2 . Когда вы вводите X 2 в регрессию, ваши значения разности будут в величине 10 2 , их квадраты 10 4 . Поэтому градиенты будут намного больше, и сеть сильно расходится.
Чтобы исправить это, вы можете уменьшить скорость обучения на коэффициент 10 -3 , чтобы приблизить градиенты к тому месту, где они были, и вот, этот код (проверено):
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
import xlrd
DATA = 'slr05.xls'
# Read data
data = xlrd.open_workbook(DATA, encoding_override='utf-8')
sheet = data.sheet_by_index(0)
dataset = np.asarray([sheet.row_values(i) for i in range(1, sheet.nrows)])
n_samples = sheet.nrows - 1
X = tf.placeholder('float', name = 'X')
Y = tf.placeholder('float', name = 'Y')
W = tf.Variable(0.0, name = 'weights')
b = tf.Variable(0.0, name = 'bias')
u = tf.Variable(0.0, name = 'u_weight')
Y_ = X*X*W + X*u + b
#Y_ = X * u + b
loss = tf.square(Y - Y_, name = 'loss')
optimizer = tf.train.GradientDescentOptimizer(0.0000001).minimize(loss)
init = tf.global_variables_initializer()
loss_average = []
# Start the Session
with tf.Session() as sess:
sess.run(init)
for i in range(10):
for x, y in dataset:
print(sess.run([optimizer, loss, Y_, W, b, u, X, Y], feed_dict = {X:x, Y:y}))
loss_average.append(sess.run(loss, feed_dict = {X:x, Y:y}))
будет послушно и упорядоченно сходиться, как это делают хорошие сети, с выводом (только последние 5 строк):
[Нет, 1313.2705, 9.760924, 0.06911032, 0.0014081484, 0.010015297, массив (11.9, dtype = float32), массив (46., Dtype = float32)]
[None, 1174.7083, 7.7259817, 0.06986606, 0.0014150032, 0.010087272, массив (10.5, dtype = float32), массив (42., Dtype = float32)]
[None, 1217.4297, 8.1083145, 0.07066501, 0.0014219815, 0.01016194, массив (10.7, dtype = float32), массив (43., Dtype = float32)]
[None, 657,74097, 8,353538, 0,07126329, 0,0014271108, 0,010217336, массив (10,8, dtype = float32), массив (34., Dtype = float32)]
[None, 299.5538, 1.6923765, 0.07134304, 0.0014305722, 0.010233952, массив (4.8, dtype = float32), массив (19., Dtype = float32)]