PyTorch学习记录七——异常处理

try&except

在Pytorch中,异常指的是程序运行时可能出现的错误或异常情况,例如数据类型错误、数组越界、内存错误等。Pytorch提供了一些内置的异常类,我们可以通过try语句捕捉这些异常进行相应的处理。

一、PyTorch中的异常类

  • TypeError:当操作或函数应用于不兼容的数据类型时抛出的异常
  • ValueError:当操作或函数应用于不合法的值时抛出的异常
  • RuntimeError:在运行时出现的一般性异常
  • IndexError:当索引超出范围或无效时抛出的异常
  • 除了这些常见的异常类,pytorch还提供了一些其他的特定异常类,如 FileNotFoundError 等。

二、异常处理语法

# 异常处理的语法结构
try:
	# 可能引发异常的代码块
except:
	# 捕捉到异常时的处理代码块
else:
	# 没有异常时执行的代码块
finally:
	# 无论是否有异常都会执行的代码块

try 代码块中,我们放置的代码如果发生异常,python会立即跳转到except代码块,执行对异常的捕获和处理。如果没有发生异常,程序将继续执行 else 代码块。最后,不论是否发生异常,都会执行 finally 代码块。

三、基本异常处理示例

  • 1.处理类型错误

在这个示例里,我们尝试对一个整数类型的张量进行除法操作,从而引发 TypeError 异常。

import torch

try:
	a = torch.tensor(5)  # 没有加小数点,所以是整型
	result = a / 0
	print(result)
except Exception as e:
	print("类型错误:", e)

输出如下
在这里插入图片描述
一般来讲,inf代表无穷数,nan代表出现了分母为0的情况。但是这里出现inf可能代表的是result为无穷大。
因此,也没有抛出我们所预想的异常。给出的是 print(result) 运行后打印出的结果,并没有执行except语句。
[infinite&nane]https://blog.youkuaiyun.com/weixin_43483381/article/details/121864858

  • 2.处理索引错误

在这个示例里,我们将尝试访问一个超出张量范围的索引,从而引发 IndexError 异常。

try:
    a = torch.tensor([1, 2, 3, 4, 5])
    print(a[5])
# except IndexError as e:
except Exception as e:
    print("索引错误:", e)

输出如下
在这里插入图片描述

注意,最好是都用 Exception ,使用其它如 ValueError、IndexError 等必须与真实异常相对应,否则会导致except语句无法执行。

  • 3.使用 finally 语句

在这个示例中,我们尝试读取一个不存在的文件,并使用 finally 语句关闭文件。

try:
    file = open("nonexistent_file.txt", "r")
    content = file.read()
    print(content)
except FileNotFoundError as e:
    print("文件不存在")
finally:
    file.close()
    print("文件已关闭")

四、模型训练得应用示例

[]https://blog.51cto.com/u_16175474/13344928

import torch
import torch.nn as nn
import torch.optim as optim

# 假设我们有一个简单的线性回归模型
class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.fc = nn.Linear(1, 1)

    def forward(self, x):
        return self.fc(x)


model = SimpleModel()
optimizer = optim.SGD(model.parameters(), lr=0.01)
criterion = nn.MSELoss()

data = torch.tensor([[1.0], [2.0], [3.0]], dtype=torch.float32)
target = torch.tensor([[2.0], [3.0], [4.0]], dtype=torch.float32)

for torch in range(10):
    try:
        optimizer.zero_grad()  # 清空之前的梯度
        output = model(data)
        loss = criterion(output, target)  # 计算损失
        loss.backward()  # 反向传播计算梯度
        optimizer.step()  # 更新参数
    except RuntimeError as e:
        print(f"运行时错误: {e}")
    finally:
        print(f"Epoch {epoch + 1}: Loss = {loss.item()}")

在上述代码中,我们对每个epoch的训练过程进行了 try 包裹,这意味着如果出现在前向传播或反向传播时的运行错误,我们可以捕捉到错误信息并进行处理,而不会导致整个程序的崩溃。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值