python - 梯度下降权重/偏差更新如何在这里工作?
问题描述
我一直在从 Michael Nielsen 的http://neuralnetworksanddeeplearning.com/chap1.html学习神经网络。
在下面的部分中更新权重和偏差
def update_mini_batch(self, mini_batch, eta):
nabla_b = [np.zeros(b.shape) for b in self.biases]
nabla_w = [np.zeros(w.shape) for w in self.weights]
for x, y in mini_batch:
delta_nabla_b, delta_nabla_w = self.backprop(x, y)
#Zero vectors
nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)]
nabla_w = [nw+dnw for nw, dnw in zip(nabla_w, delta_nabla_w)]
self.weights = [w-(eta/len(mini_batch))*nw
for w, nw in zip(self.weights, nabla_w)]
self.biases = [b-(eta/len(mini_batch))*nb
for b, nb in zip(self.biases, nabla_b)]
def SGD(self, training_data, epochs, mini_batch_size, eta,
test_data=None):
if test_data: n_test = len(test_data)
n = len(training_data)
for j in xrange(epochs):
random.shuffle(training_data)
mini_batches = [
training_data[k:k+mini_batch_size]
for k in xrange(0, n, mini_batch_size)]
####
for mini_batch in mini_batches:
self.update_mini_batch(mini_batch, eta)
if test_data:
print "Epoch {0}: {1} / {2}".format(
j, self.evaluate(test_data), n_test)
else:
print "Epoch {0} complete".format(j)
需要引入nabla_b和nabla_w零向量吗?当它们被简单地添加到本身是 numpy 数组的 dnb 和 dnw 中时。不是0 +某事=某事。对于单个训练示例,这里需要零向量吗?
作为测试,我删除了零向量并单独使用了 dnb 和 dnw,但我没有看到训练中有任何显着差异。
谢谢你。
解决方案
是的,你是对的0 + something = something
,但在第二次迭代中,它将是
something +something_else = value
因此,这发生在以下代码中
for x, y in mini_batch:
在这里,对于第一次minibatch
nabla_w
,nabla_b
将是 0,但对于第二次和以后的迭代,它将具有一些值。
让我们考虑以下代码
nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)]
nabla_w = [nw+dnw for nw, dnw in zip(nabla_w, delta_nabla_w)]
在第一次迭代中nabla_b
和nabla_w
都是零。但是,在这个迭代中,这些被更新是因为nb+dnb
nabla_b 和 nabla_w 不再只是只有零的向量。因此,在第二次迭代中,nabla_b 不再是零向量
推荐阅读
- python - 将模型关系指定为字符串与具体模型?
- json - Gson 将愉快地使用 List 制作 JSON
> 但如果列表在一个类中,则不是 - html - Outlook 中的 HTML 表单与 Post 功能
- sql - 如何合并这些将列插入表的查询
- node.js - 如何使用节点将用户数据对象与令牌一起发送到角度前端?
- javascript - 如何编写按钮以指向另一个网页并选中复选框
- android - 为什么android画布中的drawVertices需要禁用硬件加速?
- javascript - var damage = Math.max(Math.floor(Math.random() * max)+1, min) 第一个 'Math.max' 和最后一个 ',min' 是什么意思
- php - 网页抓取不仅在本网站上有效
- xcode - 条件绑定的初始化程序必须具有 Optional 类型,而不是 '[String : Double]'