Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何强制scipy.optimize.fmin_l_bfgs_b使用';dtype=float32';_Python_Optimization_Scipy_Gpu_Multidimensional Array - Fatal编程技术网

Python 如何强制scipy.optimize.fmin_l_bfgs_b使用';dtype=float32';

Python 如何强制scipy.optimize.fmin_l_bfgs_b使用';dtype=float32';,python,optimization,scipy,gpu,multidimensional-array,Python,Optimization,Scipy,Gpu,Multidimensional Array,我试图用Python中的GPU计算来优化函数,所以我更喜欢用dtype=float32将所有数据存储为ndarray 当我使用scipy.optimize.fmin_l_bfgs_b时,我注意到优化器总是将float64(在我的64位机器上)参数传递给我的目标函数和梯度函数,即使我将float32ndarray作为初始搜索点x0。当我使用cg优化器scipy.optimize.fmin_cg时,这是不同的,当我将float32数组作为x0传递时,优化器将在所有后续目标/梯度函数调用中使用floa

我试图用Python中的GPU计算来优化函数,所以我更喜欢用
dtype=float32
将所有数据存储为ndarray

当我使用
scipy.optimize.fmin_l_bfgs_b
时,我注意到优化器总是将
float64
(在我的64位机器上)参数传递给我的目标函数和梯度函数,即使我将
float32
ndarray作为初始搜索点
x0
。当我使用cg优化器
scipy.optimize.fmin_cg
时,这是不同的,当我将float32数组作为
x0
传递时,优化器将在所有后续目标/梯度函数调用中使用
float32

所以我的问题是:我可以强制执行
scipy.optimize.fmin_l_bfgs_b
来优化
float32
参数,比如
scipy.optimize.fmin_cg


谢谢

我不确定你是否能做到
fmin_l_bfgd_b
不是由纯python代码提供的,而是由一个扩展(FORTRAN代码的包装)提供的。在Win32/64平台中,可以在
\scipy\optimize\\u lbfgsb.pyd
中找到它。只有当您能够以不同的方式编译扩展或修改FORTRAN代码时,您所需要的才可能实现。如果您检查FORTRAN代码,它到处都是
双精度
,基本上是
float64
。我不确定仅仅将它们全部改为
单精度
就能完成这项工作


在其他优化方法中,
cobyla
也是由FORTRAN提供的。鲍威尔的方法也是如此。

我不确定你是否能做到这一点
fmin_l_bfgd_b
不是由纯python代码提供的,而是由一个扩展(FORTRAN代码的包装)提供的。在Win32/64平台中,可以在
\scipy\optimize\\u lbfgsb.pyd
中找到它。只有当您能够以不同的方式编译扩展或修改FORTRAN代码时,您所需要的才可能实现。如果您检查FORTRAN代码,它到处都是
双精度
,基本上是
float64
。我不确定仅仅将它们全部改为
单精度
就能完成这项工作


在其他优化方法中,
cobyla
也是由FORTRAN提供的。鲍威尔的方法也是。

谢谢你,是的,我绝对不想修改FORTRAN代码来破坏兼容性。我可以想到的一种替代方法是在传入和传出
fmin_l_bfgs_b
函数时劫持参数控件-因此在我的目标/梯度函数中,传递的参数值将被强制转换为
float32
,当返回目标/梯度值时,它们将再次显式转换为
float64
。它解决了这个问题,但我怀疑这是一个性能上的损失——我不知道GPU的加速是否值得花费这么多的开销。是的,我也想到了野蛮的强制方法。您必须使用
l_bfgs_b
的原因是为了启用约束/边界,对吗?如果是这样的话,也许你可以稍微修改一下你的目标,比如使用拉格朗日乘数,这样你的函数自然有界/约束。这样,您就不会再被
l\u bfgs\u b
所困扰。我还想知道显式类型转换是否会取消GPU的好处。老实说,我对此感觉不太好,但如果你的结果正好相反,我会非常高兴。大多数时候我都是用它来解决机器学习问题,而这些问题通常是不受约束的。L-BFGS和SGD是当今机器学习中最受欢迎的优化器,因为SGD可以非常快地移动到有前途的领域,L-BFGS将完善解决方案。:)谢谢你指出这一点,知道这一点在其他学科中很流行总是好的。值得一试,问问L-BFGS-B的作者,对FORTRAN代码的一些小修改可能就是您所需要的。干杯谢谢,是的,我绝对不想修改FORTRAN代码来破坏兼容性。我可以想到的一种替代方法是在传入和传出
fmin_l_bfgs_b
函数时劫持参数控件-因此在我的目标/梯度函数中,传递的参数值将被强制转换为
float32
,当返回目标/梯度值时,它们将再次显式转换为
float64
。它解决了这个问题,但我怀疑这是一个性能上的损失——我不知道GPU的加速是否值得花费这么多的开销。是的,我也想到了野蛮的强制方法。您必须使用
l_bfgs_b
的原因是为了启用约束/边界,对吗?如果是这样的话,也许你可以稍微修改一下你的目标,比如使用拉格朗日乘数,这样你的函数自然有界/约束。这样,您就不会再被
l\u bfgs\u b
所困扰。我还想知道显式类型转换是否会取消GPU的好处。老实说,我对此感觉不太好,但如果你的结果正好相反,我会非常高兴。大多数时候我都是用它来解决机器学习问题,而这些问题通常是不受约束的。L-BFGS和SGD是当今机器学习中最受欢迎的优化器,因为SGD可以非常快地移动到有前途的领域,L-BFGS将完善解决方案。:)谢谢你指出这一点,知道这一点在其他学科中很流行总是好的。值得一试,问问L-BFGS-B的作者,对FORTRAN代码的一些小修改可能就是您所需要的。干杯