动手学深度学习--softmax回归和MLP的pytorch实现

目录

softmax从零开始实现

导包

导入数据

初始化模型参数

定义softmax操作

定义模型

损失函数

 优化函数

分类精度

训练函数

训练

 预测

softmax简洁实现

初始化模型参数

Softmax的实现

优化算法

训练

多层感知机的从零开始实现

初始化模型参数

激活函数

模型

训练评估

多层感知机的简洁实现


不难,但是一些实现方法比较有特色

softmax从零开始实现

导包

import torch
from torch import nn
import numpy as np
from IPython import display
import torchvision.transforms as transforms
import torchvision
from torch.utils import data
import sys

导入数据

def load_data_fashion_mnist(batch_size, resize=None):
    """Download the Fashion-MNIST dataset and then load it into memory.

    Defined in :numref:`sec_fashion_mnist`"""
    trans = [transforms.ToTensor()]
    if resize:
        trans.insert(0, transforms.Resize(resize))
    trans = transforms.Compose(trans)
    mnist_train = torchvision.datasets.FashionMNIST(
        root="../data", train=True, transform=trans, download=True)
    mnist_test = torchvision.datasets.FashionMNIST(
        root="../data", train=False, transform=trans, download=True)
    return (data.DataLoader(mnist_train, batch_size, shuffle=True,
                            num_workers=get_dataloader_workers()),
            data.DataLoader(mnist_test, batch_size, shuffle=False,
                            num_workers=get_dataloader_workers()))


def get_dataloader_workers():
    """Use 4 or 0 processes to read the data.
    """
    return 0 if sys.platform.startswith('win') else 4


batch_size = 256
train_iter, test_iter = load_data_fashion_mnist(batch_size)

初始化模型参数

展平每个图像,把它们看作长度为784的向量

num_inputs = 784
num_outputs = 10

W = torch.normal(0, 0.01, size=(num_inputs, num_outputs), requires_grad=True)
b = torch.zeros(num_outputs, requires_grad=True)

定义softmax操作

def softmax(X):
    # X_max = X.max(axis=1)[0].reshape(-1, 1)
    X_max = torch.max(X, axis=1)[0].reshape(-1, 1)
    X -= X_max
    X_exp = torch.exp(X)
    partition = X_exp.sum(1, keepdim=True)
    return X_exp / partition  # 这里应用了广播机制

定义模型

w形状:特征数 * 目标类别数

def net(X):
    return softmax(torch.matmul(X.reshape((-1, W.shape[0])), W) + b)

损失函数

交叉熵采用真实标签的预测概率的负对数似然。y不是one-hot编码方式,而是标签序号

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

 优化函数

lr = 0.1

def updater(batch_size):
    return sgd([W, b], lr, batch_size)

def sgd(params, lr, batch_size):
    """Minibatch stochastic gradient descent.
    """
    with torch.no_grad():
        for param in params:
            param -= lr * param.grad / batch_size  # 为什么要除以batch_size?
            param.grad.zero_()

分类精度

由于等式运算符“==”对数据类型很敏感, 因此我们将y_hat的数据类型转换为与y的数据类型一致。 结果是一个包含0(错)和1(对)的张量。 最后,我们求和会得到正确预测的数量

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值