无法克隆对象 <tensorflow.python.keras.wrappers.scikit_learn.KerasClassifier 对象
Posted
技术标签:
【中文标题】无法克隆对象 <tensorflow.python.keras.wrappers.scikit_learn.KerasClassifier 对象【英文标题】:Cannot clone object <tensorflow.python.keras.wrappers.scikit_learn.KerasClassifier object 【发布时间】:2020-05-01 22:59:35 【问题描述】:这是关于 TF 2.0 的。
请在下面找到我的代码,该代码使用 sklearn.model_selection.GridSearchCV
执行 GridSearch 和交叉验证,用于完美运行的 mnist 数据集。
# 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)
我的想法是通过具有不同学习率的不同优化器,比如学习率 0.1、0.01 和 0.001 的 Adam。我还想尝试不同学习率和动量值的 SGD。
在这种情况下,当我通过 'optimizer_val': [tf.keras.optimizers.Adam(0.1)],
时,我收到如下错误:
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
请告知我该如何纠正这个错误。
【问题讨论】:
你有没有发现这个错误? github上的这个issue好像有关系github.com/scikit-learn/scikit-learn/issues/15722 【参考方案1】:这是 sklearn 错误。您应该降低 sklearn 的版本:
conda install scikit-learn==0.21.2
没关系!
【讨论】:
【参考方案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]
【讨论】:
以上是关于无法克隆对象 <tensorflow.python.keras.wrappers.scikit_learn.KerasClassifier 对象的主要内容,如果未能解决你的问题,请参考以下文章
无法克隆对象 <tensorflow.python.keras.wrappers.scikit_learn.KerasClassifier 对象
无法克隆对象 <keras.wrappers.scikit_learn.KerasClassifier object at 0x7f9d95dd50f0>,因为构造函数要么未设置
在深度克隆对象时,Typescript Error 2345