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

被折叠的 条评论
为什么被折叠?



