【发布时间】:2018-09-26 11:39:45
【问题描述】:
试图理解 keras 优化器 (source code) 中的 SGD 优化代码。在get_updates 模块中,我们有:
# momentum
shapes = [K.int_shape(p) for p in params]
moments = [K.zeros(shape) for shape in shapes]
self.weights = [self.iterations] + moments
for p, g, m in zip(params, grads, moments):
v = self.momentum * m - lr * g # velocity
self.updates.append(K.update(m, v))
在哪里K = keras.backend。现在,既然moments 被设置为一个零张量列表,而m 是这个列表的迭代,为什么m 不总是在v = self.momentum * m - lr * g 行中计算为零张量?
现在我查找了 tensorflow (source code) 的 keras.backend.zeros 的代码,keras.backend.zeros 返回 tf.zeros,这显然返回了一个恒定的零张量。 (编辑:如果指定了形状,则返回使用 tf.zeros 初始化的 tf.Variable。)
我的直觉是它会返回类似tf.get_variable() 的东西,初始化器为零,因此张量不会每次都被覆盖。相反,名称为 m 的张量会不断被 K.update() 更新。
那么tf.zeros() 的行为实际上与tf.get_variable() 的行为相似吗?初始化为零?我还有什么遗漏的吗?
编辑:所以即使指定了形状,上面链接的源代码似乎仍然返回一个新的张量变量,而不是重用现有的张量变量(即使用get_variable()),无论如何这似乎很困难因为没有指定名称。仍然对为什么返回现有变量而不是新的零张量变量感到困惑。
【问题讨论】:
标签: python tensorflow machine-learning keras gradient-descent