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.导入依赖包
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.加载数据集
这边对图片进行归一化处理。
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。
net = nn.Sequential(
nn.Flatten(),
nn.Linear(1024*3, 512),
nn.ReLU(),
nn.Linear(512,10)
)
4.训练
损失计算选用交叉熵函数,优化器选用SGD,调用显卡运行。
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)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XrRdwV5J-1645528506210)(https://z3.ax1x.com/2021/10/26/5I1IN8.jpg)]
结果
可以看出我们的验证准确值过低,这主要是因为数据集特征不明显,我们在更换数据集验证。
更换数据集
选用7分类的海贼王图片进行训练,可以看出训练结果明显优于CIFAR数据集。
同时我们再挑选一张不在训练集的图片进行验证,发现结果正确。