簡體   English   中英

用scipy.minimize()訓練邏輯神經元

[英]training a logistic neuron with 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二維數組。

請在下面找到漸變和成本函數的代碼:

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

多虧了這個有效的例子,我才知道出了什么問題。 原因是scipy.minimize()將1D權重數組(W)發送給我的Gradient和Cost函數,而我的函數僅支持2D數組。

因此,如下所示在點積中重塑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函數應返回一維漸變。 所以我補充說:

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})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM