Сеть расходится с NaN в простом примере TensorFlow - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь следовать примеру из серии Stanford по TF, применяя квадратичную линейную регрессию.

Y = W*X*X + u*X + b

Набор данных находится в Cengage набор данных; и код следующий:

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
import xlrd

DATA = '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

loss = tf.square(Y - Y_, name = 'loss')

optimizer = tf.train.GradientDescentOptimizer(0.0001).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, Y_, W, b, u, X, Y], feed_dict = {X:x, Y:y}))
            loss_average.append(sess.run(loss, feed_dict = {X:x, Y:y}))

Окончательные значения W, b и u, которые я получаю, равны nan. Я пытался пошагово проверить, почему это происходит. Итак, в выводе ниже я включил [optimizer, Y_, W, b, u, X, Y]

и после нескольких итераций строк я получаю:

[None, 3.9304674e+33, -1.0271335e+33, -7.7725354e+29, -2.8294217e+31, 36.2, 41.]
[None, -1.619979e+36, inf, 3.2321854e+32, 1.2834338e+34, 39.7, 147]

По-видимому, во время оптимизации W заканчивается на 'inf', что разрушает выход регрессии.

Есть идеи, что я сделал не так?

1 Ответ

0 голосов
/ 30 апреля 2018

Здесь у вас есть проблема с градиентом. Это потому, что ваши 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)]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...