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

    xiaoxiao2024-01-11  165

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

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

        

    最新回复(0)