首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SVM Tensorflow实现

SVM Tensorflow实现
EN

Stack Overflow用户
提问于 2017-07-26 12:15:41
回答 1查看 3.6K关注 0票数 2

我一直在听Ng教授的演讲,并尝试使用tensorflow在我的jupyter笔记本上实现SVM。但是,我的模型似乎不能正确收敛。

我猜我有错误的损失函数,这可能最终不适合我的模型。

下面是我的模型的完整的图形构造代码:

代码语言:javascript
复制
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)

我使用高斯核,并将整个训练集作为里程碑。

损失函数和课程中展示的完全一样,只要我有正确的实现。

我很确定我漏掉了什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-26 13:38:15

请注意,内核矩阵应该具有batch_size^2项,而张量WF具有形状(batch_size, 2)。其思想是为数据集中的每一对(x_i,x_j)计算K(x_i,x_j),然后使用这些核心值作为支持向量机的输入。

我在支持向量机上使用Andrew Ng's lecture notes作为参考;在第20页,他推导出了最终的优化问题。您需要用您的内核函数替换内部产品<x_i, x_j>

我建议从线性内核开始,而不是RBF,并将您的代码与sklearn's等开箱即用的支持向量机实现进行比较。这将帮助您确保优化代码正常工作。

最后要注意的是:虽然可以使用梯度下降来训练SVM,但在实践中他们几乎从来没有这样训练过。支持向量机的优化问题可以通过二次规划来解决,大多数训练支持向量机的方法都利用了这一点。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45317361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档