【问题标题】:fmin_cg function usage for minimizing neural network cost functionfmin_cg 函数用于最小化神经网络成本函数
【发布时间】:2014-02-03 21:27:07
【问题描述】:

我正在尝试将我的一些代码从 MatLab 移植到 Python 中,并且遇到了 scipy.optimize.fmin_cg 函数的问题 - 这是我目前拥有的代码:

我的成本函数:

def nn_costfunction2(nn_params,*args):
    Theta1, Theta2 = reshapeTheta(nn_params)

    input_layer_size, hidden_layer_size, num_labels, X, y, lam = args[0], args[1], args[2], args[3], args[4], args[5]   

    m = X.shape[0] #Length of vector
    X = np.hstack((np.ones([m,1]),X)) #Add in the bias unit

    layer1 = sigmoid(Theta1.dot(np.transpose(X))) #Calculate first layer
    layer1 = np.vstack((np.ones([1,layer1.shape[1]]),layer1)) #Add in bias unit
    layer2 = sigmoid(Theta2.dot(layer1))

    y_matrix = np.zeros([y.shape[0],layer2.shape[0]]) #Create a matrix where vector position of one corresponds to label
    for i in range(y.shape[0]):
        y_matrix[i,y[i]-1] = 1

    #Cost function
    J = (1/m)*np.sum(np.sum(-y_matrix.T.conj()*np.log(layer2),axis=0)-np.sum((1-y_matrix.T.conj())*np.log(1-layer2),axis=0))
    #Add in regularization
    J = J+(lam/(2*m))*np.sum(np.sum(Theta1[:,1:].conj()*Theta1[:,1:])+np.sum(Theta2[:,1:].conj()*Theta2[:,1:]))

    #Backpropagation with vectorization and regularization
    delta_3 = layer2 - y_matrix.T
    r2 = delta_3.T.dot(Theta2[:,1:])
    z_2 = Theta1.dot(X.T)
    delta_2 = r2*sigmoidGradient(z_2).T
    t1 = (lam/m)*Theta1[:,1:]
    t1 = np.hstack((np.zeros([t1.shape[0],1]),t1))
    t2 = (lam/m)*Theta2[:,1:]
    t2 = np.hstack((np.zeros([t2.shape[0],1]),t2))
    Theta1_grad = (1/m)*(delta_2.T.dot(X))+t1
    Theta2_grad = (1/m)*(delta_3.dot(layer1.T))+t2

    nn_params = np.hstack([Theta1_grad.flatten(),Theta2_grad.flatten()]) #Unroll parameters

    return nn_params

我对函数的调用:

args = (input_layer_size, hidden_layer_size, num_labels, X, y, lam)
fmin_cg(nn_costfunction2,nn_params, args=args,maxiter=50)

给出以下错误:

  File "C:\WinPython3\python-3.3.2.amd64\lib\site-packages\scipy\optimize\optimize.py", line 588, in approx_fprime
    grad[k] = (f(*((xk+d,)+args)) - f0) / d[k]

ValueError: setting an array element with a sequence.

我在将参数传递给 fmin_cg 时尝试了各种排列,但这是我得到的最远的。单独运行成本函数不会以这种形式抛出任何错误。

【问题讨论】:

    标签: python matlab machine-learning scipy neural-network


    【解决方案1】:

    成本函数中的输入变量应该是一维数组。因此,J 中的 Theta1Theta2 必须派生自 nn_params。你也需要return J

    【讨论】:

    • 我接受了解决方案,因为只返回 J 似乎没有遇到同样的错误。然后我的问题是我的错误没有最小化(因为我没有返回nn_params)。你如何返回nn_params 而不是在 fmin_cg 期望你只返回标量的问题中运行?在 MatLab 中,您可以同时输出梯度和成本。
    • @Matt,您需要在调用 fmin_cg 之前初始化 nn_params,然后希望优化函数会为您更新 nn_params。
    • 是的,我通过首先生成 Theta1 然后生成 Theta2 并将它们展开到 nn_params 来随机初始化 nn_params。目前,我的nn_costfunction2 只返回J 有问题吗?当我尝试返回 nn_params 时,我收到一个错误,指出它是类型元组不支持的操作数(即,当我同时返回 Jnn_params 时)。
    • 最后我使用来自以下地方的信息来解决我的second issue。我的最终函数是scipy.optimize.minimize,设置如下res = minimize(nn_costfunction2, init_params, args=args, method='CG', options={'maxiter':50,'disp':True})nn_costfunction2 设置为返回J,grad。感谢您的帮助!
    • 这是一个很好的解决方案!也谢谢你!
    【解决方案2】:

    尝试在函数调用中添加epsilon参数:

    fmin_cg(nn_costfunction2,nn_params, args=args,epsilon,maxiter=50)
    

    【讨论】:

      【解决方案3】:

      我看到这个问题是因为你让 nnCostFunction2 返回成本和毕业。

      但 scipy.optimize.fmin_cg 函数只会采用 nnCostFunction2 的单一成本输出。

      因此保留来自 nnCostFunction2 函数的单个 J 或成本输出。

      这是我正在工作的函数:

      scipy.optimize.fmin_cg(nnCostFunction, initial_rand_theta, backpropagate, \ args=(hidden_s, input_s, num_labels, X, y, lamb), maxiter=1000, \ disp=True, full_output=True)

      【讨论】:

        猜你喜欢
        • 2020-02-29
        • 2021-05-20
        • 2012-07-07
        • 1970-01-01
        • 2016-07-27
        • 2022-01-01
        • 2014-02-21
        • 1970-01-01
        • 2015-08-04
        相关资源
        最近更新 更多