PyTorch教程(十一):多输出的感知机以及梯度

上一节中介绍了单层感知机,感知机的输出节点只有一个,只有 O 0 O_0 O0没有 O 1 O_1 O1。对于单层感知机的梯度下降公式如下:
∂ E ∂ w j 0 = ( O 0 − t ) ∗ O 0 ( 1 − O 0 ) x j 0 \frac {\partial E}{\partial w_{j0}} = (O_0 -t)*O_0(1-O_0)x_j^0 wj0E=(O0t)O0(1O0)xj0
即对参数 w j 0 w_{j0} wj0的梯度。可以看出 w j 0 w_{j0} wj0的梯度跟这一层的输出权值以及 x j 0 x_{j0} xj0有关。

多层感知机模型

在这里插入图片描述
其中 x k 1 x_k^1 xk1表示第一层感知机的第k号节点, O k 1 O_k^1 Ok1表示经过激活函数后的数值, w j k 1 w_{jk}^1 wjk1表示上一层的第j个节点和对应这一层的第k个节点。

多层感知机梯度

E = 1 2 ∑ ( O i 1 − t i ) 2 当 k = i 时 , 才 有 意 义 , 因 此 ∂ E ∂ w j k = ( O k − t k ) ∂ O k ∂ w j k ∂ E ∂ w j k = ( O k − t k ) ∂ σ ( x k ) ∂ w j k ∂ E ∂ w j k = ( O k − t k ) σ ( x k ) ( 1 − σ x ( k ) ) ∂ x k 1 ∂ w j k ∂ E ∂ w j k = ( O k − t k ) O k ( 1 − O k ) x j 0 E = \frac {1}{2}\sum(O_i^1 - t_i)^2 \\ 当k=i时,才有意义,因此 \frac {\partial E}{\partial w_{jk}} = (O_k - t_k)\frac {\partial O_k}{\partial w_{jk}} \\ \frac {\partial E}{\partial w_{jk}} = (O_k - t_k)\frac {\partial \sigma(x_k)}{\partial w_{jk}} \\ \frac {\partial E}{\partial w_{jk}} =(O_k - t_k) \sigma (x_k)(1-\sigma x(k)) \frac {\partial x_k^1}{\partial w_{jk}} \\ \frac {\partial E}{\partial w_{jk}} =(O_k - t_k) O_k(1-O_k) x_j^0\\ E=21(Oi1ti)2k=iwjkE=(Oktk)wjkOkwjkE=(Oktk)wjkσ(xk)wjkE=(Oktk)σ(xk)(1σx(k))wjkxk1wjkE=(Oktk)Ok(1Ok)xj0

PyTorch实现

from torch.nn import functional as F

x = torch.randn(1,10)
w = torch.randn(2,10,requires_grad = True)
o = torch.sigmoid(x@w.t())
o.shape # torch.Size([1, 2])
loss = F.mse_loss(torch.ones(1,2),o) # tensor(0.1849, grad_fn=<MseLossBackward>)
loss.backward()
w.grad
# tensor([[ 0.1048,  0.0295,  0.0433,  0.0624,  0.0105, -0.0463,  0.0789, -0.0975,
#         -0.0250, -0.0553],
#        [ 0.1950,  0.0549,  0.0805,  0.1162,  0.0196, -0.0862,  0.1467, -0.1815,
#         -0.0464, -0.1029]])

其实多输出的感知机已经不能叫做感知机了,因为感知机的定义就是一个单一输出的。而多输出的感知机相当于标准全连接层的输出层。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值