我想使用scipy.optimize.check_grad
来检查我的sigmoid function实现的梯度;下面是我的Python函数:
def sigmoid(x, gradient=False):
y = 1 / (1 + numpy.exp(-x))
return numpy.multiply(y, 1 - y) if gradient else y
下面是参数和对check_grad
的调用:
x0 = numpy.random.uniform(-30, 30, (4, 5))
func = sigmoid
grad = lambda x: sigmoid(x, gradient=True)
error = scipy.optimize.check_grad(func, grad, x0)
下面是错误。形状失配指的是操作xk+d
。知道是什么导致的吗
文件“scipy\optimize\optimize.py”,第597行,在approx_fprime中
grad[k] =(f(*((xk+d,)+args))- f0)/ d[k]
ValueError:操作数无法与形状一起广播(4,5)(4)
2条答案
按热度按时间z2acfund1#
你得到的错误是因为
check_gradient
只接受平面点数组。如果你使用一个形状为(20,)
的数组x0
而不是(4, 5)
,它应该可以工作。但事实并非如此!下面是我的安装中
approx_fprime
的实现(scipy.__version__ = '0.9.0'
):我已经看过它好几次了,很难相信如此糟糕的代码会出现在scipy发行版中,我相信我一定错过了什么。但恐怕这是不对的。如果将其替换为:
现在它为我工作。使用
x0.shape = (20,)
,可以得到:关于
x0.shape = (4, 5)
:因此,它似乎真的没有准备好在其他地方的非平面阵列了。但无论哪种方式,实现都非常破碎:你应该提交一份bug报告。
rqdpfwrv2#
关于你的代码(需要 * 矢量化 * -如果你确实需要-做 flatten() 或 ravel()):
但通常情况下,
objective_func
只用于y_target
的一个x_point
投影,从x0=guess
开始优化。在最简单的代码版本中:?如果假设initial_guess只有一个x,则
guess=x0
必须是[0,]
P.S.
optimize.check_grad()
在内部使用optimize.approx_fprime()
,最新的计算是从一个点投影到y [本地]. OR可以分析计算(使用SymPy或手动计算,如docs的示例):将numpy作为np从scipy import optimize导入