【发布时间】:2020-10-24 00:43:59
【问题描述】:
我从头开始实现了一个深度学习神经网络,没有使用任何 python 框架,如 tensorflow 或 keras。
问题在于无论我在代码中进行什么更改,例如调整学习率或更改层或更改否。节点数量或将激活函数从 sigmoid 更改为 relu 再到leaky relu,我最终会得到一个从 6.98 开始但总是收敛到 3.24 的训练损失......
这是为什么呢?
请检查我的前进和后退道具算法。也许我无法识别其中有什么问题。
我的隐藏层使用泄漏 relu,最后一层使用 sigmoid 激活。 我正在尝试对 mnist 手写数字进行分类。
代码:
#FORWARDPROPAGATION
for i in range(layers-1):
cache["a"+str(i+1)]=lrelu((np.dot(param["w"+str(i+1)],cache["a"+str(i)]))+param["b"+str(i+1)])
cache["a"+str(layers)]=sigmoid((np.dot(param["w"+str(layers)],cache["a"+str(layers-1)]))+param["b"+str(layers)])
yn=cache["a"+str(layers)]
m=X.shape[1]
cost=-np.sum((y*np.log(yn)+(1-y)*np.log(1-yn)))/m
if j%10==0:
print(cost)
costs.append(cost)
#反向传播
grad={"dz"+str(layers):yn-y}
for i in range(layers):
grad["dw"+str(layers-i)]=np.dot(grad["dz"+str(layers-i)],cache["a"+str(layers-i-1)].T)/m
grad["db"+str(layers-i)]=np.sum(grad["dz"+str(layers-i)],1,keepdims=True)/m
if i<layers-1:
grad["dz"+str(layers-i-1)]=np.dot(param["w"+str(layers-i)].T,grad["dz"+str(layers-i)])*lreluDer(cache["a"+str(layers-i-1)])
for i in range(layers):
param["w"+str(i+1)]=param["w"+str(i+1)] - alpha*grad["dw"+str(i+1)]
param["b"+str(i+1)]=param["b"+str(i+1)] - alpha*grad["db"+str(i+1)]
【问题讨论】:
-
这两个数字 6.98 和 3.24 每次都完全相同吗?
-
是的,它一直保持在 3.24 直到大约 10000 次迭代,然后我猜它会超调(我得到一些关于除以零的错误)。
标签: python deep-learning neural-network