use*_*665 5 python keras tensorflow
我的数据集已经有加权示例.在这个二进制分类中,与第二类相比,我也有更多的第一类.
我可以同时使用它们sample_weight并class_weight在model.fit()功能中进一步重新加权吗?
或者我首先创建一个new_weights的新数组并将其传递给fit函数sample_weight?
编辑:
为了进一步说明,我已经在我的数据集中为每个样本设置了单独的权重,并且为了进一步增加复杂性,第一类的样本权重的总和远远大于第二类的总样本权重.
例如,我目前有:
y = [0,0,0,0,1,1]
sample_weights = [0.01,0.03,0.05,0.02,0.01,0.02]
所以权重的总和为类"0"是0.11和类"1"是 0.03.所以我应该:
class_weight = {0:1.,1:0.11/0.03}
我需要使用两个sample_weightAND class_weight功能.如果一个覆盖另一个,那么我将不得不创建新的sample_weights然后使用fit()或train_on_batch().
所以我的问题是,我可以同时使用它们,还是覆盖另一个?
如果你愿意的话,你当然可以做到这两件事,如果那就是你需要的东西.根据keras 文档:
class_weight:可选字典将类索引(整数)映射到权重(浮点)值,用于加权损失函数(仅限训练期间).这可以用来告诉模型"更多地关注"来自代表性不足的类的样本.
sample_weight:训练样本的可选Numpy权重数组,用于加权损失函数(仅限训练期间).您可以传递与输入样本长度相同的平坦(1D)Numpy数组(权重和样本之间的1:1映射),或者在时间数据的情况下[...].
所以考虑到你提到你"与第二类相比有更多的第一类"我认为你应该选择class_weight参数.在那里,您可以指出数据集所呈现的比率,以便您可以补偿不平衡的数据类.在sample_weight当你要定义的权重或重要性更为每个数据元素.
例如,如果您通过:
class_weight = {0 : 1. , 1: 50.}
Run Code Online (Sandbox Code Playgroud)
你会说来自班级的每个样本都会从课堂上1算作50个样本0,因此从课堂上给你的元素提供了更多的"重要性" 1(因为你肯定会减少这些样本).您可以根据自己的需要进行定制.更多关于这个伟大问题的信息不平衡数据集.
注意:为了进一步比较这两个参数,请记住,传递class_weightas {0:1., 1:50.}等同于传递sample_weightas [1.,1.,1.,...,50.,50.,...],因为你有样本的类在哪里[0,0,0,...,1,1,...].
正如我们所看到的,class_weight在这种情况下使用它更实际,并且sample_weight可以用于更具体的情况,在这些情况下,您实际上希望单独为每个样本赋予"重要性".如果案例需要,也可以使用两者,但必须考虑到它的累积效应.
编辑:根据你的新问题,挖掘Keras 源代码似乎确实sample_weights覆盖class_weights,这里是在_standarize_weigths方法上执行它的代码片段(第499行):
if sample_weight is not None:
#...Does some error handling...
return sample_weight #simply returns the weights you passed
elif isinstance(class_weight, dict):
#...Some error handling and computations...
#Then creates an array repeating class weight to match your target classes
weights = np.asarray([class_weight[cls] for cls in y_classes
if cls in class_weight])
#...more error handling...
return weights
Run Code Online (Sandbox Code Playgroud)
这意味着您只能使用其中一个,但不能同时使用两者.因此,您确实需要乘以您需要sample_weights的比率来弥补不平衡.