由于简书不支持数学公式,请移步零基础入门深度学习(3) - 神经网络和反向传播算法。为了保证最佳阅读效果,请尽量在电脑上阅读。
相关文章
零基础入门深度学习(1) - 感知器 零基础入门深度学习(2) - 线性单元和梯度下降
本文标题:零基础入门深度学习(3) - 神经网络和反向传播算法
本文链接:https://www.haomeiwen.com/subject/jgimsttx.html
网友评论
def calc_output(self):
output = reduce(lambda ret, conn: ret + conn.upstream_node.output * conn.weight,
self.upstream, 0)
self.output = sigmoid(output)
def calc_output(self):
output = reduce(lambda ret, conn: ret + conn.upstream_node.output * conn.weight, self.upstream, 0)
self.output = sigmoid(output)
conn.upstream_node.output中,conn是一个Connection对象,它在初始化的时候会有upstream_node和weight这两个属性。不知道这样能不能解答你的问题。
我在同样一行的代码也遇到了问题,我的问题是reduce函数中的ret为什么能参与运算,我的理解是它是一个Connection对象,怎么会与数值进行计算呢。如果你知道,请你帮忙解答一下,谢谢!
'''
反向计算W和b的梯度
delta_array: 从上一层传递过来的误差项
'''
# 式8
self.delta = self.activator.backward(self.input) * np.dot(
self.W.T, delta_array)
self.W_grad = np.dot(delta_array, self.input.T)
self.b_grad = delta_array
您好,在计算delta的时候,传入的参数为self.activator.backward(self.input),按照推导的公式,这儿不是self.output吗?不知道理解的对不对,还麻烦讲解一下,非常感谢。
'''
反向计算W和b的梯度
delta_array: 从上一层传递过来的误差项
'''
# 式8
self.delta = self.activator.backward(self.input) * np.dot(
self.W.T, delta_array)
self.W_grad = np.dot(delta_array, self.input.T)
self.b_grad = delta_array
根据公式 b_grad 不应该等于self.delta么
麻烦check下, 谢谢!
我在学习您的教程的过程中,遇到了一些问题,现写下来和您探讨一下。
1. 教程三中,向量化推导中,式8误差在反向传播中,是从后面的层向前传播的,所以应该是(l+1)而不是(l-1)
2. 教程三中,代码中FullConnectedLayer初始化的时候b和output都是使用的numpy的二维方式初始化的(其中第二维大小是1),在forward的计算中,wx+b这里就会出错,由于np.dot(self.W, input_array) 计算出来的是一个一维的向量,但是b是个二维的,所以有bug。
3. sigmod函数的溢出问题。
最后想知道您是否还有其他的教程可以学习,近期有出新教程的计划没有。谢谢!
2. 文章中的代码可能不是最新的,我把代码放到GitHub上了https://github.com/hanbt/learn_dl,是可以运行的版本。
3. 有时候会这样,不过可以忽略,最终仍然能够收敛。
刚刚看到第3讲,“向量化编程”这里的关于W更新的地方,(式8),有两处我觉得可能写错了,您看一下
1. 第l层的误差项,应该是由第l+1层的误差项反向传播过来计算的吧,这样的话式子右边delta的上标不是应该是l+1吗
2. 还是关于式8,W的更新,应该是第l层更新时候用的W矩阵应该是l+1层的W矩阵吧?
我看你代码中 FullConnectedLayer类 第39行直接是用到当前层W转置,应该是下一层的W矩阵的转置吧?
上面是我的两个疑问点,还请不吝赐教。
2. delta_array保存的是误差函数E当对于第l层的加权输入的导数,因此,按照式8计算的是l-1层的δ。
def sigmoid(output):
return 1.0 / (1.0 + np.exp(-output))
跑出来:
C:/work/dp/bp.py:103: RuntimeWarning: overflow encountered in exp
return 1.0 / (1.0 + np.exp(-output))
楼主有遇到么?请问有完成可以跑的代码下载测试么
1 为什么δ要这样取值,有什么说法吗?
2 为什么δ中求偏导时,要对加权值netj求骗到,对j的输出值aj求偏导不是更方便吗?
望指导,谢谢
该为 get_gradient然后update_weight吧