在keras中使用交叉验证或者网格搜索踩的坑

在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):

    """调参方法或者交叉验证方法的定义"""

    

你可能感兴趣的:(Python基础知识)