Python 如何降低计算成本
我使用GPyOpt计算基于Tensorflow的LSTM模型的优化参数。然而,与典型过程不同,参数验证是通过最小化方差而不是偏差来实现的。因此,需要迭代使用参数集运行的LSTM模型。事实上,我的脚本运行良好,没有任何错误,但返回最佳参数需要花费太多时间。我试图找到任何提高处理速度的方法,但没有找到 我认为其他模块,例如GridSearch或RandomizedSearch可能比GpyOp更快,但它们使用贝叶斯优化来获得参数 有没有办法降低此操作的计算成本 我的电脑:Python 如何降低计算成本,python,optimization,parameters,lstm,bayesian,Python,Optimization,Parameters,Lstm,Bayesian,我使用GPyOpt计算基于Tensorflow的LSTM模型的优化参数。然而,与典型过程不同,参数验证是通过最小化方差而不是偏差来实现的。因此,需要迭代使用参数集运行的LSTM模型。事实上,我的脚本运行良好,没有任何错误,但返回最佳参数需要花费太多时间。我试图找到任何提高处理速度的方法,但没有找到 我认为其他模块,例如GridSearch或RandomizedSearch可能比GpyOp更快,但它们使用贝叶斯优化来获得参数 有没有办法降低此操作的计算成本 我的电脑:MackBook,2.3 GH
MackBook,2.3 GHz英特尔酷睿i5
我的剧本:
import os
os.environ['KMP_DUPLICATE_LIB_OK']='True'
os.environ['PYTHONHASHSEED']='0'
os.environ['OMP_NUM_THREADS']='4'
os.environ['KMP_BLOCKTIME']='30'
os.environ['KMP_SETTINGS']='1'
os.environ['KMP_AFFINITY']='granularity=fine,verbose,compact,1,0'
import tensorflow as tf
import numpy as np
import GPyOpt
import random
NUM_PARALLEL_EXEC_UNITS=4
config=tf.ConfigProto(intra_op_parallelism_threads=NUM_PARALLEL_EXEC_UNITS,
inter_op_parallelism_threads=2,
allow_soft_placement=True,
device_count={'CPU':NUM_PARALLEL_EXEC_UNITS})
def parameter_opt(df_x,df_y):
x_set_list=[]
y_set_list=[]
for i in range(10): #create 10 data sets for calculating variance
t=random.randint(1,2300)
x_set_=df_x[t:t+10,:,:] #x_set_.shape is (10,7,5)
y_set_=df_y[t:t+10,:]
x_set_list.append(x_set_)
y_set_list.append(y_set_)
pred_x=df_x[-10:,:,:]
bounds=[{'name':'hidden_layer','type':'discrete','domain':(10,50,100,300,500)},
{'name':'learn_rate','type':'discrete','domain':(0.1,0.01,0.001,0.0001)},
{'name':'forget','type':'continuous','domain':(0.1,1.0)},
{'name':'std','type':'continuous','domain':(0.01,1.0)},
{'name':'epo','type':'discrete','domain':(50,100,200,400)},
{'name':'cell_drop_','type':'discrete','domain':(0,1)},
{'name':'output_keep','type':'continuous','domain':(0.1,1.0)}]
def f(x):
tf.reset_default_graph()
def LSTMmse(hidden_layer,learn_rate,forget,std,epo,cell_drop_, output_keep):
pred_array=np.empty((10,0))
for x_set,y_set in zip(x_set_list,y_set_list):
tf.reset_default_graph()
.......
#LSTM model
#generate prediction_list consisting of 10 predictionvalue
.........
variance_list=np.var(prediction_list,axis=1)
variance_ave=sum(var_list)/len(var_list)
return variance_ave
for x_ in x:
vari=LSTMmse(hidden_layer=int(x_[0]),
learn_rate=np.float32(x_[1]),
forget=np.float32(x_[2]),
std=np.float32(x_[3]),
epo=int(x_[4]),
cell_drop_=bool(x_[5]),
output_keep=np.float32(x_[6]))
return vari
myBopt=GPyOpt.methods.BayesianOptimization(f=f,domain=bounds,acquisition_type='MPI')
myBopt.run_optimization(max_iter=10)
opt=myBopt.x_opt
opt=[int(opt[0]),opt[1],opt[2],opt[3],int(opt[4]),opt[5],opt[6]]
key=['hidden_layer','learn_rate','forget','std','epo','cell_drop','output_keep']
value=opt
para_dict=dict(zip(key,value))
return para_dict
parameter_opt=parameter_opt(df_x,df_y)
print(parameter_opt) # spending too much time
您可以尝试以下几点: GRU代替LSTM 这种单元类型少了一个门,因此计算效率更高 此外,它们的超参数更少,因此可能的搜索空间更小 没有什么结论,但从轶事的角度来看,至少在中等长度的序列中,它们的表现与LSTM相当 使用CUDA 如果可能,请使用支持CUDA的设备培训您的网络。特别是,对于
tensorflow
使用cudngru
版本(对于tf2.x
请参见,还有1.x
的选项)
缩小搜索空间
搜索的超参数越少,搜索速度就越快<代码>学习率通常对正确操作非常重要
有一种非常著名的近似最佳学习率的技巧,由Leslie N.Smith于年提出,并在社区中普及
基本思想-您将学习率设置得非常低(例如1e-7
),并每隔n
批以指数方式递增,直到达到阈值(最高lr
,通常约1.0
)
监控train
或validation
丢失您将看到它可能会以某种学习速度猛增。利用这一点,将您的近似最佳学习10
设置为低于该值
你可以读到它
其他超参数也可以缩小,当您看到一些值可能在早期无法使用时,尽管贝叶斯优化部分解决了这一问题。您可以尝试以下几点: GRU代替LSTM 这种单元类型少了一个门,因此计算效率更高 此外,它们的超参数更少,因此可能的搜索空间更小 没有什么结论,但从轶事的角度来看,至少在中等长度的序列中,它们的表现与LSTM相当 使用CUDA 如果可能,请使用支持CUDA的设备培训您的网络。特别是,对于
tensorflow
使用cudngru
版本(对于tf2.x
请参见,还有1.x
的选项)
缩小搜索空间
搜索的超参数越少,搜索速度就越快<代码>学习率通常对正确操作非常重要
有一种非常著名的近似最佳学习率的技巧,由Leslie N.Smith于年提出,并在社区中普及
基本思想-您将学习率设置得非常低(例如1e-7
),并每隔n
批以指数方式递增,直到达到阈值(最高lr
,通常约1.0
)
监控train
或validation
丢失您将看到它可能会以某种学习速度猛增。利用这一点,将您的近似最佳学习10
设置为低于该值
你可以读到它
其他超参数也可以缩小,当您看到一些值可能在早期无法使用时,尽管贝叶斯优化部分解决了这一问题。感谢Szymon的友好建议。首先,我将lstm切换到gpu(tf.rnn.contri.GPUCell()),并提前计算了参数。尽管消除了一个参数(忘记偏差),但是,它花费的时间是以前的lstm模型的两倍多。这意味着GPU无法提高我的模型的计算成本。不幸的是,我的MacBook(Mojave)可能无法运行CUDA应用程序。更重要的是,我不确定是否能够构建tensorflow gpu环境,因为我是该领域的新手。所以你有什么想法吗?有多个
GPU
单元。如果可能的话,我建议您将代码重写为tf2.1
,版本1.x
目前具有旧版支持。此外,它允许无缝cudnn
集成,并在神经网络创建过程中节省大量麻烦。如果您的设备支持GPU,使用GPU肯定会加快您的算法速度(MacBook确实无法工作,您可以尝试谷歌免费访问GPU,它已经预装了tensorflow GPU
)。在GPU上增加批处理的大小以实现进一步的加速。感谢Szymon的友好建议。首先,我将lstm切换到GPU(tf.rnn.contri.GPUCell()),并预先计算了参数。尽管消除了一个参数(忘记偏差),但是,它花费的时间是以前的lstm模型的两倍多。这意味着GPU无法提高我的模型的计算成本。不幸的是,我的MacBook(Mojave)可能无法运行CUDA应用程序。更重要的是,我不确定是否能够构建tensorflow gpu环境,因为我是该领域的新手。所以你有什么想法吗?有多个GPU
单元。如果可能的话,我建议您将代码重写为tf2.1
,版本1.x
目前具有旧版支持。此外,它允许无缝cudnn
集成,并在神经网络创建过程中节省大量麻烦。如果您的设备是GP,使用GPU肯定会加快您的算法