网络模型可以在定义时就放在CUDA上,也可以在实例化时放在CUDA上。
如果你的模型中包含可学习参数(例如神经网络中的权重和偏差),则通常最好在模型定义时将其放在CUDA上。这样可以确保所有参数都在同一个设备上,并在训练期间自动处理设备移动。例如:
import torch class MyModel(torch.nn.Module): def __init__(self): super(MyModel, self).__init__() self.linear = torch.nn.Linear(2, 1) def forward(self, x): return self.linear(x) model = MyModel().cuda() # 将模型定义在 CUDA 上
在这个示例中,我们定义了一个简单的MyModel
类,其中包含一个线性层作为其唯一子模块。我们在构造函数中调用基类构造函数super()
并初始化线性层。然后,我们将整个模型放在CUDA上,方法是使用.cuda()
方法。现在,我们可以像这样使用模型:
x = torch.tensor([[1.0, 2.0], [3.0, 4.0]]).cuda() y = model(x) print(y)
在这里,我们首先将输入张量x
移动到CUDA上,然后使用模型对其进行前向传递,产生输出张量y
。由于模型在CUDA上定义,因此它将自动处理设备移动,并将输出张量y
移回CUDA上。
如果你的模型不包含可学习参数,或者你想要在实例化时动态选择设备,则可以在实例化时将模型放在CUDA上。例如:
import torch class MyModel(torch.nn.Module): def __init__(self): super(MyModel, self).__init__() self.relu = torch.nn.ReLU() def forward(self, x): return self.relu(x) model = MyModel() # 模型定义不包含可学习参数 device = 'cuda' if torch.cuda.is_available() else 'cpu' # 动态选择设备 model.to(device) # 将模型放在指定设备上
在这个示例中,我们定义了一个简单的MyModel
类,其中只包含一个ReLU激活函数,没有可学习参数。我们在构造函数中调用基类构造函数super()
并初始化ReLU激活函数。然后,我们根据系统是否支持CUDA动态选择设备,并使用.to()
方法将模型放在指定设备上。
现在,我们可以像这样使用模型:
x = torch.tensor([-1.0, 2.0, -3.0]) y = model(x.to(device)) print(y)
在这里,我们首先将输入张量x
移动到指定设备上,然后使用模型对其进行前向传递,产生输出张量y
。由于模型在实例化时放置在指定设备上,因此它将自动处理设备移动,并将输出张量y
移回指定设备上。