PyTorch基础(part5)--交叉熵

网友投稿 220 2022-11-18

PyTorch基础(part5)--交叉熵

学习笔记,仅供参考,有错必纠

文章目录

​​原理​​​​代码​​

​​初始设置​​​​导包​​​​载入数据​​​​模型​​

原理

交叉熵(Cross-Entropy)

代码

初始设置

# 支持多行输出from IPython.core.interactiveshell import InteractiveShellInteractiveShell.ast_node_interactivity = 'all' #默认为'last'

导包

# 导入常用的包import numpy as npfrom torch import nn,optimfrom torch.autograd import Variablefrom torchvision import datasets, transformsfrom torch.utils.data import DataLoaderimport torch

载入数据

# 载入数据train_dataset = datasets.MNIST(root = './data/', # 载入的数据存放的位置 train = True, # 载入训练集数据 transform = transforms.ToTensor(), # 将载入进来的数据变成Tensor download = True) # 是否下载数据test_dataset = datasets.MNIST(root = './data/', # 载入的数据存放的位置 train = False, # 载入测试集数据 transform = transforms.ToTensor(), # 将载入进来的数据变成Tensor download = True) # 是否下载数据

# 批次大小batch_size = 64# 装载训练集train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)# 装载训练集test_loader = DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=True)

模型

# 定义网络结构class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.fc1 = nn.Linear(784,10) self.softmax = nn.Softmax(dim=1) def forward(self,x): # ([64, 1, 28, 28])->(64,784) x = x.view(x.size()[0], -1) x = self.fc1(x) x = self.softmax(x) return x

LR = 0.5# 定义模型model = Net()# 定义代价函数为交叉熵代价函数mse_loss = nn.CrossEntropyLoss()# 定义优化器optimizer = optim.SGD(model.parameters(), LR)

相比于PyTorch基础(part4)中的MSELoss(),这里我们改用CrossEntropyLoss().

同时,在下面的训练过程中,我们也不需要把标签该为独热编码的形式.

def train(): for i,data in enumerate(train_loader): # 获得一个批次的数据和标签 inputs, labels = data # 获得模型预测结果(64,10) out = model(inputs) # 计算loss,交叉熵代价函数out(batch,C), labels(batch) loss = mse_loss(out, labels) # 梯度清0 optimizer.zero_grad() # 计算梯度 loss.backward() # 修改权值 optimizer.step()def test(): correct = 0 for i,data in enumerate(test_loader): # 获得一个批次的数据和标签 inputs, labels = data # 获得模型预测结果(64,10) out = model(inputs) # 获得最大值,以及最大值所在的位置 _, predicted = torch.max(out, 1) # 预测正确的数量 correct += (predicted == labels).sum() print("Test acc:{0}".format(correct.item()/len(test_dataset)))

for epoch in range(10): print('epoch:',epoch) train() test()

epoch: 0Test acc:0.9064epoch: 1Test acc:0.9138epoch: 2Test acc:0.9172epoch: 3Test acc:0.9206epoch: 4Test acc:0.92epoch: 5Test acc:0.9215epoch: 6Test acc:0.9208epoch: 7Test acc:0.9243epoch: 8Test acc:0.9237epoch: 9Test acc:0.9237

对比上一篇blog中的训练准确率,在训练相同次数的情况下,使用交叉熵代价函数的效果会更好一些.

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:网络摄像机与模拟摄像机的区别对比以及光纤熔接的解决
下一篇:基于springboot与axios的整合问题
相关文章

 发表评论

暂时没有评论,来抢沙发吧~