首页 > 解决方案 > 在 Python 中存储自定义梯度下降算法的每一步中的参数值

问题描述

我正在尝试制作自定义梯度下降估计器,但是,我遇到了在梯度下降算法的每一步存储参数值的问题。这是代码骨架:

from numpy import *
import pandas as pd
from joblib import Parallel, delayed
from multiprocessing import cpu_count

ftemp = zeros((2, )) 
stemp = empty([1, ], dtype='<U10') 
la = 10

vals = pd.DataFrame(index=range(la), columns=['a', 'b', 'string']

def sfun(k1, k2, k3, string):
    a = k1*k2
    b = k2*k3
    s = string

    nums = [a, b]
    strs = [s]

    return(nums, strs)

def store(inp):
    r = rsfun(inp[0], inp[1], inp[2], inp[3])

    ftemp = append(ftemp, asarray(r[0]), axis = 0)
    stemp = append(stemp, asarray(r[1]), axis = 0)
    
    return(ftemp, stemp)

for l in range(la):
    inputs = [(2, 3, 4, 'he'),
              (4, 6, 2, 'je'), 
              (2, 7, 5, 'ke')]

    Parallel(n_jobs = cpu_count)(delayed(store)(i) for i in inputs)

    vals.iloc[l, 0:2] = ftemp[0, 0], ftemp[0, 1]
    vals.iloc[l, 2] = stemp[0]

    d = ftemp[2, 0]-ftemp[0, 0]
    

注意:大部分梯度下降的东西都被删除了,因为我对此没有任何问题。我遇到的主要问题是在每个步骤中存储值。

sfun() 是损失函数(我知道它在这里看起来不像),而 store() 只是尝试存储每个步骤的参数值。

这里的重要方面是我想并行化该过程,因为 sfun() 计算量很大,并且我想为所有并行运行保存值的问题。

我尝试以许多不同的方式解决这个问题,但我总是得到不同的错误。

标签: pythonparallel-processinggradient-descent

解决方案


无需制作临时存储数组,可以通过以下方式直接存储 Parallel() 函数的结果:

a = Parallel(n_jobs = cpu_count)(delayed(store)(i) for i in inputs)

最重要的是,填充 a 是为了给定输入。


推荐阅读