Math 将scipy.integrate.quad与Tensorflow一起使用
我正在尝试使用scipy.integrate.quad和Tensorflow,如下所示。Math 将scipy.integrate.quad与Tensorflow一起使用,math,tensorflow,scipy,Math,Tensorflow,Scipy,我正在尝试使用scipy.integrate.quad和Tensorflow,如下所示。 time和Lambda是两个具有形状的张量(无,1) 但是,我得到一个错误,如下所示: File "J:\Workspace\Distributions.py", line 30, in <lambda> args=(x[1],)), File "I:\Anaconda3\envs\tensorflow\lib\site-packages\scipy\integrate\quadpa
time
和Lambda
是两个具有形状的张量(无,1)
但是,我得到一个错误,如下所示:
File "J:\Workspace\Distributions.py", line 30, in <lambda>
args=(x[1],)),
File "I:\Anaconda3\envs\tensorflow\lib\site-packages\scipy\integrate\quadpack.py", line 323, in quad
points)
File "I:\Anaconda3\envs\tensorflow\lib\site-packages\scipy\integrate\quadpack.py", line 388, in _quad
return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)
TypeError: a float is required
文件“J:\Workspace\Distributions.py”,第30行,在
args=(x[1],),
文件“I:\Anaconda3\envs\tensorflow\lib\site packages\scipy\integrate\quadpack.py”,第323行,四行
积分)
文件“I:\Anaconda3\envs\tensorflow\lib\site packages\scipy\integrate\quadpack.py”,第388行,在_quad中
返回_quadpack._qagse(func、a、b、args、full输出、epsabs、epsrel、limit)
TypeError:需要浮点
X[0]是形状为()的张量。它不是计算前的浮点值。有可能解决这个问题吗?我应该如何计算Tensorflow中的积分?如果您至少有Tensorflow 1.8.0,那么最好使用以下代码(经过测试):
from\uuuuu future\uuuuu导入打印功能
导入tensorflow作为tf
断言tf.VERSION>=“1.8.0”,“此代码仅适用于TensorFlow 1.8.0或更高版本。”
def f(y,a):
返回a*a
x=tf.常数([0.0,1.0,2,3,4],dtype=tf.float32)
i=tf.contrib.integrate.odeint_fixed(f,0.0,x,method=“rk4”)
使用tf.Session()作为sess:
res=sess.run(i)
打印(res)
将输出:
[0.0.33333334 2.66667 9.21.333334]
按照上述x=[0,1,2,3,4]
的规定,在[0,0]、[0,2]、[0,3]和[0,4]间隔内正确集成x2。(x2的原始函数是⅓x3,例如43/3=64/3=21⅓强>)
否则,对于早期的TensorFlow版本,下面介绍如何修复代码 因此,主要的问题是必须使用将Python函数(在本例中)映射到张量上。将映射其他TensorFlow操作和过程,并期望将张量作为操作数。因此,
x[0]
永远不会是一个简单的浮点,它将是一个标量张量,不知道如何处理它
除非您想手动循环numpy阵列,否则您无法完全摆脱这两种方法
此外,返回一个double(float64),而张量是float32
我已经简化了你的代码很多,因为我无法访问它的其余部分,与这个问题的核心相比,它看起来太复杂了。以下代码(已测试):
from\uuuuu future\uuuuu导入打印功能
导入tensorflow作为tf
从scipy导入集成
定义f(a):
返回a*a
def集成(f,x):
返回tf.map_fn(lambda y:tf.py_func(
lambda z:integrate.quad(f,0.0,z)[0],[y],tf.float64),
十)
x=tf.constant([1.0,2,3,4],dtype=tf.float64)
i=集成(f,x)
使用tf.Session()作为sess:
res=sess.run(i)
打印(res)
还将输出:
[0.33333333 2.66666667 9.21.33333333]
如果您至少有TensorFlow 1.8.0,那么最好使用以下代码(已测试):
from\uuuuu future\uuuuu导入打印功能
导入tensorflow作为tf
断言tf.VERSION>=“1.8.0”,“此代码仅适用于TensorFlow 1.8.0或更高版本。”
def f(y,a):
返回a*a
x=tf.常数([0.0,1.0,2,3,4],dtype=tf.float32)
i=tf.contrib.integrate.odeint_fixed(f,0.0,x,method=“rk4”)
使用tf.Session()作为sess:
res=sess.run(i)
打印(res)
将输出:
[0.0.33333334 2.66667 9.21.333334]
按照上述x=[0,1,2,3,4]
的规定,在[0,0]、[0,2]、[0,3]和[0,4]间隔内正确集成x2。(x2的原始函数是⅓x3,例如43/3=64/3=21⅓强>)
否则,对于早期的TensorFlow版本,下面介绍如何修复代码 因此,主要的问题是必须使用将Python函数(在本例中)映射到张量上。将映射其他TensorFlow操作和过程,并期望将张量作为操作数。因此,
x[0]
永远不会是一个简单的浮点,它将是一个标量张量,不知道如何处理它
除非您想手动循环numpy阵列,否则您无法完全摆脱这两种方法
此外,返回一个double(float64),而张量是float32
我已经简化了你的代码很多,因为我无法访问它的其余部分,与这个问题的核心相比,它看起来太复杂了。以下代码(已测试):
from\uuuuu future\uuuuu导入打印功能
导入tensorflow作为tf
从scipy导入集成
定义f(a):
返回a*a
def集成(f,x):
返回tf.map_fn(lambda y:tf.py_func(
lambda z:integrate.quad(f,0.0,z)[0],[y],tf.float64),
十)
x=tf.constant([1.0,2,3,4],dtype=tf.float64)
i=集成(f,x)
使用tf.Session()作为sess:
res=sess.run(i)
打印(res)
还将输出:
[0.33333333 2.66666667 9.21.33333333]
谢谢我计划通过学习优化Lambda。然而,使用集成。Quad似乎切断了中间变量LAMBDA和最终训练操作之间的连接。所以我得到了
ValueError:没有为任何变量提供梯度当然,很乐意帮忙!:)是的,integrate.quad()
不实现渐变操作。您需要编写自己的带有渐变操作的层,以便能够通过它进行训练。好消息是原始函数的导数就是原始函数。:)添加了基于tf.contrib的代码版本。
File "J:\Workspace\Distributions.py", line 30, in <lambda>
args=(x[1],)),
File "I:\Anaconda3\envs\tensorflow\lib\site-packages\scipy\integrate\quadpack.py", line 323, in quad
points)
File "I:\Anaconda3\envs\tensorflow\lib\site-packages\scipy\integrate\quadpack.py", line 388, in _quad
return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)
TypeError: a float is required