菲尼克斯的呐喊 2024-04-22 12:55 采纳率: 0%
浏览 10

NER_ZH运行问题

在使用您发布在GitCode上的项目https://gitcode.com/tmylla/NER_ZH%E6%97%B6%E4%BB%A3%E7%A0%81%E8%BF%90%E8%A1%8C%E5%87%BA%E7%8E%B0%E9%97%AE%E9%A2%98%EF%BC%8Cckpts%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%8B%E4%B8%A4%E4%B8%AA%E6%A8%A1%E5%9E%8B%E5%9D%87%E4%B8%BAbert_base_chinse,tokenizer%E8%BF%90%E8%A1%8C%E6%97%A0%E8%AF%AF%EF%BC%8Cinput_ids, token_type_ids, attention_mask检查后无误,导入模型后outputs张量全为nan值,预测结果均为同一标签,请问作者如何解决。
所有的包均已安装,torch版本与cuda一致。


```python
NaN values found in outputs
BaseModelOutputWithPoolingAndCrossAttentions(last_hidden_state=tensor([[[nan, nan, nan,  ..., nan, nan, nan],
         [nan, nan, nan,  ..., nan, nan, nan],
         [nan, nan, nan,  ..., nan, nan, nan],
         ...,
         [nan, nan, nan,  ..., nan, nan, nan],
         [nan, nan, nan,  ..., nan, nan, nan],
         [nan, nan, nan,  ..., nan, nan, nan]],

        [[nan, nan, nan,  ..., nan, nan, nan],
         [nan, nan, nan,  ..., nan, nan, nan],
         [nan, nan, nan,  ..., nan, nan, nan],
         ...,
         [nan, nan, nan,  ..., nan, nan, nan],
         [nan, nan, nan,  ..., nan, nan, nan],
         [nan, nan, nan,  ..., nan, nan, nan]],

        [[nan, nan, nan,  ..., nan, nan, nan],
         [nan, nan, nan,  ..., nan, nan, nan],
         [nan, nan, nan,  ..., nan, nan, nan],
         ...,
         [nan, nan, nan,  ..., nan, nan, nan],
         [nan, nan, nan,  ..., nan, nan, nan],
         [nan, nan, nan,  ..., nan, nan, nan]],

        ...,

        [[nan, nan, nan,  ..., nan, nan, nan],
         [nan, nan, nan,  ..., nan, nan, nan],
         [nan, nan, nan,  ..., nan, nan, nan],
         ...,
         [nan, nan, nan,  ..., nan, nan, nan],
         [nan, nan, nan,  ..., nan, nan, nan],
         [nan, nan, nan,  ..., nan, nan, nan]],

        [[nan, nan, nan,  ..., nan, nan, nan],
         [nan, nan, nan,  ..., nan, nan, nan],
         [nan, nan, nan,  ..., nan, nan, nan],
         ...,
         [nan, nan, nan,  ..., nan, nan, nan],
         [nan, nan, nan,  ..., nan, nan, nan],
         [nan, nan, nan,  ..., nan, nan, nan]],

        [[nan, nan, nan,  ..., nan, nan, nan],
         [nan, nan, nan,  ..., nan, nan, nan],
         [nan, nan, nan,  ..., nan, nan, nan],
         ...,
         [nan, nan, nan,  ..., nan, nan, nan],
         [nan, nan, nan,  ..., nan, nan, nan],
         [nan, nan, nan,  ..., nan, nan, nan]]], device='cuda:0'), pooler_output=tensor([[nan, nan, nan,  ..., nan, nan, nan],
        [nan, nan, nan,  ..., nan, nan, nan],
        [nan, nan, nan,  ..., nan, nan, nan],
        ...,
        [nan, nan, nan,  ..., nan, nan, nan],
        [nan, nan, nan,  ..., nan, nan, nan],
        [nan, nan, nan,  ..., nan, nan, nan]], device='cuda:0'), hidden_states=None, past_key_values=None, attentions=None, cross_attentions=None)


![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/57e4824744db4070b938859e192466d1.png "#left")
  • 写回答

6条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-22 12:55
    关注

    引自免费微信小程序:皆我百晓生

    看起来你在尝试使用BERT进行命名实体识别(NER),但是遇到了输出全是nan的问题。这种情况通常是由于梯度爆炸或者梯度消失导致的。这里有一些可能的解决方案:

    1. 检查输入数据格式: 确保你的输入数据已经正确地经过了分词、编码,并且形状和大小是正确的。例如,input_ids, token_type_ids, 和 attention_mask 应该符合BERT模型的预期。

    2. 检查数据规模: 如果数据集中存在特别长的句子,这可能导致梯度爆炸。尝试对句子进行截断,限制每个样本的最大长度。

    3. 初始化权重: 尽管BERT通常不需要特殊的权重初始化,但如果你是从随机权重开始训练,确保你的学习率设置得足够小。

    4. 学习率调整: 使用较小的学习率,比如1e-5到5e-5之间。可以尝试使用学习率调度器,例如BERT推荐的warmup策略。

    5. 检查模型加载: 确保模型和预训练权重都已经正确加载。如果模型没有加载成功,可能会得到无效的输出。

    6. 检查GPU内存: 确保你的GPU有足够的内存来处理你的数据和模型。如果内存不足,可能会导致错误的结果。

    7. 启用mixed precision training: 在某些情况下,使用混合精度训练(Mixed Precision)可以帮助缓解梯度问题并提高性能。你可以使用PyTorch的apex.amp模块来进行此操作。

    下面是一个简化版的示例代码,展示了如何使用BERT进行NER以及一些上述建议的实践:

    import torch
    from transformers import BertTokenizerFast, BertForTokenClassification, AdamW
    from torch.utils.data import Dataset, DataLoader
    from sklearn.model_selection import train_test_split
    import numpy as np
    
    # 假设你有一个包含输入文本和对应标签的数据集
    class NERDataset(Dataset):
        # 实现__len__, __getitem__等方法
    
    # 划分训练集和验证集
    train_dataset, val_dataset = train_test_split(dataset, test_size=0.2)
    
    # 初始化 tokenizer 和 model
    tokenizer = BertTokenizerFast.from_pretrained('bert-base-chinese')
    model = BertForTokenClassification.from_pretrained('bert-base-chinese')
    
    # 数据加载器
    batch_size = 8
    train_dataloader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
    val_dataloader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False)
    
    # 模型参数和优化器
    params = list(model.parameters())
    optimizer = AdamW(params, lr=5e-5)
    
    # 开始训练
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    model.to(device)
    
    num_epochs = 3
    for epoch in range(num_epochs):
        for step, (inputs, labels) in enumerate(train_dataloader):
            inputs = {key: value.to(device) for key, value in inputs.items()}
            labels = labels.to(device)
    
            # Forward pass
            outputs = model(**inputs, labels=labels)
            loss = outputs.loss
    
            # Backward pass
            optimizer.zero_grad()
            loss.backward()
    
            # Clip gradients to avoid exploding gradients
            torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
    
            # Update weights
            optimizer.step()
    
        # Validation after each epoch
        with torch.no_grad():
            total_loss = 0
            for inputs, labels in val_dataloader:
                inputs = {key: value.to(device) for key, value in inputs.items()}
                labels = labels.to(device)
    
                outputs = model(**inputs, labels=labels)
                loss = outputs.loss
                total_loss += loss.item()
    
            avg_val_loss = total_loss / len(val_dataloader)
    
            print(f'Epoch {epoch + 1}/{num_epochs}, Validation Loss: {avg_val_loss:.4f}')
    
    # Save the trained model
    torch.save(model.state_dict(), 'ner_model.pth')
    

    这个代码片段展示了一个简单的BERT NER训练流程,包括数据预处理、模型加载、训练循环、损失计算和模型保存。你需要根据你的实际数据集替换NERDataset类中的实现部分。

    如果你仍然遇到问题,请提供更多的上下文信息,如数据样例、完整的代码段,以及任何其他可能有用的调试信息,这样我可以更具体地帮助你。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月22日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见