问题描述
我正在尝试将hyperopt与功能性api tensorflow一起使用。 我的代码:
import tensorflow as tf
import pandas as pd
import numpy as np
from tensorflow.keras.layers import Dense,Flatten,Dropout,Input
from tensorflow.keras import Model
from hyperopt import hp,tpe,fmin,Trials,STATUS_OK,space_eval
from tensorflow.keras.wrappers.scikit_learn import KerasRegressor
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import MinMaxScaler
df = pd.DataFrame({'a': [1,2,3,4,5,6,7],'b':[10,20,30,40,50,60,70],'target': [1000,2000,3000,4000,5000,6000,7000]})
space = {
'units1': hp.uniform('units1',256),'units2': hp.uniform('units2',64),'dropout1': hp.uniform('dropout1',0.2,0.5),'dropout2': hp.uniform('dropout2','batch_size': hp.quniform('batch_size',12,64,2),'epochs': hp.choice('epochs',[100,150,200,300]),'optimizer': hp.choice('optimizer',['adadelta','adam','rmsprop']),'activation': 'relu',}
class myModel():
def __init__(self,features,target,scaler,input_data,loss_object,metric,space):
self.features = features
self.target = target
self.scaler = scaler
self.input_data = input_data
self.loss_object = loss_object
self.metric = metric
self.space = space
def build_model(self,params):
inputs = Input(len(self.features))
d1 = Dense(params['units1'],activation=params['activation'])(inputs)
d1 = Dropout(params['dropout1'])(d1)
outputs = Dense(1)(d1)
model = Model(inputs=[inputs],outputs=[outputs])
model.compile(optimizer=params['optimizer'],loss=self.loss_object,metrics=self.metric)
return model
def objective(self,params):
estimator = KerasRegressor(self.build_model(params),nb_epoch=1)
loss = -cross_val_score(estimator,self.X_train,self.y_train,cv=2,scoring="neg_mean_squared_error",n_jobs=-1).mean()
return {'loss': loss,'status': STATUS_OK}
def preprocess(self):
input_data = self.input_data
# Split data into features set and target vectors
self.X_train,self.X_val,self.y_val = train_test_split(
input_data[self.features].values,input_data[self.target].values,test_size=0.2,random_state=112)
self.y_train = np.squeeze(self.y_train)
self.X_train = self.scaler.fit_transform(self.X_train)
self.X_val = self.scaler.transform(self.X_val)
trials = Trials()
best = fmin(self.objective,self.space,algo=tpe.suggest,max_evals=10,trials=trials,rstate=np.random.RandomState(112))
self.best_params = space_eval(self.space,best)
loss_object = 'mse'
metric = [tf.keras.metrics.MeanSquaredError()]
scaler = MinMaxScaler()
features = ['a','b']
target = ['target']
model = myModel(features,df,space)
model.preprocess()
给出:
TypeError: can't pickle SwigPyObject objects
(tf版本2.1.0)
TypeError: can't pickle _thread.RLock objects
(tf版本2.2.0)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)