使用scipy.minimize()训练逻辑神经元

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用scipy.minimize()训练逻辑神经元相关的知识,希望对你有一定的参考价值。

我在后勤神经元训练中使用scipy.minimize()时遇到了麻烦。我的成本和梯度功能已经成功测试。

scipy.minimize()向我发回“IndexError:数组索引太多”。我正在使用method ='CG',但这与其他方法相同。

res = minimize(loCostEntro, W, args=(XX,Y,lmbda), method='CG', jac=loGradEntro, options={'maxiter': 500})

W(权重),XX(训练集)和Y(结果)都是numpy 2D数组。

请在下面找到渐变代码和成本函数:

def loOutput(X, W):
   Z = np.dot(X, W)
   O = misc.sigmoid(Z)
   return O


def loCostEntro(W, X, Y, lmbda=0):
   m = len(X)
   O = loOutput(X, W)
   cost = -1 * (1 / m) * (np.log(O).T.dot(Y) + np.log(1 - O).T.dot(1 - Y)) 
       + (lmbda / (2 * m)) * np.sum( np.square(W[1:]))
   return cost[0,0]

def loGradEntro(W, X, Y, lmbda=0):
    m = len(X)
    O = loOutput(X, W)
    GRAD = (1 / m) * np.dot(X.T, (O - Y)) + (lmbda / m) * np.r_[[[0]], W[1:].reshape(-1, 1)]
    return GRAD
答案

感谢this的工作示例,我弄清楚出了什么问题。原因是scipy.minimize()向我的Gradient和Cost函数发送一维权重数组(W),而我的函数仅支持二维数组。

因此,重点解决点积中的W问题如下:

def loOutput(X, W):
   Z = np.dot(X, W.reshape(-1, 1))    # reshape(-1, 1) because scipy.minimize() sends 1-D W !!!
   O = misc.sigmoid(Z)
   return O

顺便说一句,我在修复这个问题后遇到了另一个类似的问题。 Gradient函数应返回1D渐变。所以我补充说:

def loGradEntroFlatten(W, X, Y, lmbda=0):
    return loGradEntro(W, X, Y, lmbda).flatten()

我更新了:

res = minimize(loCostEntro, W, args=(XX,Y,lmbda), method='CG', jac=loGradEntroFlatten, options={'maxiter': 500})

以上是关于使用scipy.minimize()训练逻辑神经元的主要内容,如果未能解决你的问题,请参考以下文章

带有两个方程的 scipy.minimize 仅返回初始值

如何处理 scipy minimize ValueError: no enough values to unpack (expected 4, got 3)?

深度学习:二分分类和部分逻辑回归

神经网络简介

从 0 开始机器学习 - 神经网络反向 BP 算法!

神经网络初始化