首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

人工神经网络・Softmax多分类

逻辑回归常用于处理二分类问题的,虽然也可以通过〚联合〛的方式处理多分类问题「有超过两个以上的类别」但这样比较麻烦。在处理多分类问题的时候我们可以使用softmax替代逻辑回归里的sigmoid激活函数,这样可以实现多分类操作。

Softmax函数

我们简单介绍一下Softmax函数,它的数学公式如下:

当我们有一个数据

输入到softmax,它会输出的

值将如下:

我们用一个具体的数值来演示一下,假设输入数据如下:

于是计算过程如下:

最终输出y为:

y的每一个元素的值会落在0到1之间,并且将y的每一个元素值相加会得到数值1,因此softmax的输出常常用于代表各个类别的概率,例如当第一个元素的值为0.09003057时代表有9.003057%的可能性为第一个类别;第二个元素的值为0.24472847代表有24.472847%的可能性为第二个类别……以此类推。

引入所需的模块

将pytorch的随机生成器的种子固定在7,这样可以让每一次运行的结果相同。

由于我们需要绘制图像,所以除了引入pytorch我们还引入了matplotlib;包含pytorch中大量的神经网络相关的函数,我们将用到它。

构建输入输出

我们随机产生一个10x5的矩阵X作为输入,它的每一行为一个数据点,共计10个数据点。

除此之外,我们还创建了一个索引,它的生成方法是: 将矩阵X与另一个5x3的随机矩阵相乘得到一个10x3的新矩阵,然后取这个新矩阵中每一行的最大值元素的下标。

我们还需要使用one-hot函数将索引进行转换,让它变成一个元素值为0或1的10x3矩阵,该矩阵的每一行只有一个1,并且第n行中值为1的元素的下标等于索引第n行的元素值,即有: 的值为1:

设置需要拟合的参数

由于我们的输出是个nx3的矩阵所以权重W的维度是5x3,偏置b的维度是3:

正向传播

在一个for循环中执行正向传播代码:

调用softmax激活函数需要指定维度这是因为矩阵A的每一行对应一个数据点,我们需要单独给每一行进行softmax。由于使用的是softmax激活函数,因此我们的损失函数需要采用交叉熵损失函数即,该函数的第一个参数为softmax的输出,第二个参数为正确的分类标识。

我们使用列表存储每一轮的损失值,并每10个循环打印输出一次。

反向传播

调用进行反向传播用以求解W与b的梯度,然后在不计算梯度的模式下进行更新:

查看拟合效果

打印输出矩阵P,矩阵P的每一行的数值处于0到1之间,代表改行所对应的数据点在某个类别上的概率。例如: P的第0行的0个元素为0.2115则表示第0个数据点属于第0个类别的概率为21.15%,我们可以调用将矩阵P转换成类似的索引向量:

运行后输出:

绘制拟合过程中的损失率

最后我们还可以可视化一下拟合过程中损失率的变化:

softmax_fit_loss.png

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20221001A054C500?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券