试利用两层前馈神经网络(不含输入层)解决异或问题,要求在测试集上准确率100%。

试利用两层前馈神经网络(不含输入层)解决异或问题,要求在测试集上准确率100%。

问题分析:

“异或逻辑”,可用计算机语言表述为当输入值为就(0,0) ,(1, 1) ,(1,0) ,(0,1)时,期望输出分别为 0,0,1,1。

BP算法检测
先介绍几个符号代表的意思:(都是向量式)

X——输入值(数据项);Y——真实值(标签项)
V——输入层连接隐藏层的权重;W——隐藏层连接输出层的权重
L1——隐藏层的值(输入层的值X经过权重V作用后的输出值)
L2——预测值(隐藏层的值L1经过权重W作用后的输出值,也就是模型预测值)

实现步骤:

# -*- coding:utf-8 -*-
# -*- author:San丶Chen
# -*- 2020/12/22;
# -*- python3.7

import torch.nn as nn
import torch.optim as optim
import torch
from torch.autograd import Variable
import numpy as np

#
#
# pytorch
#
#
# 先定义训练数据
train_X = np.array([[1, 0], [1, 1], [0, 0], [0, 1]])
train_Y = np.array([[1], [0], [0], [1]])
# 准备数据
x = torch.from_numpy(train_X).type(torch.FloatTensor)
y = torch.from_numpy(train_Y).type(torch.FloatTensor)
print(x)
print(y)
x = Variable(x)
y = Variable(y)


# 模型
class BpNet(nn.Module):
    def __init__(self, n_input, n_hiden, n_output):
        super(BpNet, self).__init__()
        # 两层线性模型2-》3-》1
        self.hidden = nn.Linear(n_input, n_hiden)
        self.out = nn.Linear(n_hiden, n_output)

    def forward(self, x):
        # x = nn.functional.sigmoid(x)
        # x = self.hidden(x)
        # x = self.out(nn.functional.sigmoid(x))
        # 这里使用relu激活函数,没有使用sigmoid
        x = self.hidden(x)
        x = self.out(nn.functional.relu(x))
        return x


# 创建模型,两层神经网络
net = BpNet(n_input=2, n_hiden=3, n_output=1)
print(net)
# 损失函数
criterion = nn.MSELoss()
# 优化器
optimizer = optim.SGD(net.parameters(), lr=0.08)

# plt.ion()
for t in range(10000):
    out = net(x)
    loss = criterion(out, y)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    print(loss)
    print(out.size())
    print(y.size())
    print(out)
    print(y)

<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">

# 实验结果和分析:
BP算法的工作流程:

输入值X经过权重V的作用,再通过激活函数处理,得到隐藏层的输入值L1
同时L1也是隐藏层的输出值,L1经过权重W的作用,再经过激活函数处理,得到预测值L2
用梯度下降法计算输出层的误差改变量:真实值Y与预测值L2之间的误差与L2的负梯度相乘,得到输出层的误差改变量L2_delta
用梯度下降法计算隐藏层的误差改变量:用输出层的误差改变量L2_delta乘权重W再与L1的负梯度相乘,得到隐藏层的误差改变量L1_delta
各层误差改变量与学习率相乘,再与各层原有权重相加,得到更新后权重V_、W_
用更新后的权重V_、W_迭代计算,重复以上步骤,直到满足一定条件时,输出最后预测值


# 解决方案:



  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值