Я пытаюсь приспособить очень простую модель линейной регрессии с использованием тензорного потока. Однако потеря (среднеквадратическая ошибка) увеличивается, а не уменьшается до нуля.

Сначала я генерирую свои данные:

x_data = np.random.uniform(high=10,low=0,size=100)
y_data = 3.5 * x_data -4 + np.random.normal(loc=0, scale=2,size=100)

Затем я определяю вычислительный граф:

X = tf.placeholder(dtype=tf.float32, shape=100)
Y = tf.placeholder(dtype=tf.float32, shape=100)
m = tf.Variable(1.0)
c = tf.Variable(1.0)
Ypred = m*X + c
loss = tf.reduce_mean(tf.square(Ypred - Y))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=.1)
train = optimizer.minimize(loss)

Наконец, запустите его на 100 эпох:

steps = {}
steps['m'] = []
steps['c'] = []

losses=[]

for k in range(100):
    _m = session.run(m)
    _c = session.run(c)
    _l = session.run(loss, feed_dict={X: x_data, Y:y_data})
    session.run(train, feed_dict={X: x_data, Y:y_data})
    steps['m'].append(_m)
    steps['c'].append(_c)
    losses.append(_l)

Однако, когда я строю график потерь, я получаю:

enter image description here

Полный код также можно найти здесь.

2
highBandWidth 28 Май 2017 в 07:15

2 ответа

Лучший ответ

Всякий раз, когда вы видите, что ваши затраты монотонно увеличиваются с количеством эпох, это уверенный признак того, что ваша скорость обучения слишком высока. Повторно повторяйте тренировку с коэффициентом обучения, умноженным на 1/10 каждый раз, пока функция стоимости явно не уменьшится с количеством эпох.

4
stackoverflowuser2010 28 Май 2017 в 19:36

Скорость обучения слишком велика; 0,001 хорошо работает:

x_data = np.random.uniform(high=10,low=0,size=100)
y_data = 3.5 * x_data -4 + np.random.normal(loc=0, scale=2,size=100)
X = tf.placeholder(dtype=tf.float32, shape=100)
Y = tf.placeholder(dtype=tf.float32, shape=100)
m = tf.Variable(1.0)
c = tf.Variable(1.0)
Ypred = m*X + c
loss = tf.reduce_mean(tf.square(Ypred - Y))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=.001)
train = optimizer.minimize(loss)
init = tf.global_variables_initializer()
with tf.Session() as session:
    session.run(init)
    steps = {}
    steps['m'] = []
    steps['c'] = []

    losses=[]

    for k in range(100):
    _m = session.run(m)
    _c = session.run(c)
    _l = session.run(loss, feed_dict={X: x_data, Y:y_data})
    session.run(train, feed_dict={X: x_data, Y:y_data})
    steps['m'].append(_m)
    steps['c'].append(_c)
    losses.append(_l)

plt.plot(losses)
plt.savefig('loss.png')

Plot of losses[![][1]

(Потенциально полезная ссылка: https://gist.github.com/fuglede/ad04ce38e80887ddcbebabe81)

2
fuglede 28 Май 2017 в 19:35