吴恩达机器学习-可选实验室:Softmax函数

文章目录

    • Cost
    • Tensorflow
    • 稀疏类别交叉熵或类别交叉熵
    • 祝贺

在这个实验室里,我们将探索softmax函数。当解决多类分类问题时,该函数用于Softmax回归和神经网络。 在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
plt.style.use('./deeplearning.mplstyle')
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from IPython.display import display, Markdown, Latex
from sklearn.datasets import make_blobs
%matplotlib widget
from matplotlib.widgets import Slider
from lab_utils_common import dlc
from lab_utils_softmax import plt_softmax
import logging
logging.getLogger("tensorflow").setLevel(logging.ERROR)
tf.autograph.set_verbosity(0)

注:通常,在本课程中,笔记本使用以0开始计数,以N-1结束计数的约定,∑𝑁−1.𝑖=0
,而讲座以1开始,以N结束,∑𝑁𝑖=1.
这是因为代码通常会以0开始迭代,而在讲座中,从1到N计数会产生更干净、更简洁的方程。这本笔记本的方程式比实验室的典型方程式多,因此将打破惯例,从1到N计数。

Softmax函数
在具有Softmax输出的Softmax回归和神经网络中,生成N个输出,并选择一个输出作为预测类别。在这两种情况下,矢量𝐳由应用于softmax函数的线性函数生成。softmax功能转换𝐳
转换成如下所述的概率分布。在应用softmax之后,每个输出将在0和1之间,并且输出将加1,使得它们可以被解释为概率。较大的输入将对应于较大的输出概率。
在这里插入图片描述
在这里插入图片描述
这表明输出是一个概率向量。第一个条目是输入是给定输入的第一个类别的概率𝐱
和参数𝐰和𝐛.让我们创建一个NumPy实现:

def my_softmax(z):ez = np.exp(z)              #element-wise exponenialsm = ez/np.sum(ez)return(sm)

下面,使用滑块更改z输入的值。

plt.close("all")
plt_softmax(my_softmax)

在这里插入图片描述
图1当您改变上述z的值时,需要注意以下几点:

  • softmax分子中的指数放大了数值中的微小差异
  • 输出值总和为1
  • softmax跨越所有输出。例如,z0的变化将改变a0-a3的值。将其与具有单个输入和单个输出的ReLu或Sigmoid等其他激活进行比较。

Cost

在这里插入图片描述
与Softmax相关的损失函数,即交叉熵损失,为:
在这里插入图片描述

其中y是本例的目标类别,𝐚是softmax函数的输出。特别是中的值𝐚是总和为1的概率。

回想一下:在本课程中,损失是一个例子,而成本涵盖了所有例子。

注意,在上面的(3)中,只有与目标相对应的线对损失有贡献,其他线为零。为了编写成本方程,我们需要一个“指标函数”,当指数与目标匹配时,该函数为1,否则为零。
在这里插入图片描述
在这里插入图片描述

Tensorflow

本实验室将讨论两种实现softmax的方法,Tensorflow中的交叉熵损失,“明显”方法和“首选”方法。前者是最直接的,而后者在数值上更稳定。
让我们首先创建一个数据集来训练多类分类模型。

# make  dataset for example
centers = [[-5, 2], [-2, -2], [1, 2], [5, -2]]
X_train, y_train = make_blobs(n_samples=2000, centers=centers, cluster_std=1.0,random_state=30)

显而易见的组织
下面的模型是用softmax作为最终致密层中的激活来实现的。loss函数在compile指令中单独指定。
损失函数稀疏类别交叉熵。上述(3)中所述的损失。在这个模型中,softmax发生在最后一层。损失函数采用softmax输出,softmax输出是概率的向量。

model = Sequential([ Dense(25, activation = 'relu'),Dense(15, activation = 'relu'),Dense(4, activation = 'softmax')    # < softmax activation here]
)
model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(),optimizer=tf.keras.optimizers.Adam(0.001),
)model.fit(X_train,y_train,epochs=10
)

在这里插入图片描述
因为softmax被集成到输出层中,所以输出是概率的向量

p_nonpreferred = model.predict(X_train)
print(p_nonpreferred [:2])
print("largest value", np.max(p_nonpreferred), "smallest value", np.min(p_nonpreferred))
63/63 [==============================] - 0s 1ms/step
[[3.74e-03 2.83e-03 9.64e-01 2.92e-02][9.96e-01 4.21e-03 1.13e-05 7.58e-05]]
largest value 0.9999949 smallest value 1.9021733e-09

Preferred
回想一下讲座,如果在训练中结合softmax和loss,可以获得更稳定、更准确的结果。这是由此处显示的“首选”组织启用的。
在这里插入图片描述
在优选的组织中,最后一层具有线性激活。由于历史原因,这种形式的输出被称为logits。loss函数还有一个额外的参数:from_logits=True。这会通知损失函数softmax操作应包含在损失计算中。这允许优化实现。

preferred_model = Sequential([ Dense(25, activation = 'relu'),Dense(15, activation = 'relu'),Dense(4, activation = 'linear')   #<-- Note]
)
preferred_model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),  #<-- Noteoptimizer=tf.keras.optimizers.Adam(0.001),
)preferred_model.fit(X_train,y_train,epochs=10
)

在这里插入图片描述

输出处理
注意,在首选模型中,输出不是概率,而是从大负数到大正数的范围。当执行预期概率的预测时,必须通过softmax发送输出。让我们来看看首选的模型输出:

p_preferred = preferred_model.predict(X_train)
print(f"two example output vectors:\n {p_preferred[:2]}")
print("largest value", np.max(p_preferred), "smallest value", np.min(p_preferred))
63/63 [==============================] - 0s 1ms/step
two example output vectors:[[-0.26 -1.67  3.39 -0.25][ 6.5   1.12 -2.74 -2.4 ]]
largest value 12.235959 smallest value -9.061906

输出预测不是概率!如果期望的输出是概率,则该输出应通过softmax进行处理。

sm_preferred = tf.nn.softmax(p_preferred).numpy()
print(f"two example output vectors:\n {sm_preferred[:2]}")
print("largest value", np.max(sm_preferred), "smallest value", np.min(sm_preferred))
two example output vectors:[[2.47e-02 6.04e-03 9.44e-01 2.48e-02][9.95e-01 4.61e-03 9.66e-05 1.35e-04]]
largest value 0.999998 smallest value 5.6292937e-10

要选择最可能的类别,不需要softmax。可以使用np.argmax()找到最大输出的索引。

for i in range(5):print( f"{p_preferred[i]}, category: {np.argmax(p_preferred[i])}")
[-0.26 -1.67  3.39 -0.25], category: 2
[ 6.5   1.12 -2.74 -2.4 ], category: 0
[ 4.89  1.43 -1.95 -1.89], category: 0
[-0.4   5.31 -0.04 -0.4 ], category: 1
[ 1.22 -1.58  6.53 -1.76], category: 2

稀疏类别交叉熵或类别交叉熵

Tensorflow有两种潜在的目标值格式,损失的选择定义了预期值。
SparseCategorialCrossentropy:期望目标是与索引相对应的整数。例如,如果有10个潜在的目标值,y将在0和9之间。
类别交叉熵:期望示例的目标值是一个热编码的值,其中目标索引处的值为1,而其他N-1个条目为零。一个具有10个潜在目标值的示例(其中目标为2)为[0,0,1,0,0,0,0]。

祝贺

在这个实验室里,你

  • 越来越熟悉softmax函数及其在softmax回归和神经网络中的softmax激活中的应用。
  • 在Tensorflow中学习了首选的模型构建:
    • 最后一层没有激活(与线性激活相同)
    • 稀疏类别交叉熵损失函数
    • use from_logits=True
  • 认识到与ReLu和Sigmoid不同,softmax跨越多个输出。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面向低成本巡线机器人的PID控制器优化——文末源码

目录 介绍 测试 电子元器件 系统特征 控制器设计 位置误差的计算 比例控制 积分控制 微分控制 改进的PID控制器 测试轨迹 源码链接 本文对经典PID控制器的改进和开环控制机制的发展进行了讨论&#xff0c;以提高差动轮式机器人的稳定性和鲁棒性。为了部署该算法&am…

【DP】动态规划基本解题步骤(求解台阶问题)

dp数组的定义和下标递推公式dp数组如何初始化&#xff0c;初始化也需要注意遍历顺序打印dp数组&#xff08;出现问题 对于高度为 n 的台阶&#xff0c;从下往上走&#xff0c;每一步的阶数为 1&#xff0c;2&#xff0c;3 中的一个。问要走到顶部一共有多少种走法 分析&#…

python中良好的编码规范

遵循PEP 8的常见规范&#xff1a; 缩进&#xff1a; 使用4个空格来缩进代码块&#xff0c;而不是使用制表符。 命名规范&#xff1a; 变量名应该使用小写字母&#xff0c;单词之间用下划线 _ 分隔&#xff08;snake_case&#xff09;。类名应该使用驼峰命名法&#xff08;Camel…

C++ 模板知识大全

模板 泛型编程 我们如何实现一个交换函数 我们实现了两种类型的交换函数&#xff0c;但是其实除了类型不一样&#xff0c;其他地方都是一样的。 void swap(int& a, int& b) {int tmp a;a b;b tmp; }void swap(char& a, char& b) {int tmp a;a b;b tmp…

关于DCMM评估的办理条件你知道多少?

DCMM&#xff08;数据管理能力成熟度评价模型&#xff09;评估划分为五个等级&#xff0c;自低向高依次为初始级、受管理级、稳健级、量化管理级和优化级&#xff0c;不同等级代表企业数据管理和应用的成熟度水平不同&#xff0c;证书自颁发之日起有效期3年 DCMM申报基础条件 …

香港科技大学(广州)先进材料学域可持续能源与环境学域智能制造学域博士招生宣讲会——北京专场(暨全额奖学金政策)

三个学域代表教授亲临现场&#xff0c;面对面答疑解惑助攻申请&#xff01;可带简历现场咨询和面试&#xff01; &#x1f4b0;一经录取&#xff0c;享全额奖学金1.5万/月&#xff01; 报名链接&#xff1a; https://www.wjx.top/vm/wF2Mant.aspx# 地点&#xff1a;中关村皇冠…

Redis中RDB的dirty机制和AOF中的后台重写机制

RDB的dirty计数器和lastsave属性 服务器除了维护saveparams数组之外&#xff0c;还维持着一个dirty计数器,以及一个lastsave属性: 1.dirty计数器记录距离上一次成功执行SAVE命令或者BGSAVE命令之后&#xff0c;服务器对数据库状态(服务器中的所有数据库)进行了多少次修改(包括…

设计模式学习笔记 - 设计模式与范式 -结构型:1.代理模式:代理在RPC、缓存、监控等场景中的应用

概述 前面几个章节&#xff0c;我们学习了设计模式中的创建型模式。创建型模式主要解决对象的创建问题&#xff0c;封装复杂的创建过程&#xff0c;解耦对象的创建代码和使用代码。 单例模式用来创建全局唯一的对象。工厂模式用来创建不同但是相关类型的对象&#xff08;继承…

文件操作3

随机读写数据文件 一、随机读写原理 在我们写数据时&#xff0c;有一个光标不断的在随着新写入的数据往后移动&#xff1b; 而读数据时&#xff0c;也有一个看不见光标&#xff0c;随着已经读完的数据&#xff0c;往后移动 这里的文件读写位置标记——可以想象成图形界面里的…

算法分析与设计复试总结(二)

以下是一些常见的问题类型&#xff1a; 基础算法概念&#xff1a; 请解释什么是算法&#xff0c;以及算法的重要性。 算法是一系列解决问题的清晰指令&#xff0c;算法代表着用系统的方法描述解决问题的策略机制。也就是说&#xff0c;能够对一定规范的输入&#xff0c;在有限…

QB PHP 多语言配置

1&#xff1a; 下载QBfast .exe 的文件 2&#xff1a; 安装的时候 &#xff0c;一定点击 仅为我 安装 而不是 所有人 3&#xff1a; 如果提示 更新就 更新 &#xff0c; 安装如2 4&#xff1a; 如果遇到 新增 或者编辑已经 配置的项目时 不起作用 &#xff1a; 右…

05:HAL-----看门狗WDT

目录 一:看门狗 1:WDT 2:独立看门狗 (IWDG) A:IWDG框图 B:IWDG_KR键寄存器 C:IWDG超时时间 D:HAl库的配置 3:窗口看门狗 (WWDG) A:WWDG框图 B:WWDG工作特性 C:WWDG超时时间 D:HAL库配置 4:独立看门狗和窗口看门狗的区别 5:数据手册 二:案例 A:独立看门狗 B:窗…

LEETCODE-DAY29

title: LEETCODE-DAY29 date: 2024-03-20 15:22:38 tags: 今日内容&#xff1a;491.递增子序列、46.全排列、47.全排列 II T1 class Solution:def backtracking(self,nums,index,path,res):if indexlen(nums):res.append(path.copy())returnfor i in range(index,len(nums))…

springboot项目学习-瑞吉外卖(4)

1.任务 这一节主要的任务是解决文件的上传和下载功能 2.文件上传 概念&#xff1a;将本地的图片上传到浏览器上面 点击文件上传&#xff0c;前端就会发送如上的请求&#xff0c;服务端应该根据URL和请求方法来处理请求 CommonController类&#xff1a; RestController Slf4j …

【第二部分--Python之基础】

一、初识 开发语言&#xff1a; 高级语言&#xff1a;Python Java PHP C# Go Ruby C ... > 字节码 低级语言&#xff1a;C 汇编 > 机器码 …

6、jenkins项目构建类型1-项目类型介绍

文章目录 一、自由风格项目二、Maven项目构建三、Pipeline流水线项目构建&#xff08;☆☆☆&#xff09; Jenkins中自动构建项目的类型有很多&#xff0c;常用的有以下三种&#xff1a; 自由风格软件项目&#xff08;FreeStyle Project&#xff09;Maven项目&#xff08;Mave…

初始Redis关联和非关联

基础篇Redis 3.初始Redis 3.1.2.关联和非关联 传统数据库的表与表之间往往存在关联&#xff0c;例如外键&#xff1a; 而非关系型数据库不存在关联关系&#xff0c;要维护关系要么靠代码中的业务逻辑&#xff0c;要么靠数据之间的耦合&#xff1a; {id: 1,name: "张三…

Maya FBX导出导入

问题描述&#xff1a; Maya 导出导入 FBX&#xff0c;设置 FBX 的 导入和导出设置 解决方案&#xff1a; 获取FBX设置 def getFBXSettings():""" get current user settings for FBX export and store them """mel.eval(FBXPushSettings;)de…

指针知识大礼包,让你的编程之路更顺畅(一)

1. 内存和地址 2. 指针变量和地址 3. 指针变量类型的意义 4. const修饰指针 5. 指针运算 6. 野指针 7. assert断⾔ 8. 指针的使⽤和传址调⽤ 正文开始 1. 内存和地址 1.1 内存 在讲内存和地址之前&#xff0c;我们想有个⽣活中的案例&#xff1a; 假设有⼀栋宿舍楼&a…

自锁电路设计

自锁电路设计 Hi,uu们,是不是经常要用到自锁电路,通常不是使用555芯片就是用比较器来做自锁,今天我们来简单看下自锁电路的设计.图1采用了比较器构建了一个自锁电路,采用低电平复位&#xff0c;当需要复位的时候志需要将反向端的二极管拉低一下即可&#xff0c;免去 三极管控制…