【问题标题】:Can I change class_weight during training?我可以在训练期间更改 class_weight 吗?
【发布时间】:2019-03-26 10:42:45
【问题描述】:

我想在 Keras 训练期间更改我的 class_weight。

我使用了fit_generatorCallback 方法,如下所示。

model.fit_generator(
                decoder_generator(x_train, y_train),
                steps_per_epoch=len(x_train),
                epochs=args.epochs,
                validation_data=decoder_generator(x_valid, y_valid),
                validation_steps=len(x_valid),
                callbacks=callback_list,
                class_weight=class_weights,
                verbose=1)

class Valid_checker(keras.callbacks.Callback):
    def __init__(self, model_name, patience, val_data, x_length):
        super().__init__()
        self.best_score = 0
        self.patience = patience
        self.current_patience = 0 
        self.model_name = model_name
        self.validation_data = val_data
        self.x_length = x_length


    def on_epoch_end(self, epoch, logs={}):
        X_val, y_val = self.validation_data
        y_predict, x_predict = model.predict_generator(no_decoder_generator(X_val, y_val), steps=len(X_val))
        y_predict = np.asarray(y_predict)
        x_predict = np.asarray(x_predict)  

decoder_generatorno_decoder_generator 只是自定义生成器。

我想在每次纪元结束时更改班级权重。是否可以?那我该怎么办?

我的数据是不平衡的数据,继续过拟合一个类。

在 epoch 结束时,我想通过按类计算准确度来增加低准确度类的权重。

我该怎么办?

【问题讨论】:

    标签: python tensorflow keras deep-learning


    【解决方案1】:

    像一次循环一个时期这样的简单方法怎么样?

    for i in range(args.epochs):
            class_weights = calculate_weights()
            model.fit_generator(
                        decoder_generator(x_train, y_train),
                        steps_per_epoch=len(x_train),
                        epochs=1,
                        validation_data=decoder_generator(x_valid, y_valid),
                        validation_steps=len(x_valid),
                        callbacks=callback_list,
                        class_weight=class_weights,
                    verbose=1)
    

    fit_generator 中,没有直接的方法可以为每个 epoch 使用不同的类权重。您可以通过检查 model.stop_training 的值来合并提前停止

    样本

    import numpy as np
    from keras.models import Sequential
    from keras.layers import Input, Dense
    from keras.models import Model
    from keras.callbacks import Callback
    
    class Valid_checker(Callback):
        def __init__(self):
            super().__init__()
            self.model = model
            self.n_epoch = 0
    
        def on_epoch_end(self, epoch, logs={}):   
            self.n_epoch += 1
            if self.n_epoch == 8:
                self.model.stop_training = True
    
    def decoder_generator():
        while True:        
            for i in range(10):
                yield np.random.rand(10,5), np.random.randint(3,size=(10,3))
    
    
    inputs = Input(shape=(5,))
    outputs = Dense(3, activation='relu')(inputs)
    model = Model(inputs=inputs, outputs=outputs)
    model.compile(optimizer='rmsprop',
                  loss='categorical_crossentropy',
                  metrics=['accuracy'])
    
    for i in range(10):    
        model.fit_generator(generator=decoder_generator(),
                        class_weight={0:1/3, 1:1/3, 2:1/3},
                        steps_per_epoch=10,                    
                        epochs=1,
                        callbacks=[Valid_checker()])
        if model.stop_training:
            break
    

    【讨论】:

    • 我想我可以试试。然而,在Valid_checker 类中,我实现了自定义提前停止和模型保存。所以我想我必须在on_epoch_end 函数中返回当前精度。你有其他的cmet给我吗?
    猜你喜欢
    • 2019-10-16
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    • 2019-12-16
    • 2019-12-07
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多