Линейная регрессия Tensorflow не сходится к правильным значениям - PullRequest
0 голосов
/ 25 августа 2018

У меня есть набор данных CSV с 2 столбцами, столбцом ввода и вывода, и когда я использую Excel, чтобы найти линию тренда, я получаю:

y = -0,4571x + 0,9011

Когда я запускаю следующий код w и сходлюсь к различным значениям в зависимости от выбранной скорости обучения и размера партии. Я играл с разными ценностями без какой-либо удачи. Может быть, я что-то упускаю, может быть?

Стоимость, похоже, тоже не меняется.

learningRate = 0.001
epochs = 2000
batchSize = 20

df = pd.read_csv("C:\\Users\\Brian\\Desktop\\data.csv")
X = df[df.columns[0]].values
Y = df[df.columns[1]].values

def getBatch(batchSize, inputs, outputs):
    idx = np.arange(0,len(inputs))
    np.random.shuffle(idx)
    idx = idx[:batchSize]
    xBatch = [inputs[i] for i in idx]
    yBatch = [outputs[i] for i in idx]
    xBatch = np.reshape(xBatch, (batchSize,1))
    return np.asarray(xBatch), np.asarray(yBatch)

w = tf.Variable(0.0, tf.float32)
b = tf.Variable(0.0, tf.float32)

x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)

prediction = tf.add(tf.multiply(x,w), b)

cost = tf.reduce_sum(tf.square(prediction-y))

optimizer = tf.train.GradientDescentOptimizer(learningRate).minimize(cost)

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    for epoch in range(epochs):
        xBatch, yBatch = getBatch(batchSize,X,Y)
        #for (trainX, trainY) in zip(xBatch,yBatch):
        sess.run(optimizer, feed_dict={x: xBatch, y: yBatch})

        if(epoch+1) % 50 == 0:
            c = sess.run(cost, feed_dict={x: X, y: Y})
            print("Epoch:", (epoch+1), "cost=", "{:.4f}".format(c), "w=", sess.run(w), "b=", sess.run(b))

    print("Optimization Finished")
    trainingCost = sess.run(cost, feed_dict={x: X, y:Y})
    print("Training cost=", trainingCost, "w=", sess.run(w), "b=", sess.run(b))

1 Ответ

0 голосов
/ 26 августа 2018

Когда я запускаю следующий код w и сходлюсь к различным значениям в зависимости от выбранной скорости обучения и размера партии.

Потому что, если вы запустите sess.run(optimizer, feed_dict={x: xBatch, y: yBatch}) TensorFlow сделает что-то вроде ниже.

w -= learningRate * dw

, где dw - это значение, рассчитанное оптимизатором градиентного спуска.

Поэтому, если вы измените learningRate и затем запустите программу, вы получите другое значение ww влияют на dw и dw влияют на w.Поэтому трудно предсказать, каким будет значение w, если вы измените learningRate.

...