【问题标题】:How are the weights updated in this code?这段代码中的权重是如何更新的?
【发布时间】:2019-02-03 18:02:57
【问题描述】:

我正在阅读这段代码,但无法弄清楚权重是如何在其逻辑中更新的:

tf.enable_eager_execution()

x = np.arange(0, 5, 0.1)
y = x**3 - 4*x**2 - 2*x + 2
y_noise = y + np.random.normal(0, 1.5, size=(len(x),))

def get_batch(x, y, batch_size=20):
    idxs = np.random.randint(0, len(x), (batch_size))
    return x[idxs], y[idxs]


class PolyModel(object):
    def __init__(self):
        self.w = tfe.Variable(tf.random_normal([4]))

    def f(self, x):
        return self.w[0] * x ** 3 + self.w[1] * x ** 2 + self.w[2] * x + self.w[3]


def loss(model, x, y):
    err = model.f(x) - y
    return tf.reduce_mean(tf.square(err))

model = PolyModel()
grad = tfe.implicit_gradients(loss)
optimizer = tf.train.AdamOptimizer()
iters = 20000
for i in range(iters):
    x_batch, y_batch = get_batch(x, y)
    optimizer.apply_gradients(grad(model, x_batch, y_batch))
    if i % 1000 == 0:
        print("Iteration {}, loss: {}".format(i+1, loss(model, x_batch, y_batch).numpy()))

是不是因为在这一行中,权重在函数“apply_gradients”中隐式更新?

 optimizer.apply_gradients(grad(model, x_batch, y_batch))

【问题讨论】:

    标签: tensorflow logistic-regression


    【解决方案1】:

    tfe.implicit_gradients(loss) 是一个计算loss 相对于模型权重的梯度的函数。 optimizer.apply_gradients() 应用梯度,即它根据所用优化器的更新规则更新权重(例如,更新将在“Adam”和“SGD”之间变化)。因此,在每次迭代中,模型权重都会更新。

    【讨论】:

    • grad(model, x_batch, y_batch) --- 'grad' 是这里的函数吗?它应该是标量还是向量?
    • 它是一个函数,调用它后返回的梯​​度是关于所有可训练变量的。
    • 那么,“tfe.implicit_gradients(loss)”返回函数“grad”,然后调用“grad(model, x_batch, y_batch)”?在我的 PyCharm 中,我无法检查implicit_gradient 的实现。
    猜你喜欢
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 2011-05-16
    • 2014-05-10
    • 1970-01-01
    相关资源
    最近更新 更多