numpy log随机产生非常奇怪的数字(np.log的大坑)

news2024/11/27 1:17:10

背景

有一批信号数据要送到网络里训练,训练之前为了统一量纲,首先根据方差和均值做了一次标准化,然后求了一次能量(20*log10(x)),也就是说送进网络里的其实是一个能量谱,但是训练过程中经常蹦出来一些莫名其妙的数值,理论上我的数据标准化以后都应该是在-10-10之间的,但有时候会蹦出几百甚至e+20次方的数据,导致网络学习非常坎坷,例如:
在这里插入图片描述

但是当我实际加载/记录数据的时候,发现这个问题非常的随机,有时候分明都是同一个数据,第一次加载正常,第二次加载就不正常了,就是很想问问dataloader,你有事吗?后来发现原来是自己的问题😅

问题出现的原因

我的数据处理流程(pytorch的__getitem()__大概是对元数据做了这么一些操作:

x = ...
x = np.abs(x)
x = np.mean(x, axis=-2)
x = np.squeeze(x)
x = np.log10(x, where=(x!=0)) # where 参数是为了防止对0进行log操作,但还是没跳过这里的大坑...
x = (x - mean_x) / var_x # 这个是之前遍历数据集算出来的定值,假设数据同分布,别管这个

上面说的大坑是啥呢…主要有两个:

  1. numpy的浮点数比较标准和!=之间的不同
  2. numpy.log结果的类型转换

学计算机的应该都知道,浮点数之间应该是不能直接进行比较的,但是写python时间太长了,已经被各种库惯坏了,居然把这个给忘了,直接用了x!=0 进行比较,好在python平时对浮点数支持比较好,没遇到过什么问题,但是这个地方因为要算log,和0非常接近的浮点数都会导致inf或是-inf,或是其他非常诡异的数字(和0挨得还不够近),我就是遇到了这个问题,直接采用!=超出了python本身的浮点数比较范围,因此这些很接近0的数字被送到了np.log10做运算

解决方法

1. 采用numpy提供的比较方式和log10提供的参数

numpy的log10其实有三个参数,一个是x,还有两个分别是outwhere,懒得翻译了,直接看https://numpy.org/doc/stable/reference/generated/numpy.log10.html:

  • out ndarray, None, or tuple of ndarray and None, optional
    A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.

  • where array_like, optional
    This condition is broadcast over the input. At locations where the condition is True, the out array will be set to the ufunc result. Elsewhere, the out array will retain its original value. Note that if an uninitialized out array is created via the default out=None, locations within it where the condition is False will remain uninitialized.

这里只说了out参数会用来进行广播,但实际测试发现这个广播机制会导致运算错误…另外在where的部分最好使用numpy提供的isclose,虽然测试发现isclose不能完全规避问题,修改过后的代码应该长这样:

x = ...
x = np.abs(x)
x = np.mean(x, axis=-2)
x = np.squeeze(x)
x = np.log10(x, out=np.zeros_like(x), where=(np.isclose(x, 0.0)==False) ###############
x = (x - mean_x) / var_x

相关信息见https://stackoverflow.com/a/52209380

2. 不要每次都在原数据上做运算

其实这个问题产生的根本原因还是我把运算过程写在了pytorch的dataset加载过程中,每次__get_item()__ 做运算的时候会有许多不确定性,包括但不限于随机种子的设置,磁盘在运行什么,天气,湿度,电脑心情好不好,今天本人脸黑不黑etc. 也就导致了浮点数精度的随机变化,上面提到的方式可以非常大概率减小这种极小值做浮点数比较的不确定性,但是我感觉可能还是有那个亿万分之一的概率会碰上莫名其面的bug…因此如果送入网络的数据基本不怎么变的情况下,我建议还是在整个数据上做完各种log或比较等运算后,直接把结果保存下来,以后都用算好的结果…

credit

https://stackoverflow.com/a/52209380

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

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

相关文章

Python的用途与学习计划

python的用途: 1、web开发; 2、网络爬虫; 3、数据科学; 4、自动化运维; 5、数据库编程; 6、网络编程; 7、图形处理、数学处理、文本处理; 8、多媒体应用。 其中&#xff0c…

组合问题-回溯算法

1题目 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输入:n 4, k 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 示例 2: 输入:n …

美国国际留学生超136万,本科、硕士和博士各占多少?

国际教育市场研究机构ICEF Monitor近日公布,2022年美国持有F-1和M-1有效学习签证的国际学生数量共计136.2万人,与2021年相比增长了10.1%。 其中,国际学生来美国读本科学士学位的占37%,读硕士学位的占41%,读博士学位的…

为什么WordPress这么难用?(以及如何让它变得简单点)

WordPress 是世界上最受欢迎的网站构建器,为互联网上超过 43% 的网站提供支持。然而,有些人抱怨说 WordPress 比 Squarespace 和 Wix 等解决方案更难使用。 在本文中,我们将解决为何WordPress这么难用的神话,并分享您可以用来毫无…

用于具有缺失模态的脑肿瘤分割的模态自适应特征交互

文章目录 Modality-Adaptive Feature Interaction for Brain Tumor Segmentation with Missing Modalities摘要本文方法Modality-Adaptive Feature InteractionGraph RepresentationGraph Edge ComputationModality Feature Updating 实验结果 Modality-Adaptive Feature Inter…

OpenCV入门-基于Python

图像入门 1. 创建窗口namedWindow()resizeWindow()destroyAllWindow() 2.显示图像imread()imshow()imwrite()waitKey()flip() 代码演示3.显示视频VideoCapure()对象cap.get()cap.isOpened()cap.read()cap.release() 部分功能代码演示VideoWriter()对象VideoWriter_fourcc()writ…

K8s之Pod生命周期、启动停止钩子

文章目录 一、Pod生命周期流程二、初始化容器-initContainers三、主容器操作-containers1、启动钩子-lifecycle.postStart2、停止钩子-lifecycle.preStop 一、Pod生命周期流程 Pod生命周期整个过程 如下图: 1、在启动任何容器之前,前创建 pause 容器&am…

u-boot移植:详细讲解移植u-boot.2022.10版本到imx6ull开发板

目录 一、u-boot编译环境准备 1.安装交叉编译工具链 2.u-boot源码包下载 3.编译 4.安装依赖库 二、U-Boot中添加自己的开发板 1、添加开发板默认配置文件 2、添加开发板对应的头文件 3、添加开发板对应的板级文件夹 4、修改 arch/arm/mach-imx/mx6/Kconfig 5、其他需…

5分钟使用UNI-APP框架创建你的第一个项目

UNI-APP学习系列 5分钟使用UNI-APP框架创建你的第一个项目 文章目录 UNI-APP学习系列前言uni-app框架创建项目一、HBuilderX可视化方式二、 vue-cli命令行方式 总结 前言 UNI-APP学习系列之5分钟创建自己的第一个uni-app项目。 uni-app框架创建项目 创建方式 一、HBuilderX可…

bash: /opt/ros/kinetic/setup.bash: 没有那个文件或目录

有时候打开终端的时候,会在第一行报错: bash: /opt/ros/kinetic/setup.bash: 没有那个文件或目录 bash: /opt/ros/melodic/setup.bash: 没有那个文件或目录 bash: /opt/ros/neodic/setup.bash: 没有那个文件或目录 凡是类似报错与bash有关的&#xf…

【PCIE703】XCKU060+海思视频处理器HI3531DV200-ARM的高性能综合视频图像处理平台设计资料及调试经验

板卡概述 PCIE703是我司自主研制的一款基于PCIE总线架构的高性能综合视频图像处理平台,该平台采用Xilinx的高性能Kintex UltraScale系列FPGA加上华为海思的高性能视频处理器来实现。 华为海思的HI3531DV200是一款集成了ARM A53四核处理器性能强大的神经网络引擎&am…

架构-软件工程模块-2

系统分析 数据流图可能出案例题,状态转换图了解作用即可 用例图、类图选择题多,暴徒了解即可 #mermaid-svg-lGozbtkYJPEQF1eo {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lGozbtkYJPEQF1e…

加密那些事

一、前言 说到加解密也许有些人会有些陌生(仅对于初学者或其他行业的学者),先不说那些让人看到千篇一律的概念,就是如果两个人发信息怎样才能不被第三个人知道呢?是不是脑海里冒出了使用某种暗号,只有相互传…

每一个“大佬级别”的测试工程师,都有着怎样的成长那个路线?3分钟为你揭晓谜底!

目录 引言 1.何为软件测试工程师? 2.软件测试工程师的职责? 3.为什么要做软件测试? 4.软件测试的前途如何? 5.工具和思维谁更重要? 6.测试和开发相差大吗? 7.成为测试工程师的必备条件 8.测试的分…

虚拟机栈概述

一、概述 1.1、虚拟机栈背景 由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功…

网络分析和机器学习

文章目录 网络分析1.Introduction to networks and graph foundations and algorithmsNetwork types (social/bio/comp), Euler/Hamilton, Graphs (matrix/adj)Breadth-first search (shortest paths), Depth-first search (conn. compnts) 2. Emergent global / local network…

PS的基础操作

1、图片放大缩小alt鼠标滚轮 2、按住空格不放,拖拽鼠标可以改变图片的位置 3、英文状态下按字母t,再点击想要查看的文字,就可以在菜单栏上看到所有属性(取消选中按esc键) 4、点击它可以画选区来查看间距; w代表宽;h代表…

Jenkins版本升级

Jenkins版本过低的时候,一些插件无法升级,会引发一系列错误,这个时候我们就要升级版本了 一、下载更新包 第一种方式:Jenkins页面下载最新包 第二种官网上下载war包(Jenkins官网) 二、打开服务器搜索jenkins.war路径 1、如果Jenk…

CSDN 的 MD编辑器一些用法

一、点击关键语句跳转指定位置 在CSDN写文章的时候,写的文章过长往往会让读者很难找到自己想看的部分,这时候有个 跳转到指定位置功能 就非常的便利。CSDN在MD编辑器上(富文本编辑器只有一种)就提供了两种跳转到指定位置的方法: 一、目录转跳…

【SCADA】KingSCADA将数据插入SQLServer的方法

大家好,我是雷工! 本篇通过实例,介绍KingSCADA3.7访问SQL Server2022数据库。 一、概述 1、创建数据库及数据表格; 2、配置ODBC数据源。 3、通过KingSCADA与数据库建立连接,将数据写入数据库对应表格。 二、创建数据…