实现Fast sigmoid和Softmax

news/2024/7/10 3:23:52 标签: 目标检测, YOLO, 深度学习

Sigmoid 函数介绍

在这里插入图片描述
Sigmoid 函数(Logistic 函数)是神经网络中非常常用的激活函数,它的数学表示如下:

在这里插入图片描述

  • 由于 e x e^x ex幂运算非常耗时的计算,因此尝试通过替换sigmoid中的 e x e^x ex运算,来提高运行效率,同时不影响计算精度。
  • 同理softmax激活函数,也可以通过替换 e x e^x ex运算来提升运行速度。

Fast sigmoid 和sigmoid 对比

#include<iostream>
#include<ctime>
#include <cmath>
using namespace std;
 
const int N = 1e6;

inline float fast_exp(float x)
{
    union
    {
        uint32_t i;
        float f;
    } v{};
    v.i = (1 << 23) * (1.4426950409 * x + 126.93490512f);
    return v.f;
}

inline float sigmoid_fast(float x)
{
    return 1.0f / (1.0f + fast_exp(-x));
}

inline float sigmoid(float x)
{
    return 1.0f / (1.0f + exp(-x));
}

int main(){

    float a =sigmoid(1.5);
    float b =sigmoid_fast(1.5);
    printf("sigmoid result = %f\n", a);
    printf("Fast sigmoid result= %f\n", b);
 
    clock_t start_fast, end_fast,start, end;
    
    start_fast= clock();
    
 
    for(int i = 0 ; i < N ; i ++){
        sigmoid_fast(10);
    }
 
    end_fast= clock();
    // printf("End:sigmoid_fast= %ld\n",end_fast);
    double elapsedTime = static_cast<double>(end_fast-start_fast) / CLOCKS_PER_SEC ;
    //clock()以毫秒的形式展现,因此需要除以 CLOCKS_PER_SEC 来实现转换
    //static_cast<double>的作用是将结果转换为double类型
    printf("sigmoid_fast TIME: %f",elapsedTime);

   
    start = clock();
    //printf("\nStart: %ld\n",start);
 
    for(int i = 0 ; i < N ; i ++){
        sigmoid(10);
    }
 
    end = clock();
    //printf("End:sigmoid= %ld\n",end);
    elapsedTime = static_cast<double>(end-start) / CLOCKS_PER_SEC ;
    //clock()以毫秒的形式展现,因此需要除以 CLOCKS_PER_SEC 来实现转换
    //static_cast<double>的作用是将结果转换为double类型
    printf("\nsigmoid TIME: %f",elapsedTime);
}

在这里插入图片描述

  • 可以看到sigmoid(1.5)的计算结果为0.817554, sigmoid_fast(1.5)的计算结果为0.818761, 计算结果非常接近。
  • 而运行速度方面,在重复运行 1 0 6 10^6 106次, sigmoid fast耗时为0.002s, 而sigmoid 耗时为0.038, 计算速度方面Fast sigmoid比 sigmoid 快了19倍
  • 同理Fast Softmax也可以通过替换 e x e^x ex运算,来提升计算效率

http://www.niftyadmin.cn/n/329522.html

相关文章

ANR原理篇 - service/broadcast/provider超时机制

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 文章目录 系列文章目录前言一、Service超时机制1.1 埋炸弹1.1.1 AS.realStartServiceLocked1.1.2 AS.bumpSer…

通过命令行体验长安链

通过命令行体验长安链 1 、概述2、环境依赖2.1、硬件依赖2.2、软件依赖2.3、git安装2.4、golang安装2.5、gcc 3、环境搭建3.1、源码下载3.2、 源码编译3.3、编译及安装包制作3.4、启动节点集群3.5、查看节点启动使用正常 官方文档 https://docs.chainmaker.org.cn/v2.3.1/html/…

【代码调试】《Multi-scale Positive Sample Refinement for Few-shot Object Detection》

论文地址&#xff1a;https://arxiv.org/abs/2007.09384#:~:textMulti-Scale%20Positive%20Sample%20Refinement%20for%20Few-Shot%20Object%20Detection.,previous%20attempts%20that%20exploit%20few-shot%20classification%20techniques%20 代码地址&#xff1a;https://git…

数据结构学习记录——图的遍历(深度优先搜索、广度优先搜索、为什么需要两种遍历、图不连通怎么办)

目录 深度优先搜索 概念 图解过程 伪代码 时间复杂度 具体代码&#xff08;C语言&#xff09; 广度优先搜索 概念 图解过程 伪代码 时间复杂度 具体代码&#xff08;C语言&#xff09; 为什么需要两种遍历 图不连通怎么办 连通 路径 回路 连通图 连通…

深度学习之迁移学习

数据增强 数据太少可能会过拟合。 # data_transforms中指定了所有图像预处理&#xff08;变换&#xff09;操作&#xff08;图像数据增强&#xff09; data_transforms {train: transforms.Compose([transforms.RandomRotation(45), # 随机旋转&#xff0c;-45到45度之间随…

Go语言面试题--进阶提升(10)

文章目录 1.下面代码输出什么&#xff1f;2.下面的代码能编译通过吗&#xff1f;可以的话输出什么&#xff0c;请说明&#xff1f;3.下面代码有什么问题&#xff0c;请说明&#xff1f;4.假设 x 已声明&#xff0c;y 未声明&#xff0c;下面 4 行代码哪些是正确的。错误的请说明…

中本聪思想精髓难以领悟?Web3实际上还在“幻想”之中?

Web3概念是不错&#xff0c;有人说它是下一代互联网&#xff0c;有人说它是NFT和元宇宙等未来应用的基础设施。然而理论炒得火热&#xff0c;但却仍不见像ChatGPT一样能引爆市场的杀手级应用出现。 原因在于&#xff0c;当前的Web3概念是对中本聪思想的不断概括和提炼&#xff…

丁鹿学堂:2023前端学习指南之vue3的数据响应式原理总结

js的普通对象 如果定义一个普通对象&#xff0c;修改对象的值&#xff0c;不会影响别的元素。 const obj {name:丁鹿,age:20 } obj.name 前端如果想要在修改对象的元素的同时&#xff0c;去触发一些别的操作&#xff0c;我们需要把对象进行改造。 在vue3中&#xff0c;使用…