使用 scipy.optimize 实现具有反向传播的神经网络

计算科学 优化 Python 机器学习
2021-12-21 16:48:40

我的问题与类似。

我正在尝试在 Python 中实现(神经网络)成本函数,反向传播算法。

神经网络有 3 层。因此需要优化 2 个参数(Theta1 和 Theta2;在程序中描述为 T1 和 T2)。

我尝试了上面链接中提供的解决方案,但对我不起作用。

我的成本函数是用以下参数定义的。

def CostFunction(Thetas, X, y, Lambda = None):

    T1 = Thetas[0]
    T2 = Thetas[1]

    if(Lambda == None):
        Lambda = 0
    
    m = X.shape[0]
    # so on.......
    return J, [Theta1_grad, Theta2_grad]

我将如何使用优化上述功能Scipy.optimize.fmin_bfgs

我有以下代码,似乎不起作用:

initial_values = np.zeros([0]))
myargs = (Thetas ,X, y)
def decorated_cost(Thetas):
    return NeuralNetwork.CostFunction(Thetas, X, y, Lambda=1)
print scipy.optimize.fmin_bfgs(decorated_cost, Thetas , maxiter=400)

我需要优化 Theta1 和 Theta2 但 API 只需要 1 个参数作为输入。

此外,由于某种原因,上述代码(经过几次迭代)在优化函数操作时,成本函数的输入参数顺序似乎发生了变化。

1个回答

目标函数应该只返回成本值,而不是梯度。像这样的东西:

def decorated_cost(Thetas, X, y, Lambda):
    return NeuralNetwork.CostFunction(Thetas, X, y, Lambda=Lambda)[0]

initial_values = np.array([0.1, 0.2])
print scipy.optimize.fmin_bfgs(decorated_cost, initial_values, maxiter=400, args=(X, y, 1))

请注意,我[0]在调用CostFunctionin之后添加了decorated_cost

你也可以这样做:

def decorated_cost(Thetas, X, y, Lambda):
    return NeuralNetwork.CostFunction(Thetas, X, y, Lambda=Lambda)[0]

def decorated_gradient(Thetas, X, y, Lambda):
    return NeuralNetwork.CostFunction(Thetas, X, y, Lambda=Lambda)[1]

initial_values = np.array([0.1, 0.2])
print scipy.optimize.fmin_bfgs(decorated_cost, initial_values, maxiter=400, args=(X, y, 1), fprime=decorated_gradient)

但这是低效的。相反CostFunction应该分成两个函数,一个用于目标函数,一个用于梯度。