从零开始学Pytorch(四)之softmax与分类模型

更新时间:2023-07-09 12:11:51 阅读: 评论:0

从零开始学Pytorch (四)之softmax 与分类模型
softmax 的基本概念
分类问题
⼀个简单的图像分类问题,输⼊图像的⾼和宽均为2像素,⾊彩为灰度。
图像中的4像素分别记为。
假设真实标签为狗、猫或者鸡,这些标签对应的离散值为。
我们通常使⽤离散的数值来表⽰类别,例如。权重⽮量
神经⽹络图
下图⽤神经⽹络图描绘了上⾯的计算。softmax回归同线性回归⼀样,也是⼀个单层神经⽹络。由于每个输出的计算都要依赖于所有的输⼊
,softmax回归的输出层也是⼀个全连接层。
既然分类问题需要得到离散的预测输出,⼀个简单的办法是将输出值当作预测类别是的置信度,并将值最⼤的输出所对应的类作为预测输出,即输出 。例如,如果分别为,由于最⼤,那么预测类别为2,其代表猫。
输出问题
直接使⽤输出层的输出有两个问题:
1. ⼀⽅⾯,由于输出层的输出值的范围不确定,我们难以直观上判断这些值的意义。例如,刚才举的例⼦中的输出值10表⽰“很置信”图像类别为猫,因为该输出值是其他两类的输出值的100倍。但如果,那么输出值10却⼜表⽰图像类别为猫的概率很低。
2. 另⼀⽅⾯,由于真实标签是离散值,这些离散值与不确定范围的输出值之间的误差难以衡量。
softmax运算符(softmax operator)解决了以上两个问题。它通过下式将输出值变换成值为正且和为1的概率分布:
其中
x ,x ,x ,x 1234y ,y ,y 123y =11,y =22,y =33o 1=x w +x w +x w +x w +b 1112213314411
o 2=x w +x w +x w +x w +b 1122223324422
o 3=x w +x w +x w +x w +b 1132233334433
o ,o ,o 123x ,x ,x ,x 1234softmax 回归是⼀个单层神经⽹络
o i i o i arg max i o ,o ,o 1230.1,10,0.1o 2o =1o =3103,,=y ^1y ^2y ^3softmax(o ,o ,o )
123
容易看出且,因此是⼀个合法的概率分布。这时候,如果,不管和的值是多少,我们都知道图像类别为猫的概率是80%。此外,我们注意到因此softmax运算不改变预测类别输出。计算效率
单样本⽮量计算表达式
为了提⾼计算效率,我们可以将单样本分类通过⽮量计算来表达。在上⾯的图像分类问题中,假设softmax回归的权重和偏差参数分别为
设⾼和宽分别为2个像素的图像样本的特征为
输出层的输出为
预测为狗、猫或鸡的概率分布为
softmax回归对样本分类的⽮量计算表达式为
⼩批量⽮量计算表达式
为了进⼀步提升计算效率,我们通常对⼩批量数据做⽮量计算。⼴义上讲,给定⼀个⼩批量样本,其批量⼤⼩为,输⼊个数(特征数)为,输出个数(类别数)为。设批量特征为。假设softmax回归的权重和偏差参数分别为和。softmax回归的⽮量计算表达式为
1=y ^,2=exp(o )∑i =13i exp(o )1y ^,3=exp(o )∑i =13i exp(o )2y ^.
exp(o )∑i =13i exp(o )3+y
^1+y ^2=y ^310≤,,≤y ^1y ^2y ^31,,y ^1y ^2y ^3=y ^20.8y ^1y ^3o =i arg max i i arg max y ^i
W =,b =⎣⎢⎢⎡w 11w 21w 31w 41w 12w 22w 32w 42w 13w 23w 33w 43⎦⎥⎥⎤,
[b 1b 2b 3]i x =(i ),
[x 1(i )x 2(i )x 3(i )x 4(i )
]o =(i ),
火星时代vr视频教程[o 1(i )o 2(i )o 3(i )
]=y ^(i ).
[y ^1(i )y ^2(i )y ^3(i )]i o (i )y ^(i )=x W +b ,
(i )=softmax(o ).
(i )n d q X ∈R n ×d W ∈R d ×q b ∈R 1×q
其中的加法运算使⽤了⼴播机制,且这两个矩阵的第⾏分别为样本的输出和概率分布。交叉熵损失函数
对于样本,我们构造向量 ,使其第(样本类别的离散数值)个元素为1,其余为0。这样我们的训练⽬标可以设为使预测概
率分布尽可能接近真实的标签概率分布。平⽅损失估计然⽽,想要预测分类结果正确,我们其实并不需要预测概率完全等于标签概率。例如,在图像分类的例⼦⾥,如果,那么我们只需要⽐其他两个预测值和⼤就⾏了。即使值为0.6,不管其他两个预测值为多少,类别预测均正确。⽽平⽅损失则过于严格,例如⽐的损失要⼩很多,虽然两者都有同样正确的分类预测结果。改善上述问题的⼀个⽅法是使⽤更适合衡量两个概率分布差异的测量函数。其中,交叉熵(cross entropy)是⼀个常⽤的衡量⽅法:
其中带下标的是向量中⾮0即1的元素,需要注意将它与样本类别的离散数值,即不带下标的区分。在上式中,我们知道向量中只有第个元素为1,其余全为0,于是。也就是说,交叉熵只关⼼对正确类别的预测概率,因为只要其值⾜够⼤,就可以确保分类结果正确。当然,遇到⼀个样本有多个标签时,例如图像⾥含有不⽌⼀个物体时,我们并不能做这⼀步简化。但即便对于这种情况,交叉熵同样只关⼼对图像中出现的物体类别的预测概率。
假设训练数据集的样本数为,交叉熵损失函数定义为
其中代表模型参数。同样地,如果每个样本只有⼀个标签,那么交叉熵损失可以简写成。从另⼀个⾓度来看,我们知道最⼩化等价于最⼤化,即最⼩化交叉熵损失函数等价于最⼤化训练数据集所有标签类别的联合预测概率。模型训练与预测
获取Fashion-MNIST 训练集和读取数据
dark knight ris
在介绍softmax回归的实现前我们先引⼊⼀个多类图像分类数据集。它将在后⾯的章节中被多次使⽤,以⽅便我们观察⽐较算法之间在模型精度和计算效率上的区别。图像分类数据集中最常⽤的是⼿写数字识别数据集MNIST[1]。但⼤部分模型在MNIST上的分类精度都超过了95%。为了更直观地观察算法之间的差异,我们将使⽤⼀个图像内容更加复杂的数据集Fashion-MNIST[2]。
m我这⾥我们会使⽤torchvision包,它是服务于PyTorch深度学习框架的,主要⽤来构建计算机视觉模型。torchvision主要由以下⼏部分构成:
O Y
^=XW +b ,
=softmax(O ),O ,∈Y ^R n ×q i i o (i )y ^(i )
当然可以的英文i y ∈(i )R q y (i )i y
feist^(i )
y (i )Loss =∣−y ∣/2y
^(i )(i )2y =(i )3y
^3(i )y ^1(i )y ^2(i )y ^3(i )
=y
^1(i )=y ^2(i )0.2=y ^1(i )0,=y ^2(i )0.4H y ,=((i )
y ^(i ))−y log ,j =1∑q j (i )y ^j (i )
y j (i )
y (i )i y (i )y (i )
y (i )y y (i )(i )H (y ,)=(i )y ^(i )−log y ^y (i )(i )n ℓ(Θ)=H y ,,n 1i =1∑n
((i )y
^(i ))Θℓ(Θ)=
−(1/n )log ∑i =1n y ^y (i )(i )ℓ(Θ)exp(−n ℓ(Θ))=
∏i =1n y
^y (i )(i )
1. torchvision.datats: ⼀些加载数据的函数及常⽤的数据集接⼝;
2. dels: 包含常⽤的模型结构(含预训练模型),例如AlexNet、VGG、ResNet等;
3. ansforms: 常⽤的图⽚变换,例如裁剪、旋转等;
4. torchvision.utils: 其他的⼀些有⽤的⽅法。
%matplotlib inline
from IPython import display
import matplotlib.pyplot as plt
import torch
import torchvision
form a
ansforms as transforms
import time
import sys
sys.path.append("/home/input")
import d2lzh1981 as d2l
#获取数据
mnist_train = torchvision.datats.FashionMNIST(root='/home/input/FashionMNIST2065', train=True, download=True, transform=transforms.ToTensor()) mnist_test = torchvision.datats.FashionMNIST(root='/home/input/FashionMNIST2065', train=Fal, download=True, transform=transforms.ToTensor())
class torchvision.datats.FashionMNIST(root, train=True, transform=None, target_transform=None, download=Fal) root(string)– 数据集的根⽬录,其中存放procesd/training.pt和procesd/test.pt⽂件。
train(bool, 可选)– 如果设置为True,从training.pt创建数据集,否则从test.pt创建。
download(bool, 可选)– 如果设置为True,从互联⽹下载数据并放到root⽂件夹下。如果root⽬录下已经存在数据,不会再次下载。
transform(可被调⽤ , 可选)– ⼀种函数或变换,输⼊PIL图⽚,返回变换之后的数据。如:transforms.RandomCrop。
target_transform(可被调⽤ , 可选)– ⼀种函数或变换,输⼊⽬标,进⾏变换。
#显⽰结果
# show result
print(type(mnist_train))
print(len(mnist_train), len(mnist_test))
输出:<class ‘ist.FashionMNIST’>
60000 10000
# 我们可以通过下标来访问任意⼀个样本
fggfeature, label = mnist_train[0]
print(feature.shape, label)  # Channel x Height x Width
输出torch.Size([1, 28, 28]) 9
mnist_PIL = torchvision.datats.FashionMNIST(root='/home/kesci/input/FashionMNIST2065', train=True, download=True) PIL_feature, label = mnist_PIL[0]
# 本函数已保存在d2lzh包中⽅便以后使⽤
def get_fashion_mnist_labels(labels):
text_labels = ['t-shirt', 'trour', 'pullover', 'dress', 'coat',
forums'sandal', 'shirt', 'sneaker', 'bag', 'ankle boot']
return [text_labels[int(i)] for i in labels]
def show_fashion_mnist(images, labels):
d2l.u_svg_display()
# 这⾥的_表⽰我们忽略(不使⽤)的变量
_, figs = plt.subplots(1, len(images), figsize=(12, 12))
for f, img, lbl in zip(figs, images, labels):
f.imshow(im
g.view((28, 28)).numpy())
f.t_title(lbl)
_xaxis().t_visible(Fal)
_yaxis().t_visible(Fal)
plt.show()
X, y = [], []
for i in range(10):
X.append(mnist_train[i][0]) # 将第i个feature加到X中
y.append(mnist_train[i][1]) # 将第i个label加到y中
show_fashion_mnist(X, get_fashion_mnist_labels(y))
输出:
# 读取数据
batch_size = 256
num_workers = 4
train_iter = torch.utils.data.DataLoader(mnist_train, batch_size=batch_size, shuffle=True, num_workers=num_workers) test_iter = torch.utils.data.DataLoader(mnist_test, batch_size=batch_size, shuffle=Fal, num_workers=num_workers)
softmax从零开始的实现
import torch
import torchvision
import numpy as np
越来越不懂英文版
import sys
sys.path.append("/home/kesci/input")
import d2lzh1981 as d2l
#获取数据
batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, root='/home/input/FashionMNIST2065')
#模型参数初始化
num_inputs = 784
num_outputs = 10
W = sor(al(0, 0.01, (num_inputs, num_outputs)), dtype=torch.float)
b = s(num_outputs, dtype=torch.float)
输出:tensor([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], requires_grad=True)
对多维Tensor按维度操作

本文发布于:2023-07-09 12:11:51,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/171951.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:输出   预测   类别   数据   分类   样本
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图