【chatgpt】relative error是nan

相对误差(Relative Error)变成 NaN 可能是由于在计算相对误差时分母为零或分母过小引起的。为了避免这种情况,需要在计算相对误差时进行一些保护处理。以下是解决相对误差变成 NaN 的方法,并对整个训练和验证过程进行适当的调整。

代码实现

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

# 定义一个简单的神经网络
class SimpleNet(nn.Module):
    def __init__(self):
        super(SimpleNet, self).__init__()
        self.fc1 = nn.Linear(784, 256)
        self.fc2 = nn.Linear(256, 128)
        self.fc3 = nn.Linear(128, 10)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        x = self.fc3(x)
        return x

# 生成数据集
def create_dataset():
    data = torch.randn(10000, 784)
    labels = torch.randint(0, 10, (10000,))
    return data, labels

# 训练函数
def train(model, train_loader, criterion, optimizer):
    model.train()
    running_train_loss = 0.0
    for inputs, targets in train_loader:
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, targets)
        loss.backward()
        optimizer.step()
        running_train_loss += loss.item()
    
    avg_train_loss = running_train_loss / len(train_loader)
    return avg_train_loss

# 测试函数,计算相对误差
def test(model, data_loader, criterion):
    model.eval()
    running_val_loss = 0.0
    total_relative_error = 0.0
    with torch.no_grad():
        for inputs, targets in data_loader:
            outputs = model(inputs)
            loss = criterion(outputs, targets)
            running_val_loss += loss.item()
            
            predicted = torch.argmax(outputs, dim=1)
            relative_error = torch.abs(predicted.float() - targets.float()) / (torch.abs(targets.float()) + 1e-8)  # 避免分母为零
            total_relative_error += relative_error.sum().item()
    
    avg_val_loss = running_val_loss / len(data_loader)
    avg_relative_error = total_relative_error / len(data_loader.dataset)
    return avg_val_loss, avg_relative_error

# 主函数
def main():
    model = SimpleNet()
    criterion = nn.CrossEntropyLoss()
    optimizer = optim.SGD(model.parameters(), lr=0.01)

    data, labels = create_dataset()
    train_data, temp_data, train_labels, temp_labels = train_test_split(data, labels, test_size=0.3, random_state=42)
    val_data, test_data, val_labels, test_labels = train_test_split(temp_data, temp_labels, test_size=0.5, random_state=42)

    train_loader = DataLoader(TensorDataset(train_data, train_labels), batch_size=32, shuffle=True)
    val_loader = DataLoader(TensorDataset(val_data, val_labels), batch_size=32, shuffle=False)
    test_loader = DataLoader(TensorDataset(test_data, test_labels), batch_size=32, shuffle=False)

    num_epochs = 50
    patience = 5
    best_val_loss = float('inf')
    early_stop_counter = 0
    train_losses = []
    val_losses = []
    val_relative_errors = []

    for epoch in range(num_epochs):
        train_loss = train(model, train_loader, criterion, optimizer)
        val_loss, val_relative_error = test(model, val_loader, criterion)
        
        train_losses.append(train_loss)
        val_losses.append(val_loss)
        val_relative_errors.append(val_relative_error)

        print(f'Epoch {epoch + 1}/{num_epochs}, Train Loss: {train_loss:.4f}, Val Loss: {val_loss:.4f}, Val Relative Error: {val_relative_error:.4f}')

        if val_loss < best_val_loss:
            best_val_loss = val_loss
            early_stop_counter = 0
        else:
            early_stop_counter += 1
        
        if early_stop_counter >= patience:
            print("Early stopping triggered")
            break

    plt.figure(figsize=(12, 5))

    plt.subplot(1, 2, 1)
    plt.plot(range(1, len(train_losses) + 1), train_losses, label='Train Loss')
    plt.plot(range(1, len(val_losses) + 1), val_losses, label='Validation Loss')
    plt.xlabel('Epochs')
    plt.ylabel('Loss')
    plt.legend()
    plt.title('Training and Validation Loss')

    plt.subplot(1, 2, 2)
    plt.plot(range(1, len(val_relative_errors) + 1), val_relative_errors, label='Validation Relative Error')
    plt.xlabel('Epochs')
    plt.ylabel('Relative Error')
    plt.legend()
    plt.title('Validation Relative Error')

    plt.show()

    # 最终测试集上的评估
    test_loss, test_relative_error = test(model, test_loader, criterion)
    print(f'Test Loss: {test_loss:.4f}, Test Relative Error: {test_relative_error:.4f}')

if __name__ == "__main__":
    main()

代码解释

  1. 添加保护措施

    • 在计算相对误差时,添加一个小数 1e-8 防止分母为零。这避免了相对误差变成 NaN
  2. 训练和验证损失的记录

    • 每个 epoch 结束时,记录训练损失和验证损失,以及验证相对误差。
  3. 早停机制

    • 在验证损失连续多个 epoch 不下降时,触发早停机制,停止训练。
  4. 绘制损失曲线和相对误差曲线

    • 在训练结束后,绘制训练和验证损失曲线,以及验证相对误差曲线。

通过这些修改,可以有效避免相对误差变成 NaN,并通过观察训练和验证损失以及相对误差的变化来判断模型是否过拟合。

内容概要:《2024年中国城市低空经济发展指数报告》由36氪研究院发布,指出低空经济作为新质生产力的代表,已成为中国经济新的增长点。报告从发展环境、资金投入、创新能力、基础支撑和发展成效五个维度构建了综合指数评价体系,评估了全国重点城市的低空经济发展状况。北京和深圳在总指数中名列前茅,分别以91.26和84.53的得分领先,展现出强大的资金投入、创新能力和基础支撑。低空经济主要涉及无人机、eVTOL(电动垂直起降飞行器)和直升机等产品,广泛应用于农业、物流、交通、应急救援等领域。政策支持、市场需求和技术进步共同推动了低空经济的快速发展,预计到2026年市场规模将突破万亿元。 适用人群:对低空经济发展感兴趣的政策制定者、投资者、企业和研究人员。 使用场景及目标:①了解低空经济的定义、分类和发展驱动力;②掌握低空经济的主要应用场景和市场规模预测;③评估各城市在低空经济发展中的表现和潜力;④为政策制定、投资决策和企业发展提供参考依据。 其他说明:报告强调了政策监管、产业生态建设和区域融合错位的重要性,提出了加强法律法规建设、人才储备和基础设施建设等建议。低空经济正加速向网络化、智能化、规模化和集聚化方向发展,各地应找准自身比较优势,实现差异化发展。
数据集一个高质量的医学图像数据集,专门用于脑肿瘤的检测和分类研究以下是关于这个数据集的详细介绍:该数据集包含5249张脑部MRI图像,分为训练集和验证集。每张图像都标注了边界框(Bounding Boxes),并按照脑肿瘤的类型分为四个类别:胶质瘤(Glioma)、脑膜瘤(Meningioma)、无肿瘤(No Tumor)和垂体瘤(Pituitary)。这些图像涵盖了不同的MRI扫描角度,包括矢状面、轴面和冠状面,能够全面覆盖脑部解剖结构,为模型训练提供了丰富多样的数据基础。高质量标注:边界框是通过LabelImg工具手动标注的,标注过程严谨,确保了标注的准确性和可靠性。多角度覆盖:图像从不同的MRI扫描角度拍摄,包括矢状面、轴面和冠状面,能够全面覆盖脑部解剖结构。数据清洗与筛选:数据集在创建过程中经过了彻底的清洗,去除了噪声、错误标注和质量不佳的图像,保证了数据的高质量。该数据集非常适合用于训练和验证深度学习模型,以实现脑肿瘤的检测和分类。它为开发医学图像处理中的计算机视觉应用提供了坚实的基础,能够帮助研究人员和开发人员构建更准确、更可靠的脑肿瘤诊断系统。这个数据集为脑肿瘤检测和分类的研究提供了宝贵的资源,能够帮助研究人员开发出更准确、更高效的诊断工具,从而为脑肿瘤患者的早期诊断和治疗规划提供支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值