PyTorch深度学习实践(八)

0 写在前面

这一章主要是解决多分类的问题,sofxmax。

1 解决输出问题

之前我们学习过糖尿病的二分类问题,现在我们要学习的是手写数据集MNIST——十分类的问题。那么这里的输出就从[0,1]变成了[0,1,2,3,4,5,6,7,8,9]。

1.1 输出属于每一个类别的可能性?

二分类问题——1个输出结果就够了
十分类问题——9个输出结果就够了
但是我们想要的输出:①结果都是正数;②和为1;③满足正态分布(distribution)

在这里插入图片描述

  • 所以sigmoid函数就不能保证我们的需求。因此我们需要引入softmax函数

  • softmax函数的公式如下所示: 在这里插入图片描述
    这里 Z i Z_i Zi表示的是,上一层的输出结果。让所有的值都正,那么就套一个指数函数, e z i e^{z_i} ezi就能保证全为正。然后加起来求和作为分母,分子是第i个输出的情况。

  • 先看一下老师给的图:
    在这里插入图片描述

  • 再手写模拟一遍:
    在这里插入图片描述

  • softmax函数:每一个输出的值,都做一个exponent,然后求和,每个数除以sum,最后计算分布。

如果你觉得这篇文章有用的话,可以点赞收藏关注我哦!

2 解决loss函数的问题

  • 刚刚最后一层的输出是[0.2, 0.1, -0.1],在经过softmax函数之后,得到了[0.38 0.34, 0.28]这样的一个正态分布。
  • 方便后面继续计算loss值。

2.1 之前学习的二分类交叉熵

  • torch.nn.BCELoss()类定义如下:
torch.nn.BCELoss(
    weight=None,
    size_average=None,
    reduction="mean"
)
  • 用公式表示:
    在这里插入图片描述
  • 注意: Z n Z_n Zn表示的是上一层的输出(预测值)! y n y_n yn则表示真实值。
    在这里插入图片描述

3 引入多分类的交叉熵函数

由于我们在多分类问题中,都是用one-hot编码来打标签的。所以说y中 等于0的分量是对loss不作出贡献的。
在这里插入图片描述

  • 简单手算一下:
    在这里插入图片描述

3.1 实现计算过程

  • 假设z是上一层的输出,y是真实值
import numpy as np
y = np.array([0, 0, 1])
z = np.array([0.2, 0.1, -0.1])
y_pred = np.exp(z) / np.exp(z).
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值