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

代码 完 整 代 码 见 页 尾 \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

在这里插入图片描述
尽 管 s o f t m a x 是 一 个 非 线 性 函 数 , 但 s o f t m a x 回 归 的 输 出 仍 然 由 输 入 特 征 的 仿 射 变 换 决 定 。 因 此 , s o f t m a x 回 归 是 一 个 线 性 模 型 。 尽管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)))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值