淘先锋技术网

首页 1 2 3 4 5 6 7

GridSearch是scikit-learn库的一个暴力调参工具,可以通过设定参数范围来寻找达到最优化目标的超参数,其底层原理按下不表。常见GridSearch和sklearn库中的各种机器学习算法相结合。
在使用GridSearch对tensorflow生成的神经网络模型进行调参时,其流程如下:
1.建立模型

def create_model(param):
	input=...
	output=...
	model=keras.Model(input,output)
	model.compile()
	return model

2.使用scikeras库中的KerasClassifier()方法将tensorflow模型打包为GridSearch可以直接调用的类。

import scikeras.wrappers import KerasClassifier
model=KerasClassifier(build_fn=create_model)

3.以字典形式建立需要调的参数,构建GridSearchCV对象,并利用数据集开始训练

reduceLR=ReduceLROnPlateau(monitor="accuracy",factor=0.9,patience=10,min_lr=1e-4)  #该函数用于生成学习率衰减对象
param_grid={"batch_size":np.arange(4,30,1),"callbacks":[reduceLR],"epochs":[500]}
grid=GridSearchCV(estimator=model,param_grid=param_grid,cv=10,verbose=3)
grid_result=grid.fit(train_x,train_y)

我在调一个简单的全连接神经网络时,遇到了一个错误
 raise errors_impl.OpError(None, None, error_message, errors_impl.UNKNOWN) tensorflow.python.framework.errors_impl.OpError
在网上找了半天,也没有得到答案
最后看其他人的代码,发现了问题
原问题代码:

model=create_model()
model=KerasClassifier(model=model)

最后在scikeras的官网上看到官方的使用方式

def get_model(hidden_layer_dim, meta):
    # note that meta is a special argument that will be
    # handed a dict containing input metadata
    n_features_in_ = meta["n_features_in_"]
    X_shape_ = meta["X_shape_"]
    n_classes_ = meta["n_classes_"]

    model = keras.models.Sequential()
    model.add(keras.layers.Dense(n_features_in_, input_shape=X_shape_[1:]))
    model.add(keras.layers.Activation("relu"))
    model.add(keras.layers.Dense(hidden_layer_dim))
    model.add(keras.layers.Activation("relu"))
    model.add(keras.layers.Dense(n_classes_))
    model.add(keras.layers.Activation("softmax"))
    return model

clf = KerasClassifier(
    get_model,
    loss="sparse_categorical_crossentropy",
    hidden_layer_dim=100,
)

gs = GridSearchCV(clf, params, refit=False, cv=3, scoring='accuracy')

gs.fit(X, y)

官方使用是需要将构造模型的函数作为参数传入的,并且在方法KerasClassifier()的API中在这里插入图片描述
显示了,其model参数需要Callable[…,tf.keras.Model],即一个任意收入到keras.Model的一个映射函数。
因此,只需要将原代码改为

即可。