201203-pytorch中model模型显示及维度信息(直接打印、summary、make_dot)

引言

在学习Pytorch中,为了更好理解网络结构,需要结合mdoel的图片结构和维度信息才能更好理解。keras中model.summary和plot_model工具就十分好用。在pytorch中,经过多方搜索,下列三种方式有助于自己理解,在此mark一下。其中summary要能知道模型的输入shape,可根据源代码和报错中提示进行尝试。

import torch
from torchviz import make_dot
from torch.autograd import Variable
from torchsummary import summary

model.netG  # 直接打印
summary(model.netG, (3,256,256))  # 每层输出shape
xtmp = Variable(torch.randn(1,3,256,256))
ytmp = model.netG(xtmp)
make_dot(ytmp, params=dict(model.netG.named_parameters())).render('tmp', view=True)  # render用于保存为图片

model.netD
summary(model.netD, (6, 256, 256))
xtmp2 = Variable(torch.randn(1,6,256,256))
ytmp2 = model.netD(xtmp2)
make_dot(ytmp2, params=dict(model.netD.named_parameters())).render('tmp2', view=True)

类似的make_dot,似乎更简洁些, From言有三

import torch
from torch.autograd import Variable
from visualize import  make_dot
x = Variable(torch.randn(1,3,48,48))
model = simpleconv3()
y = model(x)
g = make_dot(y)
g.view()

20200421更新:
HiddenLayer,torchwatch

20201203更新:
https://discuss.pytorch.org/t/how-do-i-check-the-number-of-parameters-of-a-model/4325/22
https://pypi.org/project/pytorch-model-summary/

def count_parameters(model):
    return sum(p.numel() for p in model.parameters() if p.requires_grad)

from prettytable import PrettyTable

def count_parameters(model):
    table = PrettyTable(["Modules", "Parameters"])
    total_params = 0
    for name, parameter in model.named_parameters():
        if not parameter.requires_grad: 
            continue
        param = parameter.numel()
        table.add_row([name, param])
        total_params+=param
    print(table)
    print(f"Total Trainable Params: {total_params}")
    return total_params

summary(model, *inputs, batch_size=-1, show_input=False, show_hierarchical=False,
        print_summary=False, max_depth=1, show_parent_layers=False):
        
# summary的例子
import torch
import torch.nn as nn
import torch.nn.functional as F

from pytorch_model_summary import summary


class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
        self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
        self.conv2_drop = nn.Dropout2d()
        self.fc1 = nn.Linear(320, 50)
        self.fc2 = nn.Linear(50, 10)

    def forward(self, x):
        x = F.relu(F.max_pool2d(self.conv1(x), 2))
        x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
        x = x.view(-1, 320)
        x = F.relu(self.fc1(x))
        x = F.dropout(x, training=self.training)
        x = self.fc2(x)
        return F.log_softmax(x, dim=1)


# # show input shape
# print(summary(Net(), torch.zeros((1, 1, 28, 28)), show_input=True))

# # show output shape
print(summary(Net(), torch.zeros((1, 1, 28, 28)), show_input=False))

# show output shape and hierarchical view of net
print(summary(Net(), torch.zeros((1, 1, 28, 28)), show_input=True, show_hierarchical=True))
<think>嗯,用户想对ResNet18模型进行可视化操作,用的是PyTorch和TensorFlow。首先,我得回忆一下模型可视化的常用方法。通常有两种主要方式:结构可视化和训练过程可视化。结构可视化可能包括模型架构图、层参数分布,而训练过程可视化可能涉及损失曲线、准确率曲线等。 用户提到了ResNet18,这是ResNet的一个变种,有18层深度。我需要考虑在PyTorch和TensorFlow中如何加载预训练的ResNet18模型,并进行可视化。可能需要用到像TensorBoard这样的工具,或者第三方库如torchviz、Netron。 首先,对于PyTorch,我记得可以用torchsummary来输出模型结构,或者使用torchviz生成计算图。此外,TensorBoard和PyTorch的结合也是可能的,通过SummaryWriter来记录模型结构。在TensorFlow中,Keras自带的model.summary()可以展示层信息,而TensorBoard同样可以可视化模型结构。 接下来,用户可能需要具体的步骤,比如安装必要的库,如何写代码加载模型,生成结构图。需要注意的是,不同框架下的实现方式不同,所以需要分别说明PyTorch和TensorFlow的方法。例如,在PyTorch中,可能需要使用make_dot来生成计算图,而在TensorFlow中,使用keras.utils.plot_model来绘制模型图。 另外,用户可能还关心可视化的细节,比如如何显示各层的参数分布,或者训练过程中的指标变化。这时候可能需要更详细的代码示例,比如在训练循环中记录损失和准确率,然后在TensorBoard中查看。 还要检查是否有相关的引用资料。用户提供的引用中有提到PyTorch的数据处理与模型可视化,这可能对应引用[2]中的内容。而引用[1]中的TensorFlow代码示例可能对TensorFlow部分有帮助。 最后,需要确保回答的结构清晰,分步骤说明PyTorch和TensorFlow的实现方法,并给出代码示例。同时,生成相关问题,比如模型可视化工具的选择、参数分布可视化方法等。</think>### ResNet18模型可视化实现方法(PyTorch/TensorFlow) #### 一、PyTorch实现方法 1. **安装可视化工具** ```bash pip install torchsummary torchviz tensorboard ``` 2. **模型结构可视化** ```python import torch import torchvision.models as models from torchsummary import summary from torchviz import make_dot # 加载预训练模型 resnet18 = models.resnet18(pretrained=True) # 文本形式输出结构 summary(resnet18, (3, 224, 224)) # 输入张量维度 # 生成计算图 x = torch.randn(1,3,224,224) y = resnet18(x) make_dot(y, params=dict(resnet18.named_parameters())).render("resnet18", format="png") ``` 3. **TensorBoard可视化(需配合训练代码)** ```python from torch.utils.tensorboard import SummaryWriter writer = SummaryWriter() writer.add_graph(resnet18, torch.rand(1,3,224,224)) writer.close() ``` #### 二、TensorFlow实现方法 1. **使用Keras内置方法** ```python import tensorflow as tf from tensorflow.keras.applications import ResNet50 # TensorFlow官方暂未提供ResNet18 from tensorflow.keras.utils import plot_model model = ResNet50(weights='imagenet') # 以ResNet50为例 # 文本结构输出 model.summary() # 生成结构图 plot_model(model, to_file='model.png', show_shapes=True) ``` 2. **TensorBoard可视化** ```python # 在模型编译后添加回调 tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir='./logs') # 训练时添加回调 model.fit(..., callbacks=[tensorboard_callback]) ``` #### 三、可视化效果增强技巧 1. **参数分布可视化** ```python # PyTorch示例 import matplotlib.pyplot as plt weights = resnet18.conv1.weight.data.cpu().numpy() plt.hist(weights.flatten(), bins=50) plt.title("第一卷积层权重分布") ``` 2. **特征图可视化** ```python # TensorFlow特征提取示例 layer_outputs = [layer.output for layer in model.layers[:5]] activation_model = tf.keras.Model(inputs=model.input, outputs=layer_outputs) activations = activation_model.predict(img_array) ``` [^1]: 参考代码来自TensorFlow官方文档 [^2]: 模型可视化方法参考《PyTorch 2.0深度学习从零开始学》第6章
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值