python - 平滑逼近用于反向传播的底函数
问题描述
我一直在尝试实现对该np.floor
函数的平滑逼近。我需要一个顺利的实现,因为np.floor
不能在我的程序中反向传播。
我想出了一个涉及许多逻辑函数总和的解决方案,但是当数字很大时性能很糟糕。
import numpy as np
from scipy.special import expit
def multiexpit(x, slope=50):
y = np.asarray([ expit(slope*(x-i)) for i in range(int(np.max(x))) ])
return np.sum(y,axis=0)
if __name__=='__main__':
import matplotlib.pyplot as plt
x = np.linspace(0,10,1000)
plt.plot(x,np.floor(x),label='floor')
plt.plot(x,multiexpit(x-1),label='smooth floor')
然而,结果很好。这里的近似值是针对底函数显示的,带有一个温度参数slope=50
:
我的问题是是否可以使用不依赖于输入值的运行时来实现此功能?张量流有类似的东西吗?我正在使用 numpy 但问题与 TF 相同。
解决方案
如果你想使用重复的expit
,我想没有办法绕过总和,所以你唯一能做的就是让numpy
照顾for
循环。一种方法是使用以下方法将您的 x 值和步骤的位置转换为 2d 数组meshgrid
:
def multiexpit2(x, slope=50):
i = np.arange(int(min(x)//1),int(max(x)//1)+1)
X, I = np.meshgrid(x,i)
return np.sum(expit(slope*(X-I)),axis=0)+min(x)//1-1
min(x)//1-1
为您的 x 值不是从零开始的任何情况添加更正。
推荐阅读
- python - 从词频中删除停用词
- python - 适用于 Linux (WSL 2) 和 Jupyter Lab 的 Windows 子系统:如何打开保存在 Linux 文件系统中的 Jupyter Notebook?
- bash - 远程在 ssh 上运行 for 循环
- vim - 突出显示 txt 文件而不是帮助文件
- javascript - 将异步函数中的数据返回到列表中以供稍后处理(删除异步功能)
- c# - 维护字典中的数据局部性
- html - 按钮不能在 css 中设置样式
- go - 如何使用 Golang 向 LDAP 服务器添加新条目?
- c# - C#为一行信息读取/加载多个图像
- r - 如何链接日期和其他字段?