Python中用scipy.optimize.minimize最小化逻辑函数报错如何解决
错误原因
你遇到的报错核心是输入代价函数的参数长度和维度不符合要求,具体问题有两个:
- 参数长度不匹配:你的代价函数需要输入的theta_conca总长度为
25*401 + 10*26 = 10285,而你生成的theta_random长度是样本数m(从报错信息可知m=5000),长度远小于要求,reshape操作自然失败。 - 参数维度错误:
scipy.optimize.minimize要求初始值x0为一维数组,你生成的是形状为(m, 1)的二维数组,也会导致后续处理异常。
修正方案
步骤1:生成符合要求的初始参数
建议初始参数范围控制在[-0.1, 0.1],避免初始值过大导致sigmoid函数进入饱和区,梯度消失:
# 计算总参数个数 total_param_num = 25 * 401 + 10 * 26 # 生成一维随机初始参数 theta_random = numpy.random.uniform(low=-0.1, high=0.1, size=total_param_num)
步骤2:调用minimize执行最小化
如果没有手动实现梯度函数,可以让scipy自动计算数值梯度,也可以指定迭代次数等参数:
import scipy.optimize # 执行最小化 minimize_result = scipy.optimize.minimize( fun=computecost, x0=theta_random, method='BFGS', jac=False, # 表示使用数值梯度,如果你自己实现了梯度函数可以替换成函数名 options={'maxiter': 1000, 'disp': True} ) # 拆分得到最优权重 opt_theta = minimize_result.x opt_theta1 = numpy.reshape(opt_theta[0:10025], (25, 401)) opt_theta2 = numpy.reshape(opt_theta[10025:10285], (10, 26))
额外优化建议
- 可以手动实现反向传播的梯度函数传给
jac参数,相比数值梯度速度提升非常明显,精度也更高。 - 可以优化sigmoid函数的实现,避免输入值过大/过小的时候出现数值溢出警告。
内容的提问来源于stack exchange,提问作者user15515518
相关产品推荐
相关产品推荐

