python - 我可以在训练期间更改 class_weight 吗?
问题描述
我想在 Keras 训练期间更改我的 class_weight。
我使用fit_generator
和Callback
方法如下。
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_generator
并且no_decoder_generator
只是自定义生成器。
我想在每次纪元结束时更改班级权重。是否可以?那我该怎么办?
我的数据是不平衡的数据,一个类继续过拟合。
在时代结束时,我想通过按类计算准确度来增加低准确度类的权重。
我能怎么做?
解决方案
像一次循环一个时期这样的简单方法怎么样?
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
。您可以通过检查值来合并提前停止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
推荐阅读
- python - 无法使用 xpath 从某些 html 元素中解析某些信息
- python - 如何让 OpenCV 在 Raspberry Pi 4 (Raspbian Buster) 上完全运行?
- sql - 使用 Oracle SQL 在最接近的值中查找中位数
- android - 使用 Fragment 从我的应用程序发送消息
- swift - 使用 vapor 导入多个私有存储库时出错
- java - Spring Boot批处理:如何使用作业参数运行作业
- python - 使用 sudo python3 但不使用 python3 时导入 aws 凭据时出错
- swiftui - Xcode 11 beta 3 在同时使用 NavigationLink、@EnvironmentObject 和 List 时崩溃
- crystal-reports - 为什么水晶报告在我编写代码时提示我输入参数字段值
- random - 是否可以预测计算机会随机选择什么数字?