PyTorch学习笔记|从异或问题到深层神经网络

异或问题解决

神经网络之所以沉寂了几十年,就是有大佬说神经网络解决不了异或问题,当然现在神经网络这么火,就说明这个问题已经被解决,那今天我们就来了解这一段莫欺少年穷的戏码。

说异或之前,我们再看看还有哪些其他的逻辑运算,以及如何用pytorch来实现。

  • 与运算
x0 x1 x2 z
1 0 0 0
1 1 0 0
1 0 1 0
1 1 1 1
go 复制代码
import torch

X = torch.tensor([[1,0,0],[1,1,0],[1,0,1],[1,1,1]], dtype = torch.float32)
w = torch.tensor([-0.2, 0.15, 0.15])
z = torch.tensor([0., 0, 0, 1])

def Linear(X, w):
    zhat = torch.mv(X, w)
    return zhat

zhat = Linear(X,w)
sigma = torch.sigmoid(zhat)
andhat = torch.tensor([int(x) for x in sigma >= 0.5],dtype = torch.float32)
print(andhat)

#tensor([0., 0., 0., 1.])
  • 或运算
x0 x1 x2 z
1 0 0 0
1 1 0 1
1 0 1 1
1 1 1 1
  • 非与运算
x0 x1 x2 z
1 0 0 1
1 1 0 1
1 0 1 1
1 1 1 0

大家可以试试看怎么实现上面的逻辑运算。最后我们再来看看异或运算。

  • 异或运算
x0 x1 x2 z
1 0 0 0
1 1 0 1
1 0 1 1
1 1 1 0

我们用图来看一下,当我们只用一层神经网络的时候,无非就是找一个直线把数据两分,但是异或我们没办法用直线切分。

那我们就加一层神经网络看看能不能解决。

go 复制代码
X = torch.tensor([[1,0,0],[1,1,0],[1,0,1],[1,1,1]],dtype=torch.float32)

def AND(X):
    w = torch.tensor([-0.2,0.15, 0.15], dtype = torch.float32)
    zhat = torch.mv(X,w)
    andhat = torch.tensor([int(x) for x in zhat >= 0],dtype=torch.float32)
    return andhat

def OR(X):
    w = torch.tensor([-0.08, 0.15,0.15], dtype = torch.float32)
    zhat = torch.mv(X,w)
    yhat = torch.tensor([int(x) for x in zhat > 0], dtype=torch.float32)
    return yhat

def NAND(X):
    w = torch.tensor([0.23,-0.15,-0.15], dtype = torch.float32) #和与门、或门都不同的权重
    zhat = torch.mv(X,w)
    yhat = torch.tensor([int(x) for x in zhat >= 0],dtype=torch.float32)
    return yhat

sigma_nand = NAND(X)
sigma_or = OR(X)
x0 = torch.tensor([1,1,1,1], dtype=torch.float32)
input_2 = torch.cat((x0.view(4,1),sigma_nand.view(4,1),sigma_or.view(4,1)),dim=1)
print(AND(input_2))

# tensor([0., 1., 1., 0.])

再看激活函数

那我们能认为只要层数加的越多,神经网络就很好用吗,答案是否定的,因为其实神经网络都是线性变换,所以一定要加上激活函数。激活函数一般都是非线性函数,它出现在神经网络中除了输入层以外的每层的每个神经元上。上文我们已经介绍了sigmoid、sign、ReLU,tanh,softmax等激活函数,我个人认为是多层+激活才是神经网络如此成功的秘籍。

更进一步

接下来,我们就用pytorch来实现多层神经网络的正向传播过程,假设我们有500条数据,20个特征,标签为3分类。我们现在要实现一个三层神经网络,这个神经网络的架构如下:第一层有13个神经元,第二层有8个神经元,第三层是输出层。其中,第一层的激活函数是relu,第二层是sigmoid。

go 复制代码
import torch
import torch.nn as nn
import torch.nn.functional as F

torch.manual_seed(520) # 设置随机数种子
x = torch.rand((500,20), dtype=torch.float32)
y = torch.randint(low=0, high=3,size=(500, 1),dtype=torch.float32)

#继承nn.Modules类来定义神经网路的架构
class Model(nn.Module):
    def __init__(self, in_features=10, out_features=2):
        super(Model,self).__init__()
        self.linear1 = nn.Linear(in_features,13)
        self.linear2 = nn.Linear(13,8)
        self.output = nn.Linear(8,out_features)

    def forward(self, x):
        z1 = self.linear1(x)
        sigma1 = torch.relu(z1)
        z2 = self.linear2(sigma1)
        sigma2 = torch.sigmoid(z2)
        z3 = self.output(sigma2)
        sigma3 = F.softmax(z3, dim=1)
        return sigma3

input_ = x.shape[1] #特征数
output_ = len(y.unique()) #分类数

net = Model(in_features=input_, out_features=output_)
print(net(x).shape)

# torch.Size([500, 3])
相关推荐
m0_564876843 小时前
提示词工程手册学习
人工智能·python·深度学习·学习
Century_Dragon3 小时前
世纪龙-从爆炸图到原理动画:让环境感知系统在课堂上“活”起来
学习
阿荻在肝了3 小时前
Agent学习二:智能体(Agent)开发核心原理
学习
少许极端3 小时前
算法奇妙屋(四十)-贪心算法学习之路7
java·学习·算法·贪心算法
AI精钢3 小时前
谷歌时隔一年发布“更加开源“的 Gemma 4,意图何为?
人工智能·云原生·开源·aigc
FakeOccupational3 小时前
【电路笔记 通信】8B_10B编码 高速数据传输的串行数据编码技术 论文流程对应实现(简化版本,仅编码数值)
笔记
洞见新研社3 小时前
从算力到电力,谁在搭建AI时代的“能源基座”?
人工智能·能源
忙什么果3 小时前
Mamba学习笔记2:Mamba模型
android·笔记·学习
小程故事多_803 小时前
自然语言智能体控制框架,重塑AI Agent的协作与执行范式
人工智能·架构·aigc·ai编程·harness
悠哉悠哉愿意3 小时前
【物联网学习笔记】ADC
笔记·单片机·嵌入式硬件·物联网·学习