import torch import torch.nn as nn from torchviz import make_dot import torch.nn.functional as F class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 6, 5) self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(6, 16, 5) self.fc1 = nn.Linear(16 * 5 * 5, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): x = self.pool(F.relu(self.conv1(x))) x = self.pool(F.relu(self.conv2(x))) x = x.view(-1, 16 * 5 * 5) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x model = Net() x = torch.randn(1, 3, 32, 32) y = model(x) make_dot(y, params=dict(list(model.named_parameters()) + [('x', x)])) make_dot.save('model.png')
时间:2023-02-12 14:40:21 浏览:34
上面的代码定义了一个类Net,继承了torch.nn.Module。在Net的__init__()函数中定义了卷积层conv1和conv2,池化层pool,全连接层fc1、fc2、fc3。并在forward函数中定义了一个前向传播过程。在代码最后,使用了torch.randn来生成一个随机张量,并使用自定义的网络进行一次前向传播,最后使用torchviz中的make_dot函数可视化网络结构,并保存为.png文件。
相关问题
from torch import nn和import torch.nn as nn 一样吗
这两个语句的意思是一样的,都是导入 PyTorch 中的 nn 模块。两者的区别在于前者是直接将 nn 模块中的内容导入到当前命名空间中,因此在使用 nn 模块中的内容时可以直接使用类名或函数名,而后者是使用 as 关键字将 nn 模块的内容导入到当前命名空间中,并将 nn 模块命名为 torch.nn。因此,使用后者时需要使用 torch.nn.类名 或 torch.nn.函数名 的方式访问 nn 模块中的内容。
举个例子,假设在 nn 模块中有一个类叫做 Linear,前者可以直接使用 Linear 来创建一个 Linear 对象,而后者则需要使用 torch.nn.Linear 来创建一个 Linear 对象。
总的来说,两者的使用方式差不多,只是一个直接将 nn 模块中的内容导入,另一个是使用 as 关键字将 nn 模块的内容导入到当前命名空间并命名为 torch.nn。
import torch.nn.functional as f
torch.nn.functional 是 PyTorch 中的一个模块,包含了许多神经网络的常用功能,如激活函数,损失函数,卷积和池化等。通过使用 import torch.nn.functional as f 这种语句,可以简化调用这些函数的语法,使得代码更简洁易读。