Numpy 为什么GPflow';s Scipy优化器与使用tf.function修饰优化步骤不兼容?

Numpy 为什么GPflow';s Scipy优化器与使用tf.function修饰优化步骤不兼容?,numpy,tensorflow,tensorflow2.0,tensorflow-datasets,gpflow,Numpy,Tensorflow,Tensorflow2.0,Tensorflow Datasets,Gpflow,我提供不同的小批量优化GPflow模型(SVGP)。如果我用tf.函数装饰optimization\u步骤,我会得到以下错误: NotImplementedError:无法将符号张量(concat:0)转换为 numpy数组。此错误可能表示您正试图通过 不支持NumPy调用的张量 为了让优化器运行,我不得不删除tf.functiondecorator,失去了加速的优势。为了继续使用tf.functiondecorator,我需要更改什么 xAndY输入的形状和类型都是numpy数组 类型(xAn

我提供不同的小批量优化GPflow模型(SVGP)。如果我用
tf.函数装饰
optimization\u步骤
,我会得到以下错误:

NotImplementedError:无法将符号张量(concat:0)转换为 numpy数组。此错误可能表示您正试图通过 不支持NumPy调用的张量

为了让优化器运行,我不得不删除
tf.function
decorator,失去了加速的优势。为了继续使用
tf.function
decorator,我需要更改什么

xAndY
输入的形状和类型都是
numpy
数组

类型(xAndY)
Out[71]:元组
xAndY[0]。形状
Out[72]:(245760,2)
xAndY[1]。形状
Out[73]:(245760,1)
类型(xAndY[0])
Out[74]:numpy.ndarray
def run_optimizer_on_minibatch_size(模型、迭代、minibatch_size、xAndY):
"""
运行Scipy优化器的实用程序函数
:param model:GPflow model
:参数迭代次数:迭代次数
"""
N=xAndY[0]。形状[0]
张量_数据=元组(映射(tf.convert_to_tensor,xAndY))
train_dataset=tf.data.dataset.from_tensor_切片(tensor_data).repeat().shuffle(N)
logf=[]
国际热核试验堆=国际热核试验堆(国际热核试验堆数据集批量(小批量))
培训损失=模型。培训损失关闭(培训iter,编译=真)
optimizer=gpflow.optimizers.Scipy()
@tf.function必须移除这个装饰器
def优化_步骤():
最小化(训练损失、模型、可训练变量)
#步长=0
对于步进范围(迭代):
优化步骤()
如果步骤%10==0:
elbo=-training_loss().numpy()
logf.append(elbo)
印刷品(厄尔博)
返回日志
从gpflow.ci_utils导入ci_niter
最大值=单位(20000)
logf=在小批量大小(m,最大,小批量大小,(X,Y))上运行优化程序

GPflow的
GPflow.optimizers.Scipy()
是围绕Scipy的minimize()的包装,当它调用非TensorFlow操作时,您不能将其包装在
tf.function
中。此外,Scipy的minimize中实现的优化器是二阶方法,它们假设梯度不是随机的,并且与minibacking不兼容

如果您想使用Scipy进行全批量优化:默认情况下,
gpflow.optimizers.Scipy()
minimize()
方法会将目标和梯度计算封装在
tf.function
中(请参阅其
compile
参数的默认值
True
)。它还进行完全优化,因此您只需调用
minimize()
方法一次(默认情况下,它运行到收敛或无法继续优化为止;您可以使用
options=dict(maxiter=1000)
参数提供最大迭代次数)


如果您想使用迷你批处理:只需使用一个TensorFlow优化器,例如
tf.optimizers.Adam()
,那么您的代码应该运行良好,包括
@tf.function
函数上的
函数(在这种情况下,您确实需要像示例中那样在循环中调用它)。

,将函数编译为可调用的TensorFlow图,因此它只接受一个tensor类型。你可以使用我认为行
tensor\u data=tuple(map(tf.convert\u to\u tensor,xAndY))
已经这样做了。可能在某个地方缺少另一个转换…
train\u iter=iter(train\u dataset.batch(minibatch\u size))
,这也应该是同样的问题,一般来说tensorflow图不能直接处理非tensorflow代码,限制在其范围内,所以
中的所有python代码都可以在minibatch\u size(…)上运行优化程序,尝试转换优化器。最小化(训练损失、模型、可训练变量)
、参数。