PyTorch实现求解XOR问题的MLP出现预测错误,请问原因是什么?
问题原因分析
你当前得到错误预测结果的核心原因是 forward前向传播逻辑写错了:你计算完第一层的ReLU激活值后,没有将激活后的结果传入第二层全连接层fc2,而是直接把第一层未经过激活的原始输出喂给了fc2,完全没有用到你定义的ReLU激活函数。
现有代码的输出推导
我们可以手动计算现有代码的计算逻辑,就能完全匹配你得到的输出结果:
- 第一层全连接
fc1的权重为[[1,1],[1,1]],偏置为[0,-1],对于任意输入[x1, x2],fc1的输出为:
node1 = 1*x1 + 1*x2 + 0 = x1 + x2 node2 = 1*x1 + 1*x2 + (-1) = x1 + x2 -1
- 你没有对上面的结果做ReLU激活,直接传入第二层
fc2,fc2的权重为[1,-2],偏置为0,最终输出为:
output = 1*node1 + (-2)*node2 = (x1+x2) - 2*(x1+x2 -1) = 2 - (x1 + x2)
- 代入四个测试输入计算结果和你给出的输出完全一致:
- 输入
[1,1]:2 - 2 = 0 - 输入
[0,0]:2 - 0 = 2 - 输入
[1,0]:2 - 1 = 1 - 输入
[0,1]:2 - 1 = 1
修复方法
只需要修改forward方法中fc2的输入为ReLU激活后的结果即可:
def forward(self, data): fc1 = self.fc1(data) activated = self.activation(fc1) # 把fc2的输入从fc1改成activated fc2 = self.fc2(activated) return fc2
修复后运行测试代码,得到的输出就是XOR的正确结果:
tensor([[0.], [0.], [1.], [1.]], grad_fn=<AddmmBackward>)
内容的提问来源于stack exchange,提问作者Cassie Liu
相关产品推荐
相关产品推荐

