我正在尝试为机器学习算法编写代码,以学习机器学习概念和Tensorflow。我要写的算法是:
(信誉不佳,无法嵌入图像)https://i.imgur.com/lxgC7YV.png
“这等效于分段线性回归模型。”
来自(等式7):
https://arxiv.org/pdf/1411.3315.pdf
我已经加载了要执行的向量。并初始化我的占位符和变量:
>>> l = [{27309053}, {23625724}, {25051134}]
>>> [x for x, in l]
>>> [27309053, 23625724, 25051134]
我设置的预测,成本和培训步骤如下:
size = len(originalVecs)
_x1 = tf.placeholder(tf.float64, shape=[size, 300], name="x1-input")
_x2 = tf.placeholder(tf.float64, shape=[size, 300], name="x2-input")
_w = tf.Variable(tf.random_uniform([300,300], -1, 1, dtype = tf.float64), name="weight1")
初始化后,我将进行以下训练:
prediction = tf.matmul(_x1,_w)
cost = tf.reduce_sum(tf.square(tf.norm(prediction - _x2)))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cost)
当我运行我的代码时,它非常不稳定,并且仅在大约20次迭代中就增长了,只能打印NaN。我认为我做错了几件事,但我不知道如何纠正。
当我希望预测值为[1,300]时,预测的形状为[20,300]。我希望它基于单个x1和x2进行预测,而不是一次全部预测,然后尝试从所有数据点的误差总和中学习(我假设是分段的)。我不确定如何处理此问题,但是由于我认为目前正在基于20,300矩阵而不是20,1,300矩阵的总和最小化。
我认为matmul是正确的,因为乘法是元素明智的选择?
我正在输入输入数据作为np数组的列表。每个np数组都是一个具有300维的数据点。
谢谢。
答案 0 :(得分:0)
通常,我会避免损失的平方根。问题在于x**0.5
的派生词是0.5 * x**-0.5
,这意味着除以x
。如果x
为零,将产生NaN。在这种情况下,平方根来自tf.norm
,紧随其后的是tf.square
,但是这些运算不会融合在一起并且不会取消。
将损失表达式简化为tf.reduce_sum(tf.square(prediction - _x2))
应该会使情况更加稳定。