使用 scipy.minimize() 训练逻辑神经元
training a logistic neuron with scipy.minimize()
我在逻辑神经元训练中使用 scipy.minimize() 时遇到问题。
我的成本和梯度函数已经成功测试。
scipy.minimize() 发回 "IndexError: too many indices for array"。
我用的是method='CG',其他方法也一样。
res = minimize(loCostEntro, W, args=(XX,Y,lmbda), method='CG', jac=loGradEntro, options={'maxiter': 500})
W(权重)、XX(训练集)和Y(结果)都是numpy的二维数组。
请在下面找到梯度和成本函数的代码:
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() 将一维权重数组 (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
顺便说一句,我在修复这个问题后遇到了另一个类似的问题。渐变函数应该 return 一维渐变。所以我添加了:
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() 发回 "IndexError: too many indices for array"。 我用的是method='CG',其他方法也一样。
res = minimize(loCostEntro, W, args=(XX,Y,lmbda), method='CG', jac=loGradEntro, options={'maxiter': 500})
W(权重)、XX(训练集)和Y(结果)都是numpy的二维数组。
请在下面找到梯度和成本函数的代码:
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() 将一维权重数组 (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
顺便说一句,我在修复这个问题后遇到了另一个类似的问题。渐变函数应该 return 一维渐变。所以我添加了:
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})