首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法克隆对象<tensorflow.python.keras.wrappers.scikit_learn.KerasClassifier对象

无法克隆对象<tensorflow.python.keras.wrappers.scikit_learn.KerasClassifier对象
EN

Stack Overflow用户
提问于 2020-01-15 15:45:38
回答 2查看 4.8K关注 0票数 7

这是关于TF 2.0的。

请在下面找到我的代码,它使用sklearn.model_selection.GridSearchCV对mnist数据集执行GridSearch和交叉验证,工作得很好。

代码语言:javascript
运行
复制
# Build Function to create model, required by KerasClassifier

    def create_model(optimizer_val='RMSprop',hidden_layer_size=16,activation_fn='relu',dropout_rate=0.1,regularization_fn=tf.keras.regularizers.l1(0.001),kernel_initializer_fn=tf.keras.initializers.glorot_uniform,bias_initializer_fn=tf.keras.initializers.zeros):
        model = tf.keras.models.Sequential([
        tf.keras.layers.Flatten(input_shape=(28, 28)),    
        tf.keras.layers.Dense(units=hidden_layer_size, activation=activation_fn,kernel_regularizer=regularization_fn,kernel_initializer=kernel_initializer_fn,bias_initializer=bias_initializer_fn), 
        tf.keras.layers.Dropout(dropout_rate),
        tf.keras.layers.Dense(units=hidden_layer_size,activation='softmax',kernel_regularizer=regularization_fn,kernel_initializer=kernel_initializer_fn,bias_initializer=bias_initializer_fn) 
          ])
        optimizer_val_final=optimizer_val
        model.compile(optimizer=optimizer_val, loss='sparse_categorical_crossentropy', metrics=['accuracy'])
        return model

    #Create the model with the wrapper
    model = tf.keras.wrappers.scikit_learn.KerasClassifier(build_fn=create_model, epochs=100, batch_size=10, verbose=2)

    #Initialize the parameter grid
    nn_param_grid = {
        'epochs': [10],     
        'batch_size':[128],
        'optimizer_val': ['Adam','SGD'],
        'hidden_layer_size': [128],
        'activation_fn': ['relu'],     
        'dropout_rate': [0.2],    
        'regularization_fn':['l1','l2','L1L2'],    
        'kernel_initializer_fn':['glorot_normal', 'glorot_uniform'],    
        'bias_initializer_fn':[tf.keras.initializers.zeros]    
    }
    #Perform GridSearchCV
    grid = GridSearchCV(estimator=model, param_grid=nn_param_grid, verbose=2, cv=3,scoring=precision_custom,return_train_score=False,n_jobs=-1) 
    grid_result = grid.fit(x_train, y_train)

我的想法是传递具有不同学习率的不同优化器,比如Adam的学习率为0.1,0.01和0.001。我还想尝试使用不同学习率和动量值的SGD。

在这种情况下,当我传递'optimizer_val': [tf.keras.optimizers.Adam(0.1)],时,会得到如下所示的错误:

代码语言:javascript
运行
复制
Cannot clone object <tensorflow.python.keras.wrappers.scikit_learn.KerasClassifier object at 0x7fe08b210e10>, as the constructor either does not set or modifies parameter optimizer_val

请告诉我如何纠正这个错误。

EN

回答 2

Stack Overflow用户

发布于 2020-03-03 10:33:30

这是sklearn bug。您应该降低sklearn的版本:

代码语言:javascript
运行
复制
conda install scikit-learn==0.21.2

好了!

票数 6
EN

Stack Overflow用户

发布于 2020-08-23 06:55:46

您可以通过将列表更改为元组来解决此问题。如果有任何单值实例,则可以使用list。

代码语言:javascript
运行
复制
    #Initialize the parameter grid
    nn_param_grid = {
        'epochs': [10],     
        'batch_size':[128],
        'optimizer_val': ('Adam','SGD'),
        'hidden_layer_size': [128],
        'activation_fn': ['relu'],     
        'dropout_rate': [0.2],    
        'regularization_fn':('l1','l2','L1L2'),
        'kernel_initializer_fn':('glorot_normal', 'glorot_uniform'),
        'bias_initializer_fn':[tf.keras.initializers.zeros]    
    }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59746974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档