pytorch线性网络模型+Softftmax多分类问题

该博客介绍了使用PyTorch实现的softmax回归模型,用于解决Fashion-MNIST数据集上的多分类问题。模型包含一个全连接层,通过log_softmax激活函数确保输出的概率和为1。训练过程中应用了Adam优化器和交叉熵损失函数。博客还讨论了softmax函数在概率解释上的限制,并展示了训练过程中的损失函数变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码完整代码见页尾\tiny 完整代码见页尾

	# 定义网络
class Classifier_fashion(nn.Module):
	def __init__(self):
		super().__init__()
		self.layer1 = nn.Linear(784,256)
 
	def forward(self, x):
		x = x.view(x.shape[0],-1)
		x= F.log_softmax(self.layer1(x), dim=1)
		return x
		
model = Classifier_fashion()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(),lr=0.003)

for e in range(epochs):
	running_loss = 0
	for images, labels in trainloader:
		log_ps = model(images)
		loss = criterion(log_ps, labels)
		optimizer.zero_grad()
		loss.backward()
		optimizer.step()
		running_loss += loss.item()
		print("Trainning loss:{}".format(running_loss/len(trainloader)))

Softftmax多分类问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将线性层的输出直接视为概率时存在一些问题:一方面,没有限制这些数字的总和为1。另一方面,根据输入的不同,它们可以为负值。将线性层的输出直接视为概率时存在一些问题:\\一方面,没有限制这些数字的总和为1。\\另一方面,根据输入的不同,它们可以为负值。线1

在这里插入图片描述
尽管softmax是一个非线性函数,但softmax回归的输出仍然由输入特征的仿射变换决定。因此,softmax回归是一个线性模型。尽管softmax是一个非线性函数,但softmax回归的输出仍然由输入特征的仿射变换决定。\\因此,softmax回归是一个线性模型。softmax线softmax仿softmax线
在这里插入图片描述
在这里插入图片描述


Softftmax的实现

在这里插入图片描述

一张长和宽都为28,通道数为1,输入是一个向量,将图片拉成一个向量,会损失许多空间信息,这部分留给卷积神经网络处理。
在这里插入图片描述

Softmax操作:
矩阵的按轴求和
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


交叉熵损失:

细节:举例说明如何根据索引拿出样本的预测值
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
预测正确的概率为0.5
在这里插入图片描述
Accumulator的实现:
在这里插入图片描述

实现整个模型:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

SGD

在这里插入图片描述
结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#%%

# 加载Fashion-MNIST
import torch
import torchvision
from torch.utils import data
from torchvision import transforms
# import helper

# 下载数据并将所有数据转换为 𝐓𝐞𝐧𝐬𝐨𝐫 ,train为是否训练数据集,download默认网上下载
mnist_train = torchvision.datasets.FashionMNIST(root='~/Datasets/FashionMNIST', train=True, download=False, transform=transforms.ToTensor()) 
mnist_test = torchvision.datasets.FashionMNIST(root='~/Datasets/FashionMNIST', train=False, download=False, transform=transforms.ToTensor())

# 通过 𝐃𝐚𝐭𝐚𝐋𝐨𝐚𝐝𝐞𝐫 读取小批量数据样本,shuffle是否打乱顺序,num_workers为进程的个数
batch_size = 256 
trainloader = torch.utils.data.DataLoader(mnist_train, batch_size=256, shuffle=True, num_workers=1) 
testloader = torch.utils.data.DataLoader(mnist_test, batch_size=500*20, shuffle=False, num_workers=1)

#%%

# TODO: Define your network architecture here
from torch import nn, optim
import torch.nn.functional as F

class Classifier_fashion(nn.Module):
    def __init__(self):
        super().__init__()
        self.layer1 = nn.Linear(784,256)
    
    def forward(self, x):
        x = x.view(x.shape[0],-1)
        x = F.log_softmax(self.layer1(x), dim=1)
        return x


#%%

# TODO: Create the network, define the criterion and optimizer
model = Classifier_fashion()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(),lr=0.003)


#%%

# TODO: Train the network here
epochs = 5
batch_size = 10

for e in range(epochs):
    running_loss = 0
    for images, labels in trainloader:
        log_ps = model(images)
        loss = criterion(log_ps, labels)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
    print("Trainning loss:{}".format(running_loss/len(trainloader)))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值