基础!!!吴恩达deeplearning.ai:神经网络中使用softmax

以下内容有任何不理解可以翻看我之前的博客哦:吴恩达deeplearning.ai

文章目录

  • softmax作为输出层的神经网络
  • Tensorflow的实现
  • softmax的改进实现
    • 数值舍入误差(Numerical Roundoff Errors)
    • sigmoid修改
    • 修改softmax


在上一篇博客中我们了解了有关softmax的原理相关内容,今天我们主要聚焦于如何修改之前的神经网络,从而搭建能够实现多分类问题的神经网络。

softmax作为输出层的神经网络

在这里插入图片描述
相比之前的二分类逻辑回归神经网络,我们主要的改变是将输出层替换为了具有十个神经元的,激活函数为softmax的输出层。整个神经网络的运行流程是接收特征输入X,并且传入隐藏层,两个隐藏层的激活函数均采用的是relu函数;再传入最终输出层,最终的输出 a [ 3 ] a^{[3]} a[3]是一个包含十个概率值的矩阵。
我们再回顾下softmax的公式(这里仅以a1为例):
z 1 = w 1 ⃗ ⋅ x ⃗ + b 1 a 1 = e z 1 e z 1 + e z 2 + e z 3 + e z 4 z_1=\vec{w_1}\cdot\vec{x}+b_1\\ a_1=\frac{e^{z_1}}{e^{z_1}+e^{z_2}+e^{z_3}+e^{z_4}} z1=w1 x +b1a1=ez1+ez2+ez3+ez4ez1
此外提一个定义,softmax层有时也被叫做softmax函数。与其它的激活函数相比不同的是,softmax中 a 1 a_1 a1仅仅和 z 1 z_1 z1有关, a 2 a_2 a2仅仅和 z 2 z_2 z2有关,而不像其它的激活函数最终的某个输出a和多个z有关。
让我们看看如何用代码实现这个神经网络

Tensorflow的实现

第一步,构建神经网络的结构框架:

import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
model = Sequential([Dense(units=25, activation='relu')Dense(units=15, activation='relu')Dense(units=10, activation='softmax')])

第二步,定义损失函数和价值函数

from tensorflow.keras.losses import
SparseCategoricalCrossentropy
model.compile(loss=SparseCategoricalCrossentropy())

这里出现了一个新的函数SparseCategoricalCrossentropy(),翻译成中文叫做稀疏分类交叉熵,名字超长,甚至超过了当初的二元交叉熵。稀疏(Sparse)的意思是值只能取1~10中的一个;分类(Categorical)指的是你仍然将y分类。
第三步,训练模型,预测代码和以前一样:

model.fit(X, Y, epochs=100)

以上代码是可以起作用的,符合我们之前的认知,但是还不够优化,在tensorflow中有更好的代码版本。下面我们看看如何优化softmax代码。

softmax的改进实现

数值舍入误差(Numerical Roundoff Errors)

让我先展示下在计算机设置数值的两种不同方法:
第一种,简单粗暴法:
x = 2 10 , 000 x=\frac{2}{10,000} x=10,0002
第二种,加加减减法:
x = ( 1 + 1 10 , 000 ) − ( 1 − 1 10 , 000 ) x=(1+\frac{1}{10,000})-(1-\frac{1}{10,000}) x=(1+10,0001)(110,0001)
虽然看上去相同,但是精确度是由差别的:
在这里插入图片描述
我们对softmax的改进,也主要聚焦在精确度上面,让我介绍一种更加精确的方法。

sigmoid修改

在逻辑回归中,我们的公式是这样的:
a = g ( z ) = 1 1 + e − z l o s s = − y l o g a − ( 1 − y ) l o g ( 1 − a ) a=g(z)=\frac{1}{1+e^-z}\\ loss=-yloga-(1-y)log(1-a) a=g(z)=1+ez1loss=yloga(1y)log(1a)
它的代码是:

model = Sequential([Dense(units=25, activation='relu')Dense(units=15, activation='relu')Dense(units=10, activation='sigmoid')])
model.compile(loss=BinaryCrossEntropy())

如果我们要求tensorflow按照这个步骤,一步步算出a,然后带入到loss之中,那么结果就会如同上面的第二种方法一样产生误差,因为其进行了两步运算。但是tensorflow提供了另一种方法,大致意思就是我们先使用线性激活函数(也可以理解为没使用激活函数),最后在计算损失的时候再指定激活函数为sigmoid。如果我们使用了这个命令,这会为tensorflow提供更高的灵活性,从而可以减少误差,就如同上面的方法一;代码如下:

model = Sequential([Dense(units=25, activation='relu')Dense(units=15, activation='relu')Dense(units=10, activation='linear')])
model.compile(loss=BinaryCrossEntropy(from_logits=True))

通俗点说from_ligits=True告诉了激活函数inaryCrossEntropy我没有用激活函数哦,所以你计算损失时内部记得调用下sigmoid哈。这里的logits可以理解为没有经过激活函数的z。

修改softmax

同样地,我们再看看稀疏分类交叉熵的损失函数,我就写出其中的一项:
L o s s = − l o g a i f y = 1 Loss=-loga\:ify=1 Loss=logaify=1

由于在多分类问题之中,分类的选项很多,而各个选项的概率和是一定的为1,因此很多情况下正确的那个选项的概率依然很小,由于使用了log函数,在x接近于0的时候这个值会非常大,那么产生的误差也就会很大,而二分类问题由于选项仅有两个,因此这个问题不是很明显,便没在讲二分类的时候也进行这种优化。
一样地,我们代码也可以修改为:

model = Sequential([Dense(units=25, activation='relu')Dense(units=15, activation='relu')Dense(units=10, activation='linear')])from tensorflow.keras.losses import
SparseCategoricalCrossentropy
model.compile(loss=SparseCategoricalCrossentropy(from_logits=True))

另外需要修改的地方是,我们在预测时,model(x)不再是概率a了,而是没经过激活函数的z,因此代码在最后需要添加:

model.fit(X, Y, epochs=100)
logits = model(X)
f_x = tf.nn.softmax(logits)

从而再加入了softmax,出来的才是0~1之间的概率a。
为了给读者你造成不必要的麻烦,博主的所有视频都没开仅粉丝可见,如果想要阅读我的其他博客,可以点个小小的关注哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2814815.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【mysql版本修改】

1、使用telnet确认当前mysql版本号 telnet <MySQL服务器IP地址> <MySQL端口号> telnet 192.168.38.20 33062、使用strings查看/usr/sbin/mysqld中包含版本号的字符串 # 查看/usr/sbin/mysqld文件中是否包含对应的版本号 strings /usr/sbin/mysqld | grep 5.7.30 …

11. Informer 机制总结

Informer 机制 在 Kubernetes 系统中&#xff0c;组件之间通过 HTTP 协议进行通信&#xff0c;在不依赖任何中间件的情况下需要保证消息的实时性、可靠性、顺序性等。那么 Kubernetes 是如何做到的呢&#xff1f;答案就是 Informer 机制。Kubernetes 的其他组件都是通过 clien…

python|闲谈2048小游戏和数组的旋转及翻转和转置

目录 2048 生成数组 n阶方阵 方阵旋转 顺时针旋转 逆时针旋转 mxn矩阵 矩阵旋转 测试代码 测试结果 翻转和转置 2048 《2048》是一款比较流行​的数字游戏​&#xff0c;最早于2014年3月20日发行。原版2048由Gabriele Cirulli首先在GitHub上发布&#xff0c;后被移…

华为手动ipv6-to-ipv4隧道

中间r2的两个接口配置两个地址就行了&#xff0c;其它什么都不用配置 两边出接口R1和R3手动隧道建立&#xff1a;先把IPV4打通&#xff0c;并配置默认路由 再起隧道接口上进行配置&#xff0c;再配置带隧道的默认路由 PC上和上联接口网关只有IPV6地址 最终两个PC可以ping通 …

node 之 http模块

1.什么是http模块 在网络节点中&#xff0c;负责消费资源的电脑叫做客户端&#xff1b;负责对外提供网络资源的电脑&#xff0c;叫做服务器 http模块是node.js官方提供的&#xff0c;用来创建web服务器的模块&#xff0c;通过http模块提供的http.createServer()方法&#xff0c…

武器大师——操作符详解(上)

目录 一、操作符的分类 二、二进制和进制转换 2.1.二进制与十进制的互相转化 2.1.1 二进制转十进制 2.1.2 十进制转二进制 ​编辑 2.2.二进制转8进制和16进制 2.2.1 转8进制 2.2.2 转16进制 三、原码、反码、补码 四、移位操作符 4.1.左移操作符&#xff08;<…

【C语言】linux内核netdev_start_xmit函数

一、中文注释 static inline netdev_tx_t netdev_start_xmit(struct sk_buff *skb, struct net_device *dev, struct netdev_queue *txq, bool more) {// 获取网络设备操作集合const struct net_device_ops *ops dev->netdev_ops;int rc;// 调用实际发送数据包的函数&…

【UE 材质】水晶材质

效果 步骤 1. 先在Quixel Bridge上下载冰纹理 2. 新建一个材质&#xff0c;这里命名为“M_Ice”并打开&#xff0c;添加如下纹理采样节点 继续添加如下节点 此时效果如下&#xff1a; 可以看到此时的材质颜色比较浅&#xff0c;如果希望颜色深一点可以继续添加如下节点 此时效…

基于springboot+vue的大学城水电管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Leetcoder Day25| 回溯part05:子集+排列

491.递增子序列 给定一个整型数组, 你的任务是找到所有该数组的递增子序列&#xff0c;递增子序列的长度至少是2。 示例: 输入:[4, 7, 6, 7]输出: [[4, 6], [4, 7], [4, 6, 7], [6, 7], [7,7], [4,7,7]] 说明: 给定数组的长度不会超过15。数组中的整数范围是 [-100,100]。给定数…

智慧物流之道:数据可视化引领全局监控

在智慧物流的背景下&#xff0c;数据可视化催生了物流管理的全新范式。首先&#xff0c;通过数据可视化&#xff0c;物流企业可以实现对整个供应链的全景式监控。下面我就可以可视化从业者的角度&#xff0c;简单聊聊这个话题。 首先&#xff0c;图表和地图的直观展示使决策者能…

前后端项目-part03

文章目录 5.4.4 机构名称5.4.4.1 创建实体类Company5.4.4.2 创建实体类CompanyMapper5.4.4.3 创建实体类CompanyService5.4.4.4 创建实体类CompanyController5.4.4.5 后端测试5.4.4.6 修改basic.js5.4.4.7 修改course.vue5.4.4.8 测试5.4.5 课程标签5.4.5.1 效果5.4.5.2 修改co…

用html实现一个简易的百度热榜

用html实现一个简易的百度热榜 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document…

轻松统一图片格式,提升工作效率,高效管理不同格式图片

在数字创意的海洋中&#xff0c;图片是最具表现力的元素之一。但你是否曾因不同格式的图片而头疼&#xff1f;格式不统一&#xff0c;不仅影响管理效率&#xff0c;还可能影响作品的最终呈现效果。今天&#xff0c;我们为您带来了一款高效、便捷的图片批量转换工具&#xff0c;…

【Simulink系列】——Simulink子系统子系统封装模块库技术

声明&#xff1a;本系列博客参考有关专业书籍&#xff0c;截图均为自己实操&#xff0c;仅供交流学习&#xff01; 引入 前面对于简单的动态系统仿真&#xff0c;可以直接建立模型&#xff0c;然后仿真。但是对于复杂的系统&#xff0c;直接建立系统会显得杂乱无章&#xff0…

C语言 int和unsigned int逻辑比较

文章目录 测试1、测试 CMP (int,int)2、测试 CMP (int ,unsigned int)3、测试 CMP (unsigned int ,unsigned int)4、测试 CMP(int ,常量&#xff09; 总结 测试 在IAR(8.40.2)平台下测试单片机为STM32F103ZET6 1、测试 CMP (int,int) //a -2,b 3 int test_fun(int a, int…

二次供水物联网:HiWoo Cloud助力城市水务管理升级

随着城市化的快速推进&#xff0c;二次供水系统作为城市基础设施的重要组成部分&#xff0c;其稳定运行和高效管理显得至关重要。然而&#xff0c;传统的二次供水管理方式在应对复杂多变的城市供水需求时&#xff0c;显得力不从心。为了破解这一难题&#xff0c;HiWoo Cloud平台…

StarRocks实战——携程酒店实时数仓

目录 一、实时数仓 二、实时数仓架构介绍 2.1 Lambda架构 2.2 Kappa架构 三、携程酒店实时数仓架构 3.1 架构选型 3.2 实时计算引擎选型 3.3 OLAP选型 四、携程酒店实时订单 4.1 数据源 4.2 ETL数据处理 4.3 应用效果 4.4 总结 原文大佬的这篇实时数仓建设案例有借…

龙蜥OS 尝试

> 尝试一下龙蜥OS&#xff0c;和Centos8应该没什么区别。 阿里云版本龙蜥 https://alinux3.oss-cn-hangzhou.aliyuncs.com/aliyun_3_x64_20G_nocloud_alibase_20230727.vhd Index of /anolis/8.8/isos/GA/x86_64/ (openanolis.cn) 网卡 我在虚拟机上安装完后&#xff0c;…

Spring常见面试题知识点总结(二)

4. 面向切面编程&#xff08;AOP&#xff09;&#xff1a; AOP的基本概念。 AOP&#xff08;Aspect-Oriented Programming&#xff0c;面向切面编程&#xff09;是一种编程范式&#xff0c;旨在通过切面&#xff08;Aspect&#xff09;将横切关注点与核心业务逻辑分离&#x…