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