2017-07-26 4 views
1

私は教授の講義に従っていて、テンソルフローを使って私のジュピターノートにSVMを実装しようとしています。しかし、私のモデルは適切に収束していないようです。SVM Tensorflowの実装

Scattered plot after 5000 steps of training

私は私が間違って損失関数を持っており、それが不適切に私のモデルに合うように終わるかもしれないと思います。以下

そして、私のモデルの完全なグラフ構築コードです:

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) 

私はガウスカーネルを使用し、ランドマークとして全体のトレーニングセットを供給しています。

損失関数は、私が正しい実装をしている限り、講義で示されたものと全く同じです。

Loss function on the lecture

私は何かが欠けてることをかなり確信しています。

答えて

2

カーネルマトリックスはbatch_size^2のエントリを持ち、テンソルWFの形状は(batch_size, 2)です。考え方は、データセット内の各ペア(x_i、x_j)のK(x_i、x_j)を計算し、これらのカーネル値をSVMへの入力として使用することです。

私は参照としてSVMのAndrew Ng's lecture notesを使用しています。 20ページの最終的な最適化問題を導出します。内部製品<x_i, x_j>をカーネル機能で置き換えたいと思うでしょう。

私は、RBFの代わりにリニアカーネルを使い、コードをsklearn'sのようなアウトオブボックスのSVMの実装と比較することをお勧めします。これにより、最適化コードが適切に動作しているかどうかを確認するのに役立ちます。

最後の注意:勾配降下を使用してSVMを訓練することは可能ですが、実際にはほとんど訓練されていません。 SVM最適化の問題は、2次計画法によって解決でき、SVMを訓練するためのほとんどの方法がこれを利用します。

+0

お返事ありがとうございます!私は講義ノートをチェックする必要があります。 – goofcode

+0

助けてくれてうれしいです。彼らは時々密集することができますが、彼らは非常によく書かれています –

関連する問題