【发布时间】:2020-10-27 05:59:02
【问题描述】:
我需要使用特定非线性函数的泰勒级数扩展 (e^x or log(x) or log(1+e^x)) 对来自 1 个暗像素向量的每个像素值进行非线性扩展,但至少基于泰勒级数,我目前的实现不适合我概念。背后的基本直觉是将像素阵列作为 CNN 模型的输入神经元,其中每个像素都应该通过非线性函数的泰勒级数展开进行非线性展开。
新更新 1:
根据我对泰勒级数的理解,泰勒级数是根据函数F 的值为变量x 的函数F 编写的,它是变量x0 的另一个值的导数。在我的问题中,F 是特征(又名像素)的非线性变换的函数,x 是每个像素值,x0 是麦克劳林级数逼近为 0。
新更新 2
如果我们使用log(1+e^x) 的泰勒级数,近似阶数为 2,则每个像素值将通过取泰勒级数的第一个和第二个展开项产生两个新像素。
图解
这是上述公式的图解说明:
其中X是像素数组,p是泰勒级数的近似阶,α是泰勒展开系数。
我想用非线性函数的泰勒级数展开来非线性地展开像素向量,如上图所示。
我目前的尝试
这是我当前的尝试,它不适用于像素阵列。我在考虑如何使同样的想法适用于像素数组。
def taylor_func(x, approx_order=2):
x_ = x[..., None]
x_ = tf.tile(x_, multiples=[1, 1, approx_order+ 1])
pows = tf.range(0, approx_order + 1, dtype=tf.float32)
x_p = tf.pow(x_, pows)
x_p_ = x_p[..., None]
return x_p_
x = Input(shape=(4,4,3))
x_new = Lambda(lambda x: taylor_func(x, max_pow))(x)
我的新尝试:
x_input= Input(shape=(32, 32,3))
def maclurin_exp(x, powers=2):
out= 0
for k in range(powers):
out+= ((-1)**k) * (x ** (2*k)) / (math.factorial(2 * k))
return res
x_input_new = Lambda(lambda x: maclurin_exp(x, max_pow))(x_input)
这种尝试不会产生上述数学公式所描述的内容。我敢打赌我在扩展时错过了一些东西。谁能指出我如何纠正这个问题?有更好的主意吗?
目标
我想采用像素向量并通过某些非线性函数的泰勒级数展开来进行非线性分布或展开。有没有办法做到这一点?有什么想法吗?谢谢
【问题讨论】:
-
嗨,Jared,你能澄清一下你的想法吗?我不明白你写的方程式。您是否尝试将大小为
N的输入图像替换为M与像素值x[i]的大小为pN的连接数组M与形式为x[i]**k的元素块,与k=1...p和p作为泰勒级数的截断幂? -
我想这是我不完全理解的部分。泰勒级数是为变量
x的函数F编写的,根据函数F的值,它是变量x0的另一个值的导数。所以当你说expand pixel vector with Taylor series expansion时,我不清楚函数是什么,变量是什么。函数是否代表像素的值,而变量是其在二维数组中的坐标(离散值)? -
看不懂
function is Taylor expansion of non-linear function的概念。考虑一个简单的幂 2 截断 Taylor series,就像它在您的原始帖子F(x) = F(x0) + F'(x0)*(x-x0) + 0.5*F''(x0)*(x-x0)**2中一样。什么F、x和x0在这里?如果x是原图,那么x0是什么? -
我有一些想法。第一个是 log(0) 和 ln(0) 渐近到负无穷大。另外,我正在做一个泰勒级数扩展,因为它更灵活。但今晚或明天我应该有东西给你。私聊也没问题。
-
您知道,我正在努力为您提供最灵活和最完整的答案,我可以给出我理解的问题。我首先关注代码,因为这是您提出的问题。至于样条,我有点需要看看它会融入你正在做的事情中。
标签: python tensorflow conv-neural-network nonlinear-functions taylor-series