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 包裹,这意味着如果出现在前向传播或反向传播时的运行错误,我们可以捕捉到错误信息并进行处理,而不会导致整个程序的崩溃。