torch helper文件

import matplotlib.pyplot as plt
import numpy as np
from torch import nn, optim
from torch.autograd import Variable


def test_network(net, trainloader):

    criterion = nn.MSELoss()
    optimizer = optim.Adam(net.parameters(), lr=0.001)

    dataiter = iter(trainloader)
    images, labels = dataiter.next()

    # Create Variables for the inputs and targets
    inputs = Variable(images)
    targets = Variable(images)

    # Clear the gradients from all Variables
    optimizer.zero_grad()

    # Forward pass, then backward pass, then update weights
    output = net.forward(inputs)
    loss = criterion(output, targets)
    loss.backward()
    optimizer.step()

    return True


def imshow(image, ax=None, title=None, normalize=True):
    """Imshow for Tensor."""
    if ax is None:
        fig, ax = plt.subplots()
    image = image.numpy().transpose((1, 2, 0))

    if normalize:
        mean = np.array([0.485, 0.456, 0.406])
        std = np.array([0.229, 0.224, 0.225])
        image = std * image + mean
        image = np.clip(image, 0, 1)

    ax.imshow(image)
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    ax.spines['left'].set_visible(False)
    ax.spines['bottom'].set_visible(False)
    ax.tick_params(axis='both', length=0)
    ax.set_xticklabels('')
    ax.set_yticklabels('')

    return ax


def view_recon(img, recon):
    ''' Function for displaying an image (as a PyTorch Tensor) and its
        reconstruction also a PyTorch Tensor
    '''

    fig, axes = plt.subplots(ncols=2, sharex=True, sharey=True)
    axes[0].imshow(img.numpy().squeeze())
    axes[1].imshow(recon.data.numpy().squeeze())
    for ax in axes:
        ax.axis('off')
        ax.set_adjustable('box-forced')

def view_classify(img, ps, version="MNIST"):
    ''' Function for viewing an image and it's predicted classes.
    '''
    ps = ps.data.numpy().squeeze()

    fig, (ax1, ax2) = plt.subplots(figsize=(6,9), ncols=2)
    ax1.imshow(img.resize_(1, 28, 28).numpy().squeeze())
    ax1.axis('off')
    ax2.barh(np.arange(10), ps)
    ax2.set_aspect(0.1)
    ax2.set_yticks(np.arange(10))
    if version == "MNIST":
        ax2.set_yticklabels(np.arange(10))
    elif version == "Fashion":
        ax2.set_yticklabels(['T-shirt/top',
                            'Trouser',
                            'Pullover',
                            'Dress',
                            'Coat',
                            'Sandal',
                            'Shirt',
                            'Sneaker',
                            'Bag',
                            'Ankle Boot'], size='small');
    ax2.set_title('Class Probability')
    ax2.set_xlim(0, 1.1)

    plt.tight_layout()

————————————————
原文链接:https://blog.csdn.net/qq_28368377/article/details/105588250

 

 

### ONNX 模型转换为 PyTorch 模型的方法及相关工具 ONNX 是一种跨框架的模型交换格式,允许不同深度学习框架之间的模型互操作。尽管 ONNX 主要设计用于从其他框架导出到统一格式以便部署或再导入至其他框架,但确实存在一些工具能够将 ONNX 模型反向转换为 PyTorch 模型。 #### 1. **onnx2torch** `onnx2torch` 是一款专门用来将 ONNX 模型转换为 PyTorch 模型的开源工具[^1]。它具有以下特点: - 支持广泛的场景,包括但不限于模型迁移、兼容性和研究用途。 - 提供简单易用的接口,仅需少量代码即可完成转换。 - 可扩展性强,用户可以根据需求自定义转换规则以适应未覆盖的 ONNX 层。 安装方式如下: ```bash pip install onnx2torch ``` 基本使用示例: ```python import onnx2torch # 导入 ONNX 文件并生成相应的 PyTorch 模型类 model_pytorch = onnx2torch.convert('path/to/your/model.onnx') # 保存生成的 PyTorch 模型 torch.save(model_pytorch.state_dict(), 'converted_model.pth') ``` 需要注意的是,由于 ONNX 和 PyTorch 的表达能力可能存在差异,因此并非所有的 ONNX 运算符都能完美映射到 PyTorch 上。在这种情况下,可能需要手动干预来补充缺失的部分。 #### 2. **手工重建模型结构** 对于某些特殊情形下的 ONNX 模型(特别是那些包含大量定制运算符的情况),直接自动化工具未必能完全满足需求。此时可以选择依据 ONNX 文件的内容逐层构建等效的 PyTorch 模型。 步骤概述: - 解析 ONNX 文件获取完整的网络拓扑信息及其参数。 - 根据每一层的操作类型创建匹配的 PyTorch Layer。 - 复制权重数据填充新建的 PyTorch Layers。 下面是一个简单的演示脚本片段: ```python import onnx from onnx import numpy_helper import torch.nn as nn def convert_layer(onnx_node): """根据给定节点名称返回对应 PyTorch layer""" node_op_type = onnx_node.op_type if node_op_type == 'Conv': return nn.Conv2d(...) elif node_op_type == 'BatchNormalization': return nn.BatchNorm2d(...) # 添加更多类型的处理... # 加载 ONNX 并提取所需信息 model_onnx = onnx.load("input_model.onnx") graph_def = model_onnx.graph layers = [] for node in graph_def.node: layers.append(convert_layer(node)) # 组合成完整模型 custom_torch_model = nn.Sequential(*layers) ``` 显然这种方法更加耗时且技术难度较高,但它提供了最大的灵活性去应对各种复杂状况。 --- ### 总结 目前最推荐的方式还是利用成熟的第三方库如 `onnx2torch` 来实现 ONNX 至 PyTorch 的无缝衔接[^1]。然而当面临极为特殊的 ONNX 构件时,则不得不依靠人工手段逐步还原整个神经网络架构。无论采取何种途径都建议事先确认目标 ONNX 模型的有效性,可通过内置 API 如 `onnx.checker.check_model()` 完成初步检验[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值