2017-07-26 3 views
1

Ich habe den Vortrag von Prof. Ng verfolgt und versucht, SVM auf meinem Jupyter Notebook mit Tensorflow zu implementieren. Mein Modell scheint jedoch nicht korrekt konvergiert zu sein.SVM Tensorflow Implementierung

Scattered plot after 5000 steps of training

Ich glaube, ich falsch Verlustfunktion haben und das könnte passen würde mein Modell nicht ordnungsgemäß beenden.

Und unten ist voll Graph Bauordnung meines Modells:

tf.reset_default_graph() 

#training hyper parameters 

learning_rate = 0.000001 
C = 20 
gamma = 50 

X = tf.placeholder(tf.float32, shape=(None,2)) 
Y = tf.placeholder(tf.float32, shape=(None,1)) 
landmark = tf.placeholder(tf.float32, shape=(None,2)) 

W = tf.Variable(np.random.random((num_data)),dtype=tf.float32) 
B = tf.Variable(np.random.random((1)),dtype=tf.float32) 

batch_size = tf.shape(X)[0] 

#RBF Kernel 
tile = tf.tile(X, (1,num_data)) 
diff = tf.reshape(tile, (-1, num_data, 2)) - landmark 
tile_shape = tf.shape(diff) 
sq_diff = tf.square(diff) 
sq_dist = tf.reduce_sum(sq_diff, axis=2) 
F = tf.exp(tf.negative(sq_dist * gamma)) 

WF = tf.reduce_sum(W * F, axis=1) + B 

condition = tf.greater_equal(WF, 0) 
H = tf.where(condition, tf.ones_like(WF),tf.zeros_like(WF)) 

ERROR_LOSS = C * tf.reduce_sum(Y * tf.maximum(0.,1-WF) + (1-Y) * tf.maximum(0.,1+WF)) 
WEIGHT_LOSS = tf.reduce_sum(tf.square(W))/2 

TOTAL_LOSS = ERROR_LOSS + WEIGHT_LOSS 

optimizer = tf.train.GradientDescentOptimizer(learning_rate) 
train = optimizer.minimize(TOTAL_LOSS) 

Ich Gaußschen Kernel verwenden und ganze Ausbildung als Wahrzeichen gesetzt füttern.

Und die Verlustfunktion ist genau die gleiche, die in der Vorlesung gezeigt wird, solange ich die richtige Implementierung darauf habe.

Loss function on the lecture

Ich bin mir ziemlich sicher, dass ich etwas fehle.

Antwort

2

Beachten Sie, dass die Kernel-Matrix batch_size^2 Einträge enthalten sollte, während Ihr Tensor WF die Form (batch_size, 2) hat. Die Idee ist, K (x_i, x_j) für jedes Paar (x_i, x_j) in Ihrem Dataset zu berechnen und diese Kernelwerte dann als Eingaben für die SVM zu verwenden.

Ich verwende Andrew Ng's lecture notes auf SVMs als Referenz; auf Seite 20 leitet er das endgültige Optimierungsproblem ab. Sie sollten das innere Produkt <x_i, x_j> durch Ihre Kernel-Funktion ersetzen.

Ich würde empfehlen, mit einem linearen Kernel anstelle eines RBF zu beginnen und Ihren Code mit einer Out-of-the-Box-SVM-Implementierung wie sklearn's zu vergleichen. Dadurch können Sie sicherstellen, dass der Optimierungscode ordnungsgemäß funktioniert.

Ein letzter Hinweis: Obwohl es möglich sein sollte, eine SVM mit Gradientenabstieg zu trainieren, werden sie in der Praxis fast nie so trainiert. Das SVM-Optimierungsproblem kann durch quadratische Programmierung gelöst werden, und die meisten Methoden zum Trainieren von SVMs nutzen dies aus.

+0

Schätzen Sie für die Beantwortung! Ich muss anfangen, die Vorlesungsunterlagen zu lesen. – goofcode

+0

Ich bin froh zu helfen, hoffe, Sie finden die Notizen nützlich. Sie können manchmal dicht sein, aber sie sind sehr gut geschrieben –