将hyperopt与功能性api tensorflow一起使用

问题描述

我正在尝试将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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...