目录
导入包
import torch
from torch.nn.modules.flatten import Flatten
from torch.nn.modules.loss import CrossEntropyLoss
import torchvision
from torchvision import transforms
from torch.utils import data
from torch import nn
Softmax函数
交叉熵损失函数
y为样本的真实标记,可理解为yk是属于类别k的概率
交叉熵损失只与真实类别对应的概率预测有关(其他类别的概率预测与0相乘为0)
PyTorch实现
导入Fashion-mnist数据集
trains = transforms.ToTensor()# 创建一个对象,将图片转化为Tensor数据
train_data = torchvision.datasets.FashionMNIST(root='D:\\PZL\\vscode\\python', train=True, transform=trains, download=True)# 下载Fashion-MNIST数据集到内存中
test_data = torchvision.datasets.FashionMNIST(root='D:\\PZL\\vscode\\python', train=False, transform=trains, download=True)
Fashion-MNIST数据集:
训练集60000张,测试机10000张,然后取mnist_test[0]后,是一个元组(tensor,layer),
mnist_test[0][0]
代表的是这个数据的tensor,然后mnist_test[0][1]
代表的是这个数据的label共分为十大类
小批量读数据
#读数据
train_iter = data.DataLoader(train_data, batch_size=256, shuffle=True)
test_iter = data.DataLoader(test_data, batch_size=256, shuffle=True)
定义神经网络模型
#定义神经网络模型
net = nn.Sequential(nn.Flatten(), nn.Linear(784,10))# 有两层,第一层为展平层,第二层为输入784,输出10的线性层
#初始化神经网络的参数
def init_weights(m):# m为神经网络里的layer
if type(m) == nn.Linear:
nn.init.normal_(m.weights, std=0.01)# 权重初始化平均值为0,方差为0.01的正态分布,默认平均值为0
net.apply(init_weights)# 神经网络里的每一层都调用这个函数
展平层(将图片Tensor数据预处理):
将一个多维数组转化为一个一维向量
例如[[1,2,3],
[4,5,6]] ----> [1,2,3,4,5,6]
此处因为每张图片大小都是28*28,所以输入为784
定义损失函数
#定义损失函数,选择交叉熵误差作为损失函数
loss = nn.CrossEntropyLoss()
选择随机梯度下降优化算法
#定义优化算法
trainer = torch.optim.SGD(net.parameters(), lr=0.1)
训练
#训练
num_epochs = 10
for epoch in range(num_epochs):
for data, target in train_iter:# data是size(256*28*28), taget是size(256)对应每个图片的label,两个都是tensor数据类型
l = loss(torch.softmax(net(data),dim=1), target)# 对y hat进行softmax函数处理
trainer.zero_grad()
l.backward()
trainer.step()
test_input = torch.tensor([x[0].tolist() for x in test_data])# 读出来的是tensor,先转化为list,再转回tensor
test_output = torch.tensor([x[1] for x in test_data])
print('epoch:{} loss:{}'.format(epoch, loss(torch.softmax(net(test_input),dim=1),test_output)))
'''
torch.Size([10000, 1, 28, 28])# test_input的Size
epoch:0 loss:1.8513894081115723
torch.Size([10000, 1, 28, 28])
epoch:1 loss:1.8096369504928589
torch.Size([10000, 1, 28, 28])
epoch:2 loss:1.7758651971817017
torch.Size([10000, 1, 28, 28])
epoch:3 loss:1.7536780834197998
torch.Size([10000, 1, 28, 28])
epoch:4 loss:1.7410537004470825
torch.Size([10000, 1, 28, 28])
epoch:5 loss:1.7323821783065796
torch.Size([10000, 1, 28, 28])
epoch:6 loss:1.7255982160568237
torch.Size([10000, 1, 28, 28])
epoch:7 loss:1.7203470468521118
torch.Size([10000, 1, 28, 28])
epoch:8 loss:1.7158622741699219
torch.Size([10000, 1, 28, 28])
epoch:9 loss:1.7123475074768066
'''