【发布时间】:2018-06-27 03:49:47
【问题描述】:
我正在处理不平衡类的顺序标记问题,我想使用sample_weight 来解决不平衡问题。基本上,如果我训练模型大约 10 个 epoch,我会得到很好的结果。如果我训练更多的时期,val_loss 会不断下降,但我会得到更差的结果。我猜这个模型只是检测到更多的主导类而不利于较小的类。
该模型有两个输入,用于词嵌入和字符嵌入,输入是从 0 到 6 的 7 个可能的类之一。
使用填充,我的词嵌入输入层的形状是(3000, 150),而词嵌入的输入层是(3000, 150, 15)。我对测试和训练数据使用 0.3 拆分,这意味着对于词嵌入的 X_train 是对于字符嵌入的 (2000, 150) 和 (2000, 150, 15)。 y 包含每个单词的正确类,编码在维数为 7 的 one-hot 向量中,因此其形状为 (3000, 150, 7)。 y 同样分为训练和测试集。然后将每个输入馈送到双向 LSTM。
输出是一个矩阵,为 2000 个训练样本的每个单词分配了 7 个类别之一,因此大小为(2000, 150, 7)。
起初,我只是尝试将 sample_weight 定义为长度为 7 的 np.array,其中包含每个类的权重:
count = [list(array).index(1) for arrays in y for array in arrays]
count = dict(Counter(count))
count[0] = 0
total = sum([count[key] for key in count])
count = {k: count[key] / total for key in count}
category_weights = np.zeros(7)
for f in count:
category_weights[f] = count[f]
但我收到以下错误ValueError: Found a sample_weight array with shape (7,) for an input with shape (2000, 150, 7). sample_weight cannot be broadcast.
查看文档,看起来我应该传递 a 2D array with shape (samples, sequence_length)。因此,我创建了一个 (3000, 150) 数组,其中包含每个序列的每个单词的权重的串联:
weights = []
for sample in y:
current_weight = []
for line in sample:
current_weight.append(frequency[list(line).index(1)])
weights.append(current_weight)
weights = np.array(weights)
在compile() 中添加sample_weight_mode="temporal" 选项后,通过sample_weight 参数将其传递给fit 函数。
我首先收到一个错误,告诉我维度错误,但是在仅为训练样本生成权重后,我最终得到了一个 (2000, 150) 数组,我可以使用它来拟合我的模型。
- 这是定义 sample_weights 的正确方法还是我做错了?我不能说我注意到添加权重有任何改进,所以我一定错过了什么。
【问题讨论】:
标签: python deep-learning keras data-science