python - 2 个隐藏层神经网络上的反向传播
问题描述
我正在尝试制作我的第一个神经网络,并且我尝试制作一个具有 2 个隐藏层的神经网络,但它没有学习。
我很确定前馈部分工作正常,但无论我训练多少(使用 XOR 表),误差都不会减少,它只是在 0.5 左右振荡。我猜反向传播部分有问题,但我已经修改了很多次,甚至计算了它应该是什么都无济于事。
这是代码:
class NeuralNetwork:
def __init__(self, input_size, output_size):
# Sets the input and output sizes
self.inputs = input_size
self.outputs = output_size
# Sets size of hidden layers
self.L1 = 2
self.L2 = 2
# Initializes weights
self.W1 = np.random.rand(self.inputs.shape[1], self.L1)
self.W2 = np.random.rand(self.L1, self.L2)
self.W3 = np.random.rand(self.L2, self.outputs.shape[1])
# The network evaluates the inputs
def feedforward(self, inp):
self.inputs = inp
# Evaluates layer 1
Z1 = sig(np.dot(self.inputs, self.W1))
# Evaluates layer 2
Z2 = sig(np.dot(Z1, self.W2))
# Evaluates end result
Z3 = sig(np.dot(Z2, self.W3))
self.outputs = Z3
# Backpropagation
def train(self, inp, outp):
# Evaluate the input
self.inputs = inp
# Evaluates layer 1
Z1 = sig(np.dot(self.inputs, self.W1))
# Evaluates layer 2
Z2 = sig(np.dot(Z1, self.W2))
# Evaluates end result
Z3 = sig(np.dot(Z2, self.W3))
# Evaluate the error
error = Z3 - outp
print("Error: " + str(abs(error.sum())))
# Backpropagates
dcost_dpred = error
dpred_dz = dsig(np.dot(Z2, self.W3))
z_delta = dcost_dpred * dpred_dz
self.W3 -= lr * np.dot(Z2.T, z_delta)
z_delta = np.dot(z_delta, self.W3.T)
self.W2 -= lr * (np.dot(Z1.T, z_delta) * dsig(np.dot(Z1, self.W2)))
z_delta = np.dot(z_delta, self.W2.T)
self.W1 -= lr * (np.dot(self.inputs.T, z_delta) * dsig(np.dot(self.inputs, self.W1)))
真的错了吗?如果是,我应该如何修复它?
解决方案
推荐阅读
- regex - 正则表达式从一组链接中过滤掉不包含产品关键字的链接
- docker - 找出哪些成员验证了 Hyperledger Fabric 中的交易
- mysql - SQL 从帖子中搜索#hashtag
- c# - IF语句中的多个条件如何
- oracle - Oracle Apex 5.1(如何在交互式报告的默认链接之外添加自定义链接)
- arrays - 随机播放一组不相等重复的条目,因此它们不会重复
- ios - Swift 4+ 实例化符合协议的类变量
- scala - 如何使用apache spark在mysql数据库中创建表
- swift - 'JSON 写入 (UIImage) 中的类型无效' Alamofire API 请求
- javascript - 为什么我在更新请求后总是收到“重复警报”错误?