多层感知机 MLP-pytorch实现


注:本文代码来自李沐书籍,这里只做代码解析

1.多层感知机理论

我们可以通过在⽹络中加⼊⼀个或多个隐藏层来克服线性模型的限制,使其能处理更普遍的函数关系类型。要做到这⼀点,最简单的⽅法是将许多全连接层堆叠在⼀起。每⼀层都输出到上⾯的层,直到⽣成最后的输出。我们可以把前L−1层看作表⽰,把最后⼀层看作线性预测器。这种架构通常称为多层感知机(multilayerperceptron),通常缩写为MLP。
在这里插入图片描述

2.多层感知机代码-pytorch-从零实现

2.1 代码

# -*- coding: utf-8 -*-
# @Project: zc
# @Author: zc
# @File name: MLP-FROM-SCRATCH
# @Create time: 2021/11/25 13:20

# 1.导入数据库
import torch
from torch import nn
from d2l import torch as d2l
import matplotlib.pyplot as plt

# 2.导入数据,输出迭代器 train_iter训练迭代器, test_iter测试迭代器
batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size=batch_size)

# 3.多层感知机 MLP
num_inputs, num_outputs, num_hiddens = 784, 10, 256

# 4. 多层感知机参数初始化,requires_grad=True 可以使得参数能更新
w1 = nn.Parameter(torch.randn(
	num_inputs, num_hiddens, requires_grad=True) * 0.01)
b1 = nn.Parameter(torch.zeros(
	num_hiddens, requires_grad=True))

w2 = nn.Parameter(torch.randn(
	num_hiddens, num_outputs, requires_grad=True) * 0.01)
b2 = nn.Parameter(torch.zeros(
	num_outputs, requires_grad=True))

params = [w1, b1, w2, b2]

# 5. 定义激活函数 relu
def relu(x):
	a = torch.zeros_like(x)
	return torch.max(x, a)

# 6. 定义模型 MLP,以我们使⽤reshape将每个⼆维图像转换为⼀个⻓度为num_inputs的向量
def net(x):
	x = x.reshape((-1, num_inputs))
	H = relu(x @ w1 + b1)
	return (H @ w2 + b2)


# 7.定义损失函数
loss = nn.CrossEntropyLoss()

# 8.定义超参数
num_epochs, lr = 10, 0.1

# 9.定义更新器,随机梯度下降
updater = torch.optim.SGD(params, lr)

# 10.训练模型
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, updater)

# 11.预测模型
d2l.predict_ch3(net,test_iter)

# 12.显示结果
plt.show()

2.2 运行结果

  • 训练
    在这里插入图片描述

  • 预测

在这里插入图片描述

3.多层感知机代码-pytorch-简洁实现

3.1 代码

# -*- coding: utf-8 -*-
# @Project: zc
# @Author: ZhangChu
# @File name: MLP-brief
# @Create time: 2021/11/25 15:08

# 1.导入数据库
import torch
from torch import nn
from d2l import torch as d2l
import matplotlib.pyplot as plt

# 2.导入数据,输出迭代器 train_iter训练迭代器, test_iter测试迭代器
batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)

# 3.多层感知机 MLP,调用 nn,Relu作为激活函数
net = nn.Sequential(
	nn.Flatten(),
	nn.Linear(784, 256),
	nn.ReLU(),
	nn.Linear(256, 10)
)

# 4.初始化模型参数
def init_weights(m):
	if type(m) == nn.Linear:
		nn.init.normal_(m.weight, std=0.01)

net.apply(init_weights)

# 5.定义损失函数
loss = nn.CrossEntropyLoss()

# 6.定义更新器,随机梯度下降 SGD,设置超参数 学习率 lr=0.1,训练次数 num_epochs=10
trainer = torch.optim.SGD(net.parameters(), lr=0.1)
num_epochs = 10

# 7. 开始训练模型
d2l.train_ch3(net,train_iter,test_iter,loss,num_epochs,updater=trainer)

# 8. 开始模型预测
d2l.predict_ch3(net,test_iter)

# 9.显示相关结果
plt.show()

3.2 运行结果

  • 训练
    在这里插入图片描述

  • 预测
    在这里插入图片描述

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 多层感知机(Multilayer Perceptron,简称MLP)是一种最基本的前馈神经网络模型,在PyTorch中可以很方便地实现。 首先,我们需要导入PyTorch库,并设置模型的超参数,如输入特征的维度(input_size)、隐藏层的维度(hidden_size)、输出层的维度(output_size)、学习率(learning_rate)等。 接下来,我们可以定义一个MLP类,继承自PyTorch中的nn.Module父类。在MLP类的构造函数中,我们定义了输入层、隐藏层和输出层的全连接层,并使用nn.ReLU作为激活函数。 然后,我们可以实现MLP类的前向传播函数forward。在forward函数中,我们将输入数据通过隐藏层和激活函数进行计算,并将结果传递到输出层,得到预测值。 接下来,我们可以定义训练函数。在训练函数中,我们首先将输入数据和标签转换为PyTorch的张量类型,并将其传递给MLP模型进行前向传播,得到预测值。然后,我们使用PyTorch提供的均方误差损失函数计算预测值与真实值之间的误差,并利用反向传播算法调整模型的参数。 最后,我们可以定义测试函数。在测试函数中,我们首先将输入数据转换为PyTorch的张量类型,并将其传递给MLP模型进行前向传播,得到预测值。然后,我们可以打印预测值并与真实值进行比较,评估模型的性能。 在主函数中,我们可以创建MLP模型实例,并调用训练函数和测试函数来训练和测试模型。 总结来说,用PyTorch实现简单的多层感知机MLP)需要定义一个MLP类,并在其中定义前向传播函数和训练函数,然后在主函数中创建模型实例并调用训练和测试函数。通过不断优化模型参数,我们可以提高模型的性能和准确率。 ### 回答2: 多层感知机(Multi-Layer Perceptron,简称MLP)是一种基本的人工神经网络模型,在PyTorch中可以很方便地实现。 首先,我们需要导入PyTorch库: ```python import torch import torch.nn as nn ``` 接下来,我们定义一个MLP类,并继承自nn.Module: ```python class MLP(nn.Module): def __init__(self, input_dim, hidden_dim, output_dim): super(MLP, self).__init__() self.hidden_layer = nn.Linear(input_dim, hidden_dim) self.output_layer = nn.Linear(hidden_dim, output_dim) def forward(self, x): x = torch.relu(self.hidden_layer(x)) x = self.output_layer(x) return x ``` MLP类初始化方法中,我们传入了输入维度、隐藏层维度和输出维度作为参数。然后,我们在初始化方法中定义了一个隐藏层和一个输出层,它们都是线性变换层(Linear)。 在forward方法中,我们使用ReLU作为激活函数对隐藏层进行非线性变换,并将隐藏层的输出作为输入传给输出层。 接下来,我们可以实例化一个MLP模型并定义输入和输出的维度: ```python input_dim = 784 # 输入维度为28x28 hidden_dim = 256 # 隐藏层维度为256 output_dim = 10 # 输出维度为10,对应10个类别 model = MLP(input_dim, hidden_dim, output_dim) ``` 然后,我们可以使用该模型进行前向传播计算,并得到输出: ```python input = torch.randn(64, input_dim) # 随机生成输入数据,batch_size为64 output = model(input) ``` 最后,我们可以通过定义损失函数和优化器来训练MLP模型: ```python criterion = nn.CrossEntropyLoss() # 定义交叉熵损失函数 optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # 定义随机梯度下降优化器 # 训练循环 for epoch in range(num_epochs): optimizer.zero_grad() # 梯度清零 output = model(input) # 前向传播 loss = criterion(output, target) # 计算损失 loss.backward() # 反向传播 optimizer.step() # 更新参数 ``` 通过以上步骤,我们就可以使用PyTorch实现一个简单的多层感知机MLP)模型。 ### 回答3: 多层感知机(Multilayer Perceptron,MLP)是一种经典的神经网络模型,其在PyTorch中的实现相对简单。 首先,在PyTorch中,我们可以使用`torch.nn`工具包来构建多层感知机。这个工具包提供了各种用于构建神经网络层的函数和类。 要实现一个简单的多层感知机模型,我们首先需要定义一个继承自`torch.nn.Module`的类。在这个类中,我们通过定义不同的层来构建我们的神经网络结构。 接下来,我们需要在类的构造函数中定义我们的网络结构。我们可以使用`torch.nn.Linear`类来创建全连接层,它的输入参数是输入特征的维度和输出特征的维度。 然后,在类的前向传播函数`forward`中,我们需要定义数据在网络中的前向流动过程。我们可以使用不同的激活函数(例如`torch.nn.ReLU`)和池化函数(如`torch.nn.MaxPool2d`)来增加网络的非线性能力。 接下来,我们需要定义模型的损失函数和优化器。PyTorch提供了各种损失函数(如均方误差损失函数`torch.nn.MSELoss`)和各种优化器(如随机梯度下降`torch.optim.SGD`)。 在训练过程中,我们需要遍历数据集,并将数据输入到模型中进行前向传播和反向传播。在每个批次的训练中,我们需要计算损失函数,并使用优化器来更新模型的参数。 最后,我们可以通过将输入数据传递给训练好的模型,利用模型的`forward`函数来进行预测。 总结来说,通过PyTorch实现简单的多层感知机,我们需要定义网络结构,选择合适的损失函数和优化器,并使用训练数据来更新模型的参数,从而实现对输入数据的预测。多层感知机PyTorch中的实现相对简单,同时PyTorch也提供了丰富的工具和函数来支持神经网络的构建和训练。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值