Softmax函数解决分类问题(PyTorch)

目录

导入包

Softmax函数

交叉熵损失函数

​编辑 ​编辑

PyTorch实现

导入Fashion-mnist数据集 

小批量读数据

 定义神经网络模型

定义损失函数

选择随机梯度下降优化算法

训练


导入包

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
'''

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值