TorchVision
提供了一些方便的函数和类,用于加载和预处理常见的图像数据集,如MNIST、CIFAR10、ImageNet等。它可以自动进行图像数据的下载、数据的分割和转换,以及数据集的加载和批处理。
MNIST:手写数据集。主要用于手写数字识别图像分类的任务,包括将图像分类为0到9中的一个数字。
import torchvision
train_set = torchvision.datasets.MNIST(root='../dataset/mnist',train=True,download=True)
test_set = torchvision.datasets.MNIST(root='../dataset/mnist',train=False,download=True)
train=True/False
表示是需要训练集还是测试集CIFAR10:CIFAR10数据集包含了一组彩色图像,分为十个类别,每个类别有6000个图像,主要用于图像分类任务,要求将图像分类为飞机、汽车、鸟类、猫、鹿、狗、青蛙、马、船和卡车这十个类别之一。
np.linspace
是Numpy库中的一个函数,用于在指定的间隔内生成均匀分布的数值。
import numpy as np
x=np.linspace(5,100,20) # 在5到100之间生成20个均匀分布的数值
print(x)
#output:[ 5. 10. 15. 20. 25. 30. 35. 40. 45. 50. 55. 60. 65. 70.
# 75. 80. 85. 90. 95. 100.]
torch.Tensor(x).view()
是将张量进行形状变换的操作,相当于numpy里面的reshape。
import torch
x = torch.tensor([[1, 2, 3], [4, 5, 6]]) # 创建一个2x3的张量
y = x.view(3, 2) # 将x进行形状变换,得到一个3x2的新张量
print(x)
print(y)
import matplotlib.pyplot as plt
plt.plot([0, 10], [0.5, 0.5], c='r')
# [0,10]表示经过的横坐标轴,[0.5,0.5]表示经过的纵坐标轴
# 可以看作x∈[0,10],y=0.5
plt.show()
分类问题与回归问题不同,输出的不再是实数而是一个概率,和我们概率论学的0-1分布类似。
公式如下:p{X=k}= p k p^{k} pk+ ( 1 − p ) 1 − k (1-p)^{1-k} (1−p)1−k
假设k=0为fail,k=1为pass,满足p{k=0}+p{k=1}=1
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[0], [0], [1]]) # 分别表示第0类,第一类
在PyTorch中处理二分类问题的一种常用方式是使用sigmoid激活函数和BCELoss损失函数。
设置一个激活函数将实数映射到0~1
BCELoss基于交叉熵损失(Cross Entropy Loss)的概念,适用于二分类问题,其中每个样本只能属于两个类别之一,通过最小化BCELoss损失值来调整模型的参数,使得结果不断精确。
它的计算方式如下:
import torch
import numpy as np
import matplotlib.pyplot as plt
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[0], [0], [1]])
class LogisticRegressionModel(torch.nn.Module):
def __init__(self):
super(LogisticRegressionModel, self).__init__()
self.linear = torch.nn.Linear(1, 1)
def forward(self, x):
y_pred = torch.sigmoid(self.linear(x))
return y_pred
model = LogisticRegressionModel()
criterion = torch.nn.BCELoss(reduction='sum')
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
for epoch in range(1000):
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
print(epoch, loss.item())
optimizer.zero_grad()
loss.backward()
optimizer.step()
x = np.linspace(0, 10, 200)
x_t = torch.Tensor(x).view((200, 1)) # 变成200×1的矩阵
y_t = model(x_t)
y = y_t.data.numpy() # 将y里面的数据拿出来
plt.plot(x, y)
plt.plot([0, 10], [0.5, 0.5], c='r')
plt.xlabel('Hours')
plt.ylabel('Probability of Pass')
plt.grid()
plt.show()