pytorch学习——多层感知机

一.感知机

        感知机——神经网络基本单元,最简单的深度网络称为多层感知机。多层感知机由多层神经元组成,每一层与它上一层相连,从中接收输入, 同时每一层也与它的下一层相连,影响当前层的神经元。

 

 解释:如果正确分类,-y<W,X>小于0,即该分类点对应的损失函数的值为0;如果错误分类,则-y<W,X>大于等于0,并进入梯度下降算法的计算。

 示例:以下图中猫狗分类为例,其中黑线表示区分猫和狗的轴

 当输入一直新的狗时,原来的线会导致分类错误,得更新

 

 收敛定理:什么时候能够停止?

 r指数据大小

感知机存在的问题:不能拟合异或问题——不能通过线性完成此问题的分类

 感知机的局限性就在于它只能表示由一条直线分割的空间。图8这样弯曲的曲线无法用感知机表示。另外,由下图这样的曲线分割而成的空间称为非线性空间。

 总结:

1.感知机是一个二分类模型,是最早的AI模型之一

2.它的求解算法等价于使用批量大小为1的梯度下降

3.不能拟合异或函数(XOR)函数

二、感知机的实现

2.1简单感知机的实现

        先定义一个接收参数x1和x2的AND函数。(实现与门)

def AND(x1, x2):
	w1, w2, theta = 0.5, 0.5, 0.7
	tmp = x1*w1 + x2*w2
	if tmp <= theta:
		return 0
	elif tmp > theta:
		return 1

        在函数内初始化参数w1、 w2、 theta,当输入的加权总和超过阈值时返回1,否则返回0。我们来确认一下输出结果是否如图2 与门真值表所示。测试结果如下所示:

AND(0, 0) # 输出0
AND(1, 0) # 输出0
AND(0, 1) # 输出0
AND(1, 1) # 输出1

2.2导入权重和偏置

     b称为偏置, w1和w2称为权重

 实现与门

def AND(x1, x2):
	x = np.array([x1, x2])
	w = np.array([0.5, 0.5])
	b = -0.7
	tmp = np.sum(w*x) + b
	if tmp <= 0:
		return 0
	else:
		return 1

类似,可以继续实现或门和非门

def NAND(x1, x2):
	x = np.array([x1, x2])
	w = np.array([-0.5, -0.5]) # 仅权重和偏置与AND不同!
	b = 0.7
	tmp = np.sum(w*x) + b
	if tmp <= 0:
		return 0
	else:
		return 1
		
def OR(x1, x2):
	x = np.array([x1, x2])
	w = np.array([0.5, 0.5]) # 仅权重和偏置与AND不同!
	b = -0.2
	tmp = np.sum(w*x) + b
	if tmp <= 0:
		return 0
	else:
		return 1

三.多层感知机

        可以解决单层感知机不能实现异或的问题,例如,可以通过蓝色线分类的结果乘以黄色线分类结果来实现异或

 

 输入输出都是固定的,唯一能做的就是设置隐藏层大小

 这个多层感知机有4个输入,3个输出,其隐藏层包含5个隐藏单元。 输入层不涉及任何计算,因此使用此网络产生输出只需要实现隐藏层和输出层的计算。 因此,这个多层感知机中的层数为2。 注意,这两个层都是全连接的。 每个输入都会影响隐藏层中的每个神经元, 而隐藏层中的每个神经元又会影响输出层中的每个神经元。

 因为不加非线性层的话,输出还是线性函数(仍然不能解决XOR),还是相当于单层

四.激活函数

        激活函数(activation function)通过计算加权和并加上偏置来确定神经元是否应该被激活, 它们将输入信号转换为输出的可微运算。 大多数激活函数都是非线性的。 由于激活函数是深度学习的基础,下面简要介绍一些常见的激活函数。

4.1Relu函数

 

x = torch.arange(-8.0, 8.0, 0.1, requires_grad=True)
y = torch.relu(x)
d2l.plot(x.detach(), y.detach(), 'x', 'relu(x)', figsize=(5, 2.5))

         当输入为负时,ReLU函数的导数为0,而当输入为正时,ReLU函数的导数为1。 注意,当输入值精确等于0时,ReLU函数不可导。 在此时,我们默认使用左侧的导数,即当输入为0时导数为0。 我们可以忽略这种情况,因为输入可能永远都不会是0。  下面我们绘制ReLU函数的导数。

y.backward(torch.ones_like(x), retain_graph=True)
d2l.plot(x.detach(), x.grad, 'x', 'grad of relu', figsize=(5, 2.5))

 4.2sigmoid函数

 下面,我们绘制sigmoid函数。 注意,当输入接近0时,sigmoid函数接近线性变换。

y = torch.sigmoid(x)
d2l.plot(x.detach(), y.detach(), 'x', 'sigmoid(x)', figsize=(5, 2.5))

 sigmoid函数的导数图像如下所示。 注意,当输入为0时,sigmoid函数的导数达到最大值0.25; 而输入在任一方向上越远离0点时,导数越接近0。

# 清除以前的梯度
x.grad.data.zero_()
y.backward(torch.ones_like(x),retain_graph=True)
d2l.plot(x.detach(), x.grad, 'x', 'grad of sigmoid', figsize=(5, 2.5))

多层感知机和softmax的区别就是加一个非线性层 

 五.总结

1.多层感知机使用隐藏层和激活函数来得到非线性模型

2.常用激活函数——sigmoid,Relu,Tanh

3.使用softmax来处理多类分类

4.超参数为隐藏层数,和各个隐藏层的大小

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
多层感知机(Multilayer Perceptron,MLP)是一种深度学习模型,它是在单神经网络的基础上添加了一个或多个隐藏的神经网络。在PyTorch中,可以使用torch.nn模块来构建多层感知机模型。以下是构建一个简单的多层感知机模型的步骤: 1. 导入所需的库: ``` import torch from torch import nn ``` 2. 定义多层感知机模型类: ``` class MLP(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(MLP, self).__init__() self.fc1 = nn.Linear(input_size, hidden_size) self.relu = nn.ReLU() self.fc2 = nn.Linear(hidden_size, output_size) def forward(self, x): x = self.fc1(x) x = self.relu(x) x = self.fc2(x) return x ``` 这个模型有一个输入(input_size)、一个隐藏(hidden_size)和一个输出(output_size)。在模型的构造函中,使用nn.Linear定义了两个全连接,使用nn.ReLU作为激活函。 3. 实例化模型: ``` input_size = 784 # 输入特征的大小 hidden_size = 128 # 隐藏大小 output_size = 10 # 输出的类别 model = MLP(input_size, hidden_size, output_size) ``` 4. 定义损失函和优化器: ``` criterion = nn.CrossEntropyLoss() # 分类任务常用的交叉熵损失函 optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # 使用随机梯度下降优化器 ``` 5. 训练模型: ``` # 假设有训练数据集train_loader for images, labels in train_loader: # 将据转换为模型所需的张量形式 images = images.view(-1, 28*28) labels = labels # 前向传播 outputs = model(images) # 计算损失 loss = criterion(outputs, labels) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() ``` 以上是使用PyTorch实现多层感知机的基本步骤。根据具体的任务和数据集,你可以调整模型的结构、超参和优化策略来提高模型性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小百里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值