【问题记录】GridSearch在给Tensorflow 全连接网络调参时的坑 raise errors_impl.OpError(None, None, error_message, errors_
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)
我在调一个简单的全连接神经网络时,遇到了一个错误
在网上找了半天,也没有得到答案
最后看其他人的代码,发现了问题
原问题代码:
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的一个映射函数。
因此,只需要将原代码改为
即可。