在Hyperopt中,只能将整数标量数组转换为标量索引错误

2024-09-30 08:36:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用Hyperopt库优化一组参数。我在this教程之后实现了代码。只要我把max_evals设置为少于30次,一切正常。当我将max_evals设置为30时,我在第20次迭代时得到以下错误:

Traceback (most recent call last): File "/Users/sulekahelmini/Documents/fyp/fyp_work/MLscripts/Optimizehyperopt.py", line 149, in trials=trials) File "/Users/sulekahelmini/Documents/fyp/condaEnv/envConda/lib/python3.7/site-packages/hyperopt/fmin.py", line 482, in fmin show_progressbar=show_progressbar, File "/Users/sulekahelmini/Documents/fyp/condaEnv/envConda/lib/python3.7/site-packages/hyperopt/base.py", line 686, in fmin show_progressbar=show_progressbar, File "/Users/sulekahelmini/Documents/fyp/condaEnv/envConda/lib/python3.7/site-packages/hyperopt/fmin.py", line 509, in fmin rval.exhaust() File "/Users/sulekahelmini/Documents/fyp/condaEnv/envConda/lib/python3.7/site-packages/hyperopt/fmin.py", line 330, in exhaust self.run(self.max_evals - n_done, block_until_done=self.asynchronous) File "/Users/sulekahelmini/Documents/fyp/condaEnv/envConda/lib/python3.7/site-packages/hyperopt/fmin.py", line 266, in run new_ids, self.domain, trials, self.rstate.randint(2 ** 31 - 1) File "/Users/sulekahelmini/Documents/fyp/condaEnv/envConda/lib/python3.7/site-packages/hyperopt/tpe.py", line 939, in suggest idxs, vals = pyll.rec_eval(posterior, memo=memo, print_node_on_error=False) File "/Users/sulekahelmini/Documents/fyp/condaEnv/envConda/lib/python3.7/site-packages/hyperopt/pyll/base.py", line 911, in rec_eval rval = scope._impls[node.name](*args, **kwargs) File "/Users/sulekahelmini/Documents/fyp/condaEnv/envConda/lib/python3.7/site-packages/hyperopt/tpe.py", line 430, in adaptive_parzen_normal srtd_mus[:prior_pos] = mus[order[:prior_pos]] TypeError: only integer scalar arrays can be converted to a scalar index

下面是我的代码,我做错了什么?

from hyperopt import hp, tpe, fmin, Trials, STATUS_OK
import hyperopt.pyll.stochastic
import pandas as pd
import sys
import subprocess
import csv
import argparse


space={}
fileName="JVMFlags_GC_Com.csv"
isFirstRun="False"

def ConstructSpace(df):

    dependent= None
    for row in df.itertuples():

        if(row.Type == "int" or row.Type=="positive int"):
            if(not (pd.isnull(row.Range))):
                split_range = str(row.Range).split("/")
            else:
                if(sys.maxsize > 2**32):
                    split_range = str(row.OS_64).split("/")
                else:
                    split_range = str(row.OS_32).split("/")

            if(row.Name == "ms"):
                dependent = hp.uniform(row.Name,int(split_range[0]),int(split_range[1]))
                space[row.Name] = dependent
                continue
            elif(row.Name == "mx"):
                space[row.Name] = hp.uniform(row.Name, dependent, int(split_range[1]))
            else:
                space[row.Name] = hp.uniform(row.Name,int(split_range[0]),int(split_range[1]))

        elif(row.Type == "bool"):
            space[row.Name] = hp.choice(row.Name, [True,False])

        elif(row.Type =="choice"):
            split_range = str(row.Range).split("_")
            choice_list=[]
            for element in split_range:
                choice_list.append(element)
            space[row.Name] = hp.choice(row.Name, choice_list)


def WriteFlags(param):

    df = pd.read_csv(fileName)

    with open("flags.txt", "w") as flag_file:
        for row in df.itertuples():

            if(row.Type == "bool"):
                if(param[row.Name]):
                    flagName = "-XX:+"+row.Name
                else:
                    flagName = "-XX:-" + row.Name


            elif (row.Name == "ms" or row.Name == "mx"):
                tempVal= int(float(param[row.Name]))
                flagName = "-X" + row.Name + str(tempVal)
            elif(row.Type == "int" or row.Type=="positive int" or row.Type =="choice"):
                tempVal = int(float(param[row.Name]))
                flagName = "-XX:" + row.Name+"="+ str(tempVal)

            flag_file.write(flagName+" ")

def WriteCsv(param):

    df = pd.read_csv(fileName)
    latency_res = pd.read_csv("agg_test.csv")

    with open('temp_opt_res.csv', mode='a') as opt_file:
        writer = csv.writer(opt_file, delimiter=',')
        valuList=[]

        for row in df.itertuples():
            valuList.append(int(float(param[row.Name])))

        bottom = latency_res.tail(1)
        valuList.append(bottom["Average"].values[0])
        valuList.append(bottom["Median"].values[0])
        valuList.append(bottom["90% Line"].values[0])
        valuList.append(bottom["95% Line"].values[0])
        valuList.append(bottom["99% Line"].values[0])
        valuList.append(bottom["Error %"].values[0])
        valuList.append(bottom["Throughput"].values[0])
        writer.writerow(valuList)


def HyperparameterTuning(param):
    WriteFlags(param)
    subprocess.check_call(['./microwise.sh', isFirstRun])
    WriteCsv(param)
    latency_vals = pd.read_csv("agg_test.csv")
    bottom = latency_vals.tail(1)
    print(bottom["99% Line"].values[0])

    return {'loss': bottom["99% Line"].values[0], 'status': STATUS_OK}


if __name__ == "__main__":

    df = pd.read_csv(fileName)
    ConstructSpace(df)

    with open('temp_opt_res.csv', mode='w') as opt_file:
            writer = csv.writer(opt_file, delimiter=',')
            flagList = df['Name'].tolist()
            flagList.append("Average")
            flagList.append("Median")
            flagList.append("90%")
            flagList.append("95%")
            flagList.append("99%")
            flagList.append("Error%")
            flagList.append("Throughput")
            writer.writerow(flagList)

    # parser = argparse.ArgumentParser(description='Short sample app')
    # parser.add_argument('--fileName', action="store", dest='fileName')
    # parser.add_argument('--isFirstIteration', action="store", dest='isFirstIteration')
    # parser.add_argument('--isFirstRun', action="store", dest='isFirstRun')
    # args = parser.parse_args()
    #
    # fileName=args.fileName
    # isFirstIteration=args.isFirstIteration
    # isFirstRun=args.isFirstRun

    trials = Trials()
    best = fmin(fn=HyperparameterTuning,
                    space=space,
                    algo=tpe.suggest,
                    max_evals=30,
                    trials=trials)

    print (best)

Tags: csvnameinrangeusersfileintrow
1条回答
网友
1楼 · 发布于 2024-09-30 08:36:43

我和你有同样的问题。在我的例子中,它也发生在第20次迭代中。我后来发现,这是因为,从迭代开始,选择了一个新的输入变量组合,其中一个变量不是简单的数字。它可以是一个1值数组或列表。所以请检查您的输入变量。一旦改变了,它就会起作用

相关问题 更多 >

    热门问题