Perceptron

原理

简单的感知机可以看作一个二分类,假定我们的公式为

f(x) = sign(w *x + b)

我们把 -b 做为一个标准,w* x 的结果与 -b 这个标准比较,

w*x > -b, f(x) = +1

w *x < -b, f(x) = -1

不难看出w是超平面的法向量,超平面上的向量与w的数量积为0。因此这个超平面就可以很好的区分我们的数据集。

而感知机就是来寻找w和b


优化方法

优化方法我们现有的方法比较多,诸如GD、SGD、Minibatch、Adam

当然我们的损失函数也包含多种,常见的有MSE, CrossEntropy.

这边简单展示一下MSE以及GD原理。


SoftMax

如果我们输出为多分类,那就成为一个SoftMax回归。

SoftMax回归和线性回归一样将输入特征与权重做线性叠加。与线性回归的一个主要不同在于,SoftMax回归的输出值个数等于标签里的类别数。


MLP

而我们给SoftMax回归增加隐藏层,就是我们所说的多层感知机,而

全连接层只是对数据做仿射变换,我们的方法是引入非线性变换,就是激活函数。


代码实现

这边选用CIFAR10数据集来做演示。CIFAR10包含10个类别,每个类别600张32x32的彩色图像。

1.导入依赖包

1
2
3
4
5
6
7
import torch
import torchvision
from torch import nn
from d2l import torch as d2l
import os
import matplotlib.pyplot as plt
import torchvision.transforms as transforms

2.加载数据集

这边对图片进行归一化处理。

1
2
3
4
5
6
7
8
9
10
11
transform = transforms.Compose(
[transforms.ToTensor(),
transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))]
)
train_data = torchvision.datasets.CIFAR10(root="data",download=True,train=True,transform=transform)
train_loader = torch.utils.data.DataLoader(train_data, batch_size=4,
shuffle=True, num_workers=8)

val_data = torchvision.datasets.CIFAR10(root="data",download=True,train=False,transform=transform)
val_loader = torch.utils.data.DataLoader(val_data, batch_size=4,
shuffle=True, num_workers=8)

3.定义模型及参数

用Sequential快速构建,对数据进行展平处理输入尺寸为图片尺寸 x 通道数,输出10分类,hidden layer设置为512。

1
2
3
4
5
6
net = nn.Sequential(
nn.Flatten(),
nn.Linear(1024*3, 512),
nn.ReLU(),
nn.Linear(512,10)
)

4.训练

损失计算选用交叉熵函数,优化器选用SGD,调用显卡运行。

1
2
3
4
5
6
loss = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(net.parameters(), lr = 0.01)
epochs = 30

device = "cuda:0"
train(net,train_loader,val_loader,epochs,optimizer,loss,device)


结果

可以看出我们的验证准确值过低,这主要是因为数据集特征不明显,我们在更换数据集验证。

更换数据集

选用7分类的海贼王图片进行训练,可以看出训练结果明显优于CIFAR数据集。

同时我们再挑选一张不在训练集的图片进行验证,发现结果正确。