Theano sqrt 返回 NaN 值

2024-01-11

在我的代码中,我使用 theano 来计算欧几里德距离矩阵(代码来自here https://stackoverflow.com/questions/25886374/pdist-for-theano-tensor):

import theano
import theano.tensor as T
MAT = T.fmatrix('MAT')
squared_euclidean_distances = (MAT ** 2).sum(1).reshape((MAT.shape[0], 1)) + (MAT ** 2).sum(1).reshape((1, MAT.shape[0])) - 2 * MAT.dot(MAT.T)
f_euclidean = theano.function([MAT], T.sqrt(squared_euclidean_distances))
def pdist_euclidean(mat):
    return f_euclidean(mat)

但以下代码会导致矩阵的某些值变为NaN。我读到计算时会发生这种情况theano.tensor.sqrt() and here https://groups.google.com/forum/#!topic/theano-users/IXfxAU35MiE建议

在 sqrt 内添加 eps(或 max(x,EPs))

所以我在代码中添加了一个 eps :

import theano
import theano.tensor as T

eps = 1e-9

MAT = T.fmatrix('MAT')

squared_euclidean_distances = (MAT ** 2).sum(1).reshape((MAT.shape[0], 1)) + (MAT ** 2).sum(1).reshape((1, MAT.shape[0])) - 2 * MAT.dot(MAT.T)

f_euclidean = theano.function([MAT], T.sqrt(eps+squared_euclidean_distances))

def pdist_euclidean(mat):
    return f_euclidean(mat)

我在表演之前添加它sqrt。我越来越少了NaNs,但我仍然得到它们。问题的正确解决方案是什么?我还注意到,如果MAT is T.dmatrix()没有NaN


计算欧几里德距离时,NaN 可能有两个来源。

  1. 当距离实际上为零时,浮点表示近似问题会导致负距离。负数的平方根是未定义的(假设您对复杂的解决方案不感兴趣)。

    Imagine MAT有价值

    [[ 1.62434536 -0.61175641 -0.52817175 -1.07296862  0.86540763]
     [-2.3015387   1.74481176 -0.7612069   0.3190391  -0.24937038]
     [ 1.46210794 -2.06014071 -0.3224172  -0.38405435  1.13376944]
     [-1.09989127 -0.17242821 -0.87785842  0.04221375  0.58281521]]
    

    现在,如果我们分解计算,我们会看到(MAT ** 2).sum(1).reshape((MAT.shape[0], 1)) + (MAT ** 2).sum(1).reshape((1, MAT.shape[0]))有价值

    [[ 10.3838024   -9.92394296  10.39763039  -1.51676099]
     [ -9.92394296  18.16971188 -14.23897281   5.53390084]
     [ 10.39763039 -14.23897281  15.83764622  -0.65066204]
     [ -1.51676099   5.53390084  -0.65066204   4.70316652]]
    

    and 2 * MAT.dot(MAT.T)有价值

    [[ 10.3838024   14.27675714  13.11072431   7.54348446]
     [ 14.27675714  18.16971188  17.00367905  11.4364392 ]
     [ 13.11072431  17.00367905  15.83764622  10.27040637]
     [  7.54348446  11.4364392   10.27040637   4.70316652]]
    

    这两个值的对角线应该相等(向量与其自身之间的距离为零),从这个文本表示来看,这似乎是正确的,但实际上它们略有不同——差异太小而无法在以下情况下显示出来:我们像这样打印浮点值

    当我们打印完整表达式的值时(从第一个矩阵中减去上面的第二个矩阵),这一点变得显而易见

    [[  0.00000000e+00   2.42007001e+01   2.71309392e+00   9.06024545e+00]
     [  2.42007001e+01  -7.10542736e-15   3.12426519e+01   5.90253836e+00]
     [  2.71309392e+00   3.12426519e+01   0.00000000e+00   1.09210684e+01]
     [  9.06024545e+00   5.90253836e+00   1.09210684e+01   0.00000000e+00]]
    

    对角线几乎由零组成,但第二行第二列中的项目现在是一个非常小的负值。然后,当您计算所有这些值的平方根时,您会得到NaN处于该位置,因为负数的平方根未定义(对于实数)。

    [[ 0.          4.91942071  1.64714721  3.01002416]
     [ 4.91942071         nan  5.58951267  2.42951402]
     [ 1.64714721  5.58951267  0.          3.30470398]
     [ 3.01002416  2.42951402  3.30470398  0.        ]]
    
  2. 计算欧几里德距离表达式相对于函数输入内的变量的梯度。如上所述,不仅当由于浮点近似而生成负数时,而且当任何输入的长度为零时,也会发生这种情况。

    If y = sqrt(x) then dy/dx = 1/(2 * sqrt(x)). So if x=0或者,为了您的目的,如果squared_euclidean_distances=0那么梯度将是NaN因为2 * sqrt(0) = 0除以零是未定义的。

第一个问题的解决方案可以通过强制平方距离不小于零来确保平方距离永远不为负数:

T.sqrt(T.maximum(squared_euclidean_distances, 0.))

要解决这两个问题(如果您需要梯度),那么您需要确保平方距离永远不为负或零,因此与一个小的正 epsilon 绑定:

T.sqrt(T.maximum(squared_euclidean_distances, eps))

第一个解决方案是有道理的,因为问题仅由近似表示引起。第二个有点可疑,因为真实距离为零,所以从某种意义上说,梯度应该是未定义的。您的特定用例可能会产生一些替代解决方案,该解决方案在没有人为限制的情况下维护语义(例如,通过确保永远不会计算/使用零长度向量的梯度)。但NaN价值观可能是有害的:它们会像杂草一样蔓延。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Theano sqrt 返回 NaN 值 的相关文章

  • pydev 断点不起作用

    我正在使用 python 2 7 2 sqlalchemy 0 7 unittest eclipse 3 7 2 和 pydev 2 4 开发一个项目 我在 python 文件 单元测 试文件 中设置断点 但它们被完全忽略 之前 在某些时候
  • Python CSV Writer 在文件末尾留下一个空行

    以下代码在 txt 文件末尾留下一个空白行 我怎样才能不让 writerows 不终止最后一行 with open fname wb as myFile Start the CSV Writer wr csv writer myFile d
  • 当语料库有100亿个独特的DNA序列时,如何使用BK树实现快速模糊搜索引擎?

    我正在尝试使用BK tree https news ycombinator com item id 14022424python 中的数据结构 用于存储约 100 亿个条目的语料库 1e10 以实现快速模糊搜索引擎 一旦我添加超过 1000
  • 如何在 Python 2.4 CSV 阅读器中禁用引用?

    我正在编写一个 Python 实用程序 需要解析一个我无法控制的大型且定期更新的 CSV 文件 该实用程序必须在仅提供 Python 2 4 的服务器上运行 CSV 文件根本不引用字段值 但Python 2 4版本的csv库 http ww
  • 将数字转换为整数列表[重复]

    这个问题在这里已经有答案了 我该如何写magic下面的函数 gt gt gt num 123 gt gt gt lst magic num gt gt gt gt gt gt print lst type lst 1 2 3
  • 将 2D Panda 的 DataFrame 列表转换为 3D DataFrame

    我正在尝试创建一个将标签值保存到 2D DataFrame 的 Pandas DataFrame 这是我到目前为止所做的 我正在使用读取 csv 文件pd read csv并将它们附加到列表中 出于这个问题的目的 让我们考虑以下代码 imp
  • Python 中嵌套列表的排序和分组

    我有以下数据结构 列表的列表 4 21 1 14 2008 10 24 15 42 58 3 22 4 2somename 2008 10 24 15 22 03 5 21 3 19 2008 10 24 15 45 45 6 21 1 1
  • 如何使用appium自动化Android手机后退按钮

    我正在使用 Appium python 客户端库 对 Android 上的混合移动应用程序进行测试自动化 我无法找到任何方法来自动化或创建手势以使用 电话后退 按钮返回到应用程序的上一页 有没有可以使用的驱动函数 我尝试了 self dri
  • Pygooglevoice登录错误

    另一个人问了这个问题 但没有回复 所以我再问一遍 我正在尝试使用 pygooglevoice API 但是当我运行 SMS py 示例脚本时 它给了我一个登录错误 我已经安装了 Enthought python 我想也许我还需要安装其他东西
  • python - 将cookie添加到cookiejar

    如何在 python 中创建 cookie 并将其添加到 CookieJar 实例 我拥有 cookie 的所有信息 名称 值 域 路径等 但我不想通过 http 请求提取新的 cookie 我尝试了这个 但看起来 SimpleCookie
  • 为什么最简单的 requests_mock 示例在 pytest 中失败?

    我有一个特殊的问题requests mock 我想用它pytest测试我的 API 包装器库 我尝试过使用requests mock 文档中的第一个示例 http requests mock readthedocs io en latest
  • 自定义 Keras 损失函数中的 conv2d

    我正在尝试基于两个图像的拉普拉斯算子在带有 TF 后端的 Keras 中实现自定义损失函数 def blur loss y true y pred weighting of blur loss alpha 1 mae losses mean
  • 自适应支付 API 错误 580001

    我正在 python 中向 paypal 自适应支付 API 发出 PAY 请求 并收到通用错误 id 580001 没有其他信息 headers API credentials for the API caller business ac
  • 使用 matplotlib 设置或固定二元分布值

    I ve animated a bivariate gaussian distribution using matplotlib 我已经计算过这个distribution通过调整COV matrix来考虑特定的变量 我可以提供有关此过程的更
  • 收到“/:未找到事件。”使用 PyCharm 远程调试器时

    当我使用 PyCharm 通过 ssh 进行远程调试时tcsh shell 服务器 很多时候它停止工作 并显示 未找到事件 更具体地说 我在 pycharm 调试控制台中遇到以下内容 ssh username hostserver 22 p
  • 如何使用资源模块来衡量函数的运行时间?

    我想使用Python代码测量函数的CPU运行时间和挂钟运行时间 此处建议资源模块 如何以 Python 代码 不是从终端 的形式分别测量函数的 CPU 运行时间和挂钟运行时间 https stackoverflow com q 192046
  • 在 Python 中伪造一个对象是否是类的实例

    假设我有一堂课FakePerson它模仿基类的所有属性和功能RealPerson 不扩展它 在Python 3中 是否可以伪造isinstance 为了认识到FakePerson as a RealPerson只通过修改对象FakePers
  • 将同一 numpy 数组的两个视图组合成单个视图而不复制数组?

    我有一个大型 2d numpy 数组 我想删除它的子集并处理函数剩下的内容 我需要对许多子集执行此操作 因此理想情况下我不想每次都创建数组的副本 该函数不会更改数组中的任何值 mat np load filename mat 1 mat i
  • 将 .parquet 编码为 io.Bytes

    目标 将 Parquet 文件上传到 MinIO 这需要将文件转换为字节 我已经能够做到这一点了 csv json and txt bytes data to csv encode utf 8 bytes json dumps self d
  • 真实值与预测值的降维可视化

    我有一个数据框 如下所示 label predicted F1 F2 F3 F40 major minor 2 1 4 major major 1 0 10 minor patch 4 3 23 major patch 2 1 11 min

随机推荐

  • C# - Visual Studion 2022 中的多行逐字字符串不包含换行符 (\r)

    我们在定义逐字多行字符串时面临问题 some string 在 Visual Studio 2022 中 虽然我们在 Windows 机器和变量上编译代码Environment NewLine定义 r n作为新行 逐字多行字符串仅包含 n
  • 在 Airflow GUI 外部创建连接

    我想在不与 Airflow GUI 交互的情况下创建 S3 连接 是否可以通过airflow cfg或命令行 我们正在使用 AWS 角色 以下连接参数适用于我们 aws account id xxxx role arn yyyyy 因此 在
  • 适合初学者的 Slim 框架 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 人们如何学习如何使用这个系统 我似乎找不到任何教程或书籍或任何有关如何使用该程序的内容 是的 他们的网站简要解释了一些事情 但没有任何澄清
  • 如何获取WebBrowser控件中的页面标题?

    当我导航到不同的网站时 如何获取 WebBrowser 控件中的页面标题 xmlns xmlns phone clr namespace Microsoft Phone Controls assembly Microsoft Phone 以
  • 为什么Android要求包名至少有两个标识符?

    创建新的 Android 应用程序时 Eclipse http androidcodingtips blogspot com 2011 08 package name must have at least two html抱怨Package
  • 解析附近时 JSON 中位置 XXX 出现意外标记的错误

    I npm install在一个目录上package json对于我的公司项目 然而 它不断给我带来各种错误 Unexpected token in JSON at position 我已经做好了npm cache clean force
  • 在 Bootstrap 3 中启用触摸事件的推荐方法?

    既然 Bootstrap 3 已经发布 那么启用触摸的推荐选项是什么 像之前一样 https stackoverflow com questions 16759299 is twitter bootstrap suitable for to
  • 音频播放完毕后通知

    嗯 我正在尝试实现录音的基本功能 例如 录音 播放 暂停 停止 我可以完成所有这些 但唯一的问题是音频完成后如何收到通知 玩 我的意思是 如果我播放一个音频文件 那么一旦它播放完毕 我想要一个它现在停止的通知 到目前为止我已经用过 mPla
  • 在 Roxygen 中记录时:如何在 @details 中制作逐项列表?

    例如 在 details 部分中向 roxygen2 添加逐项列表的适当语法是什么 我可以创建一个 Latex 列表环境吗 似乎换行符被简单地忽略了 即 details text describing parameter inputs in
  • 错误@angular/fire构建错误地扩展了接口

    我开始新的 Ionic Angular 项目并添加 Angular Fire 包 当我运行 ionicserve 时 出现以下错误 Error node modules angular fire compat firestore inter
  • 忽略全局覆盖的 new/delete

    您好 我正在使用一个已全局覆盖 new delete 的库 但我对这个库有一个问题 问题是它必须在主函数中手动初始化 现在我尝试使用另一个库在调用 main 之前初始化一些函数 不幸的是这个库在这些函数中使用了 new 所以我收到错误 因为
  • 需要建议新的 AsyncTask 递归调用

    我需要建议这个解决方案是否可以接受并且不会导致溢出 我更新使用 AsyncTask 读取的数据 在 AsyncTask 完成后我需要一次又一次更新 该解决方案是否可以接受且安全 private class DownloadFilesTask
  • 如何在sql中转义“'”

    您好 我正在数据库中搜索名称组合 我传递的组合如下 firstName firstName middleName middleName lastName lastName 这很好用 但问题来了 名字里有一些 我该如何纠正呢 例如 Johns
  • MongoDB - 如何对对象内的多个属性进行查询并对结果进行分组

    I m trying学习 MongoDB 但我似乎不知道如何做到这一点 假设我有三个这样的对象 id 99990 type 15 attributes id 1 value 115 id 99991 type 5 attributes
  • Windows 上的 boost python 在 import("__main__") 时崩溃;

    我正在编写一个使用嵌入式 boost python 的程序 我的程序在 Linux Mint 上运行没有问题 但在 Windows 上却很痛苦 我正在使用 MingW 因此我尝试按照本网站上另一个问题的说明创建导入库 考虑到所有这些 程序编
  • 通过 Id (int) 获取视图 Id (string) 的更简单方法

    我的布局中有 24 个按钮 所有这些按钮都执行类似的操作 因此我想创建一个通用功能 但首先我需要知道按钮的名称 xml id 这是按钮的 XML 代码
  • Ada GPS IDE 似乎找不到 GtkAda

    我已经安装了 GNAT 编程工作室 GPS 和 GtkAda 它们似乎都工作正常 但是当我尝试在 从模板新建项目 下构建简单窗口项目时 我收到一堆错误 提示 文件 gtk ads 未找到 这似乎是一个目录 依赖性问题 GPS 不知道在哪里寻
  • UINavigationBar 使用动画更改色调颜色

    是否可以通过动画更改色调以获得更平滑的效果 这对我不起作用 UIView beginAnimations nil context nil self navigationController navigationBar setTintColo
  • Swashbuckle.AspNetCore v1.0.0 与 OAuth2,流程:应用程序 -> IdentityServer4

    我似乎无法让我的 net core Web API 与 swashbuckle OAuth2 和应用程序流程一起工作 当我单击 授权 按钮时 Fiddler 显示调用正常 并且我的本地 IdentityServer 4 回复了 access
  • Theano sqrt 返回 NaN 值

    在我的代码中 我使用 theano 来计算欧几里德距离矩阵 代码来自here https stackoverflow com questions 25886374 pdist for theano tensor import theano