Tensorflow GradientDescentOptimizer得到错误的结果

Tensorflow GradientDescentOptimizer得到错误的结果,tensorflow,Tensorflow,我想用梯度下降法来解方程组,但每次我都得到错误的结果,所以我检查了我的代码并编写了一个numpy版本,在这个版本中我提供了明确的损失梯度,我可以得到当前的结果。 所以我不明白为什么GradientDescentOptimizer不能工作 这是我没有tf的代码: import numpy as np class SolveEquation: def __init__(self, rate: float, loss_threshold: float=0.0001, max_epochs:

我想用梯度下降法来解方程组,但每次我都得到错误的结果,所以我检查了我的代码并编写了一个numpy版本,在这个版本中我提供了明确的损失梯度,我可以得到当前的结果。

所以我不明白为什么GradientDescentOptimizer不能工作

这是我没有tf的代码:

import numpy as np


class SolveEquation:
    def __init__(self, rate: float, loss_threshold: float=0.0001, max_epochs: int=1000):
        self.__rate = rate
        self.__loss_threshold = loss_threshold
        self.__max_epochs = max_epochs
        self.__x = None

    def solve(self, coefficients, b):
        _a = np.array(coefficients)
        _b = np.array(b).reshape([len(b), 1])
        _x = np.zeros([_a.shape[1], 1])
        for epoch in range(self.__max_epochs):
            grad_loss = np.matmul(np.transpose(_a), np.matmul(_a, _x) - _b)
            _x -= self.__rate * grad_loss
            if epoch % 10 == 0:
                loss = np.mean(np.square(np.subtract(np.matmul(_a, _x), _b)))
                print('loss = {:.8f}'.format(loss))
                if loss < self.__loss_threshold:
                    break
        return _x

s = SolveEquation(0.1, max_epochs=1)
print(s.solve([[1, 2], [1, 3]], [3, 4]))
import tensorflow as tf
import numpy as np


class TFSolveEquation:
    def __init__(self, rate: float, loss_threshold: float=0.0001, max_epochs: int=1000):
        self.__rate = rate
        self.__loss_threshold = tf.constant(loss_threshold)
        self.__max_epochs = max_epochs
        self.__session = tf.Session()
        self.__x = None

    def __del__(self):
        try:
            self.__session.close()
        finally:
            pass

    def solve(self, coefficients, b):
        coefficients_data = np.array(coefficients)
        b_data = np.array(b)
        _a = tf.placeholder(tf.float32)
        _b = tf.placeholder(tf.float32)
        _x = tf.Variable(tf.zeros([coefficients_data.shape[1], 1]))
        loss = tf.reduce_mean(tf.square(tf.matmul(_a, _x) - _b))
        optimizer = tf.train.GradientDescentOptimizer(self.__rate)
        model = optimizer.minimize(loss)
        self.__session.run(tf.global_variables_initializer())
        for epoch in range(self.__max_epochs):
            self.__session.run(model, {_a: coefficients_data, _b: b_data})
            if epoch % 10 == 0:
                if self.__session.run(loss < self.__loss_threshold, {_a: coefficients_data, _b: b_data}):
                    break
        return self.__session.run(_x)

s = TFSolveEquation(0.1, max_epochs=1)
print(s.solve([[1, 2], [1, 3]], [3, 4]))
使用梯度下降法 因此在第1次计算时,δx=(0.7,1.8)

但不幸的是,我的tf代码给出了

delta x = 
[[ 0.69999999]
 [ 1.75      ]]
我没有tf的代码给出了

delta x = 
[[ 0.7]
 [ 1.8]]
没有tf的绝对代码是正确的,但为什么tf计算梯度可能会小于0.05,然后出现结果? 我想这就是我没有tf的代码可以解方程组的原因,但是tf版目前无法解方程组。

有人能告诉我为什么tf会给出一个不可逆梯度吗?谢谢


我的平台是Win10+tensorflow gpu v1.0

您忘记在tensorflow实现中重塑
\u b
。因此,您要从此行的列中减去一行:
loss=tf.reduce\u mean(tf.square(tf.matmul(\u a,\u x)-(u b))

编辑:在未指定缩减轴的情况下,不要使用缩减运算(如平均值或总和)。默认情况下,numpy和tensorflow中的缩减操作会沿所有维度进行缩减,所以无论输入数组的维度如何,都会得到一个数字。这可能会导致许多像这样的模糊错误

delta x = 
[[ 0.7]
 [ 1.8]]