在keras中提供了sklearn的API:from keras.wrappers.scikit_learn import KerasClassifier,这个是分类的,也有回归的,具体的使用方法
1.create_model。即创建自己的模型,在keras中自己根据需要搭模型,例如
def create_model(self):
"""
:return:
"""
max_squence_len = 16
max_token_num = 2874
embedding_dim = 80
input_layer=Input(shape=[max_squence_len,])
embedding_layer=Embedding(input_dim=max_token_num, output_dim=embedding_dim)(input_layer)
convs = []
filter_sizes = [2, 3, 4]
for fs in filter_sizes:
l_conv = Conv1D(filters=50, kernel_size=fs, activation="relu")(embedding_layer)
l_pool = MaxPooling1D(pool_size=2)(l_conv)
##pool_size:池化窗口的大小,如果在文中,表示每次选择几个词也就是每次选择几行
##strides:步长,在文本中表示一次移动多少行
##padding:取值为’val’或者’same’,当取’same’时,会在进行填充,当取‘val‘不会进行填充
l_pool = Flatten()(l_pool)
##Flatten层用来将输入“压平”,即把多维的输入一维化,常用在从卷积层到全连接层的过渡
convs.append(l_pool)
merge = concatenate(convs,
axis=1) ###将所有的卷积层都连接起来,除了使用concatenate以外,还可以使用add,两者的不同在于add未改变维度,而concatenate可以理解为维度的联合
out = Dropout(0.5)(merge) ##按照一定的概率将其暂时从网络中丢弃
output = Dense(32, activation='relu')(out) ##全链接层
output = Dense(units=31, activation='softmax')(output) ##全链接输出层
model = Model([input_layer], output)
adam = optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0) ##优化器
model.compile(loss="categorical_crossentropy", optimizer=adam, metrics=['accuracy'])
return model
2.定义进行调参或者交叉验证的方法,以供其他方法进行调用
def adj_para(self,x_train, y_train):
estimator=KerasClassifier(build_fn=self.create_model)
batch_size = [10, 20, 30]
epochs = [10, 50]
param_grid = dict(batch_size=batch_size, nb_epoch=epochs)
grid=GridSearchCV(estimator=estimator,param_grid=param_grid,cv=5,scoring = 'accuracy')
grid_result=grid.fit(x_train,y_train)
print("best_score:", grid_result.best_score_)
print("best_para:", grid_result.best_params_)
注意:这两个方法的定义所存在的类中,类的构造方法 def __init__(self):中,不能存在类变量 ,即在类构造方法中不能实例化其他类,否则会报TypeError: cannot deepcopy this pattern object。具体还不知道什么原因,只知道这样做不会再报深复制的错误了。如果有哪位大神知道,还希望分享
具体实例
class A(object):
def __init__(self):
self.a="aa"
def create_model(self):
"""
create model function
:return:
"""
def adj_para(self,x_train, y_train):
"""调参方法或者交叉验证方法的定义"""
上面这种方式可以,但是下面的方式不可以
class A(object):
def __init__(self):
self.a="aa"
self.objectB=B()###实例化B
def create_model(self):
"""
create model function
:return:
"""
def adj_para(self,x_train, y_train):
"""调参方法或者交叉验证方法的定义"""