pytorch使用记录(二) 参数初始化

本文介绍如何使用PyTorch对卷积层和批归一层进行权重初始化。通过定义一个初始化函数并利用apply()方法应用于网络模型的各个子模块中。此外,还介绍了如何查看各层的权重和偏置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要记录如何在pytorch中对卷积层和批归一层权重进行初始化,也就是weight和bias。

主要会用到torch的apply()函数。【apply】

apply(fn):将fn函数递归地应用到网络模型的每个子模型中,主要用在参数的初始化。

使用apply()时,需要先定义一个参数初始化的函数。

def weight_init(m):
    classname = m.__class__.__name__ # 得到网络层的名字,如ConvTranspose2d
    if classname.find('Conv') != -1:  # 使用了find函数,如果不存在返回值为-1,所以让其不等于-1
        m.weight.data.normal_(0.0, 0.02)
    elif classname.find('BatchNorm') != -1:
        m.weight.data.normal_(1.0, 0.02)
        m.bias.data.fill_(0)

之后,定义自己的网络,得到网络模型,使用apply()函数,就可以分别对conv层和bn层进行参数初始化。

model = net()
model.apply(weight_init)

以上就可以对各层进行参数初始化。

如何查看效果呢?也就是如何查看各层的weight和bias。

需要用到上一篇文章【点此到达】中的state_dict()函数,返回网络的所有参数。具体如下:

params = model.state_dict()
    for k, v in params.items():
        print k  # 打印网络中的变量名,找出自己想查看的参数名字,这个与自己定义网络时起的名字有关。
    print params['net.convt1.weight']   # 打印convt1的weight
    print params['net.convt1.bias'] # 打印convt1的bias


### 如何在 PyTorch 中集成和使用 TensorBoard 进行可视化 TensorBoard 是 TensorFlow 提供的一个强大的工具,用于跟踪实验指标、优化模型性能以及进行数据可视化。尽管它是为 TensorFlow 设计的,但在 PyTorch 中也可以轻松集成并使用。 #### 安装依赖项 要将 TensorBoard 集成到 PyTorch 工作流中,首先需要安装 `tensorboard` 和 `torch.utils.tensorboard` 模块。可以通过以下命令完成安装[^3]: ```bash pip install torch tensorboard ``` #### 初始化 SummaryWriter PyTorch 使用 `SummaryWriter` 来记录日志文件以便于 TensorBoard 可视化。以下是初始化 `SummaryWriter` 的基本代码示例: ```python from torch.utils.tensorboard import SummaryWriter # 创建一个 writer 对象,指定保存路径 writer = SummaryWriter('runs/experiment_1') ``` 在这里,“runs/experiment_1” 表示存储日志文件的目录名称[^4]。 #### 记录标量值 可以利用 TensorBoard 跟踪损失函数或其他标量指标的变化情况。例如,在训练循环中更新这些值: ```python for epoch in range(num_epochs): loss = train_one_epoch(model, optimizer, criterion, data_loader) # 将当前 epoch 的损失写入 TensorBoard 日志 writer.add_scalar('Loss/train', loss, epoch) ``` 上述代码片段展示了如何将每轮迭代中的训练损失记录下来[^5]。 #### 添加图形表示 除了简单的数值外,还可以绘制更复杂的图表形式展示更多信息。比如混淆矩阵或者直方图等复杂结构也能被很好地支持。 ```python import numpy as np # 假设我们有一些预测结果 y_pred 和真实标签 y_true y_true = ... y_pred = ... # 绘制混淆矩阵 cm = confusion_matrix(y_true, y_pred) fig, ax = plt.subplots() sns.heatmap(cm, annot=True, fmt='d', cmap="YlGnBu", ax=ax) # 将 matplotlib 图像转换为 PIL Image 并进一步处理后上传至 TensorBoard img_buf = io.BytesIO() plt.savefig(img_buf, format='png') img_buf.seek(0) pil_img = Image.open(img_buf).convert("RGB") np_array = np.array(pil_img) writer.add_image('Confusion Matrix', np_array.transpose((2, 0, 1)), global_step=epoch) ``` 此部分说明了怎样把自定义绘图加入到 TensorBoard 报告里去[^6]。 #### 启动 TensorBoard 查看器 当所有的日志都已准备好之后,就可以启动 TensorBoard 应用来查看它们了。运行下面这条指令即可打开本地服务器上的界面访问地址 http://localhost:6006/ : ```bash tensorboard --logdir runs/ ``` 这一步骤允许用户通过浏览器直观地浏览之前所创建的各种统计数据与图像等内容[^7]。 #### 结合 Grad-CAM 实现高级功能 如果希望深入探索神经网络内部工作机制,则可考虑结合 grad-cam 方法来进行更加细致化的分析。具体操作流程如下所示: 先加载预训练好的 CNN 模型实例;接着选取目标类别作为输入参数传递给 cam 函数计算相应热力图;最后叠加原始图片之上形成最终效果呈现出来。 ```python from torchvision.models import resnet50 from pytorch_grad_cam import GradCAM from pytorch_grad_cam.utils.image import show_cam_on_image model = resnet50(pretrained=True) target_layer = model.layer4[-1] cam = GradCAM(model=model, target_layers=[target_layer], use_cuda=torch.cuda.is_available()) grayscale_cam = cam(input_tensor=input_tensor, targets=None)[0, :] visualization = show_cam_on_image(rgb_img_float, grayscale_cam, use_rgb=True) writer.add_image('Grad-CAM Visualization', visualization.transpose((2, 0, 1))) ``` 这里实现了基于 ResNet 架构下某一层输出特征映射生成注意力区域高亮显示的效果,并将其存档至 TensorBoard 当前会话之中[^8]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值