1

Ich bin neu in Machine Learning und Tensorflow. Derzeit versuche ich, der Logik des Tutorials zu folgen, um ein einfaches lineares Regressionsmodell der Form y = a * x zu erstellen (hier gibt es keinen Bias-Term). Aus irgendeinem Grund konvergiert das Modell jedoch nicht zu dem korrekten Wert "a". Der Datensatz wird von mir in Excel erstellt. Wie unten gezeigt:einfache lineare Regression konvergierte nicht in Tensorflow

enter image description here

hier ist mein Code, der auf diesem Dummy-Datensatz zu laufen tensorflow versucht I erzeugt.

import tensorflow as tf 
import pandas as pd 

w = tf.Variable([[5]],dtype=tf.float32) 
b = tf.Variable([-5],dtype=tf.float32) 
x = tf.placeholder(shape=(None,1),dtype=tf.float32) 
y = tf.add(tf.matmul(x,w),b) 

label = tf.placeholder(dtype=tf.float32) 
loss = tf.reduce_mean(tf.squared_difference(y,label)) 

data = pd.read_csv("D:\\dat2.csv") 
xs = data.iloc[:,:1].as_matrix() 
ys = data.iloc[:,1].as_matrix() 
optimizer = tf.train.GradientDescentOptimizer(0.000001).minimize(loss) 
sess = tf.InteractiveSession() 
sess.run(tf.global_variables_initializer()) 

for i in range(10000): 
    sess.run(optimizer,{x:xs,label:ys}) 
    if i%100 == 0: print(i,sess.run(w)) 
print(sess.run(w)) 

unterhalb der Druck ist in ipython Konsole aus, wie Sie nach 10000. Iteration sehen kann, ist der Wert für w um 4,53 anstelle des korrekten Wertes 6. ich wirklich schätzen, wenn jemand auf etwas Licht könnte was hier falsch läuft. Ich habe mit unterschiedlicher Lernrate von 0.01 bis 0.0000001 herumgespielt, keiner der Einstellung ist in der Lage, die w auf 6 konvergieren zu lassen. Ich habe einige Vorschläge zur Normalisierung der Funktion auf Standard-Normalverteilung gelesen, würde ich gerne wissen, ob diese Normalisierung ist ein Muss? Ohne Normalisierung kann gradientdescent keine Lösung finden? Vielen Dank!

enter image description here

+0

Was passiert, wenn die 'randbetween' 0 und 0,1 statt übergeben wurde von -2, 2? –

+0

Ihre Lernrate ist viel zu klein. Wie viele verschiedene Werte haben Sie? (Wie viele Zeilen in Ihrem Excel?). Wenn diese Zahl zu klein ist, kann das ein Problem sein ... Sie sollten in der Lage sein, ohne Normalisierung zu konvergieren, wenn Sie genügend Daten haben (und einen ausreichend großen Bereich haben) – gdelab

+0

@gdelab Der Datensatz enthält ungefähr 160 Datenpunkte. Ich habe mit viel größeren Lernraten wie 0,1 oder sogar 1 gespielt, aber ohne Erfolg. Ich dachte, durch 10000-mal iterieren, das Modell sollte immer noch in der Lage zu konvergieren – Rookie

Antwort

1

Es ist ein Formproblem: y und Etikett nicht die gleiche Form haben ([batch_size, 1] vs [batch_size]). In loss = tf.reduce_mean(tf.squared_difference(y, label)) verursacht es Tensorflow, Dinge anders zu interpretieren, als Sie wollen, wahrscheinlich, indem Sie etwas Broadcasting verwenden ... Wie auch immer, das Ergebnis ist, dass Ihr Verlust nicht das ist, was Sie wollen.

Um das zu korrigieren, einfach

y = tf.add(tf.matmul(x, w), b) 

von

y = tf.add(tf.matmul(x, w), b) 
y = tf.reshape(y, shape=[-1]) 

Mein vollen Arbeits Code ersetzen unten:

import tensorflow as tf 
import pandas as pd 

w = tf.Variable([[4]], dtype=tf.float64) 
b = tf.Variable([10.0], dtype=tf.float64, trainable=True) 
x = tf.placeholder(shape=(None, 1), dtype=tf.float64) 
y = tf.add(tf.matmul(x, w), b) 
y = tf.reshape(y, shape=[-1]) 
label = tf.placeholder(shape=(None), dtype=tf.float64) 
loss = tf.reduce_mean(tf.squared_difference(y, label)) 

my_path = "/media/sf_ShareVM/data2.csv" 
data = pd.read_csv(my_path, sep=";") 
max_n_samples_to_use = 50 
xs = data.iloc[:max_n_samples_to_use, :1].as_matrix() 
ys = data.iloc[:max_n_samples_to_use, 1].as_matrix() 
lr = 0.000001 
optimizer = tf.train.GradientDescentOptimizer(learning_rate=lr).minimize(loss) 
sess = tf.InteractiveSession() 
sess.run(tf.global_variables_initializer()) 

for i in range(100000): 
    _, loss_value, w_value, b_value, y_val, lab_val = sess.run([optimizer, loss, w, b, y, label], {x: xs, label: ys}) 
    if i % 100 == 0: print(i, loss_value, w_value, b_value) 
    if (i%2000 == 0 and 0< i < 10000): # We use a smaller LR at first to avoid exploding gradient. It would be MUCH cleaner to use gradient clipping (by global norm) 
     lr*=2 
     optimizer = tf.train.GradientDescentOptimizer(learning_rate=lr).minimize(loss) 

print(sess.run(w)) 
+0

Natürlich können Sie die Drucke entfernen, die Sie nicht wollen – gdelab

+0

Sie werden sehen, dass es nach den ersten paar sehr guten Schritten sehr konvergiert langsam (vor allem die Vorspannung). Um es zu beheben, benötigen wir eine größere Lernrate. Leider sind wir hier an den Grenzen des explodierenden Gradienten, besonders wenn Sie alle Werte aus Ihren Daten behalten, weshalb wir eine kleine Lernrate benötigen. Idealerweise sollten Sie den Gradienten abschneiden und eine größere Lernrate verwenden. – gdelab

+0

danke @Gdelab, es ist in der Tat das Gestaltungsproblem. Sobald das Problem behoben ist, konvergiert das Modell sehr schnell zum richtigen Wert. Vielen Dank – Rookie

Verwandte Themen