多层感知机识别FashionMNIST数据集

一、什么是感知机?

在处理线性可分的二分类问题中 感知机随处可见,比如超过1.5m儿童购票,或者男生女生,都可以找到一个标准来准确的分类,在二维平面中,感知机就是一条一次函数,把平面中的样本分成2个类别。对于线性不可分的多分类问题,比我们可以用softmax或者多层感知机来判断属于每个类别的得分

二、多层感知机

多层感知机在单层神经网络的基础上引入了一到多个隐藏层(hidden layer)。隐藏层位于输入层和输出层之间。
在这里插入图片描述
可以看出,它与softmax的区别就是中间加了一层隐藏层,并且在每个隐藏层的输出,需要引入一个非线性激活函数(sigmoid, relu, tanh)用来防止模型塌陷
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.引入库和FashionMNIST数据集

import torch
import torchvision
import torchvision.transforms as transforms

train_data = torchvision.datasets.FashionMNIST(root='~/data',train=True,download=False,transform=transforms.ToTensor())
test_data = torchvision.datasets.FashionMNIST(root='~/data',train=False,download=False,transform=transforms.ToTensor())

在这里插入图片描述

2.设置参数,隐藏层单元设置为256

batch_size = 256
train_iter = torch.utils.data.DataLoader(train_data,batch_size,shuffle=True)
test_iter = torch.utils.data.DataLoader(test_data,batch_size,shuffle=False)

num_inputs, num_outputs, num_hiddens = 784, 10, 256

W1 = torch.normal(0, 0.01, (num_inputs, num_hiddens), dtype=torch.float,requires_grad=True)
b1 = torch.zeros(num_hiddens, dtype=torch.float,requires_grad=True)
W2 = torch.normal(0, 0.01, (num_hiddens, num_outputs), dtype=torch.float,requires_grad=True)
b2 = torch.zeros(num_outputs, dtype=torch.float,requires_grad=True)

3激活函数,损失函数,梯度下降,精确度,softmax函数

def relu(X):
    return torch.max(input=X, other=torch.tensor(0.0))

def cross_entropy(y_hat,y):
    return -torch.log(y_hat[range(len(y_hat)),y]) / len(y)

def linear(x,W1,W2,b1,b2):
    h = relu(torch.matmul(x.view(-1,num_inputs),W1)+b1)
    return torch.matmul(h.view(-1,num_hiddens),W2)+b2

def sgd(params,lr):
    with torch.no_grad():
        for param in params:
            param -= lr * param.grad
            param.grad.zero_()
        
def evaluate_accuracy(y_hat,y):
    return (y_hat.argmax(dim=1)==y).sum().item() 

def softmax(y):
    y_exp = y.exp()
    partirion = y_exp.sum(dim=1,keepdim=True)
    return y_exp / partirion

4训练效果

def Train(train_iter,test_iter,lr,w1,w2,b1,b2):
    for epoch in range(4):
        train_acc,test_acc, n=0.0,0.0, 0
        for x,y in train_iter:
            y_hat = linear(x,W1,W2,b1,b2)
            y_hat=softmax(y_hat)
            l=cross_entropy(y_hat,y).sum()
            l.backward()
            sgd([w1,w2,b1,b2],0.1)
            train_acc += evaluate_accuracy(y_hat,y)
            test_acc +=evaluate_accuracy(y_hat,y)
            n+=len(y)
        print('loss= %.4f, train_acc= %.4f  ,test_acc=%.4f' %(l.sum(),train_acc / n,test_acc / n))
Train(train_iter,test_iter,0.1,W1,W2,b1,b2)

在这里插入图片描述

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用Python实现Fashion-MNIST数据集多层感知机的示例代码[^1][^2]: ```python import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms # 定义多层感知机模型 class MLP(nn.Module): def __init__(self): super(MLP, self).__init__() self.fc1 = nn.Linear(28*28, 512) self.fc2 = nn.Linear(512, 9) def forward(self, x): x = x.view(-1, 28*28) x = torch.relu(self.fc1(x)) x = self.fc2(x) return x # 加载Fashion-MNIST数据集 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,)) ]) train_dataset = datasets.FashionMNIST(root='./data', train=True, transform=transform, download=True) test_dataset = datasets.FashionMNIST(root='./data', train=False, transform=transform) # 创建数据加载器 train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True) test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False) # 初始化模型、损失函数和优化器 model = MLP() criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) # 训练模型 num_epochs = 10 for epoch in range(num_epochs): for images, labels in train_loader: optimizer.zero_grad() outputs = model(images) loss = criterion(outputs, labels) loss.backward() optimizer.step() # 在测试集上评估模型 model.eval() correct = 0 total = 0 with torch.no_grad(): for images, labels in test_loader: outputs = model(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() accuracy = correct / total print('Accuracy: {:.2f}%'.format(accuracy * 100)) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lins H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值