首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >焦损NLP/文本数据pytorch -改进结果

焦损NLP/文本数据pytorch -改进结果
EN

Stack Overflow用户
提问于 2022-03-23 16:54:21
回答 2查看 368关注 0票数 2

我有一个NLP/text数据分类问题,其中有一个非常偏斜的分布- class 0 - 98%, class 1 - 2%用于我的训练和验证数据,我正在做过抽样,我的类分布是class 0 - 55%, class 1 - 45%。测试数据有偏差分布。

我使用nn.BCEWithLogitsLoss(pos_weight=tensor(1.2579, device='cuda:0'))构建了一个模型。pos_weight的计算采用55/45 (训练数据中的类分布)。

在我的1级测试数据中,我得到了f10.07true negatives, false positives, false negative, true positive = (28809, 13258, 537, 495)的性能。

我用下面的代码变成了焦点丢失,我的性能没有得到很大的改善。1级测试数据上的f1仍然是相同的,而true negatives, false positives, false negative, true positive = (32527, 9540, 640, 392)

kornia.losses.binary_focal_loss_with_logits(probssss, labelsss,alpha=0.25,gamma=2.0,reduction='mean')

  1. 我的α和伽玛参数是错的吗?有什么特定的价值观我应该去尝试吗?我可以尝试调整他们,但这可能需要大量的时间和资源。因此,我正在寻找recommendations
  2. for,我的nn.BCEWithLogitsLoss(pos_weight=tensor(1.2579, device='cuda:0')),我是否应该为pos_weight使用任何其他值?请记住,我的目标是为测试数据类1 f1

获得最大的性能。

#更新

我正在构建一个CNN使用手套嵌入-我拿我的文字,并找到他们的手套嵌入-我正在删除所有标点符号,除此之外,没有其他主要的数据清洗。我对调整焦距损失的参数-α和γ很感兴趣。

我的模型如下

代码语言:javascript
复制
class CNN(nn.Module):
    
    def __init__(self,
                 pretrained_embedding,
                 embed_dim,
                 filter_sizes,
                 num_filters,
                 fc1_neurons,
                 fc2_neurons,
                 dropout):

        super(CNN, self).__init__()
        
        # Embedding layer
        self.vocab_size, self.embed_dim = pretrained_embedding.shape
        self.embedding = nn.Embedding.from_pretrained(pretrained_embedding,
                                                      freeze=True)

        # Conv Network
        self.conv1d_list = nn.ModuleList([
            nn.Conv1d(in_channels=self.embed_dim,
                      out_channels=num_filters[i],
                      kernel_size=filter_sizes[i])
            for i in range(len(filter_sizes))
        ])
        
        #Batchnorm
        self.batch_norm1 = nn.BatchNorm1d(num_filters[0] * len(filter_sizes))
        
        # Dropout Layer
        self.dropout = nn.Dropout(p=dropout)
        
        # RELU activation function
        self.relu =  nn.ReLU()
        
        # Fully-connected layers
#         self.fc1 = nn.Linear(np.sum(num_filters), fc1_neurons)
        
        self.batch_norm2 = nn.BatchNorm1d(num_filters)
        
        self.fc2 = nn.Linear(np.sum(num_filters), fc2_neurons)
        
        self.batch_norm3 = nn.BatchNorm1d(fc2_neurons)
        
        self.fc3 = nn.Linear(fc2_neurons, 1)
EN

回答 2

Stack Overflow用户

发布于 2022-03-25 22:55:53

我认为比这些参数值更重要的是如何训练这些特性。你是从地面训练NLP模型,即只在你的文本上进行培训,还是使用部分预先培训的模式?根据你的样品尺寸,我建议采用后者。

票数 0
EN

Stack Overflow用户

发布于 2022-04-01 12:14:40

我认为你应该尝试LSTM,GRU,或基于变形金刚的方法。我会推荐变压器模型,如伯特,迪斯蒂伯特,罗伯塔等。你可以从零训练或使用预先训练微调它。它将给你一个更好的F1评分比基于CNN的方法。

此外,您还可以尝试添加类权重。这可能有助于提高准确度。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71591088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档