【已解决】dnnsvg:AssertionError错误,深度学习框架模型矢量图

错误

from dnnsvg.layers import Convolution2D
from dnnsvg.layers import Deconvolution2D
from dnnsvg.layers import FullyConnected
from dnnsvg.layers import FullyConnectedLSTM
from dnnsvg.layers import MaxPooling
from dnnsvg.layers import Reshape
from dnnsvg import Tensor3D
from dnnsvg import SVGBuilder
import argparse
import os
def write_svg_to_file(filename, svg):
    with open(filename, 'w') as f:
        f.write(svg)

def AlexNet():
    width = 900
    height = 400
    initial_position = (100, height / 2.0)
    input_tensor = Tensor3D(x=initial_position[0],
                            y=initial_position[1],
                            depth=1,
                            height=224,
                            width=224,
                            scale=(0.1, 1, 1))
    svg = SVGBuilder(height=height, width=width) \
        .add_layer(Convolution2D(in_channels=None, out_channels=96, ksize=11, stride=4)) \
        .add_layer(MaxPooling(ksize=3, stride=2)) \
        .add_layer(Convolution2D(in_channels=96, out_channels=256, ksize=5, stride=1, pad=2)) \
        .add_layer(MaxPooling(ksize=3, stride=2)) \
        .add_layer(Convolution2D(in_channels=256, out_channels=384, ksize=3, stride=1, pad=1)) \
        .add_layer(Convolution2D(in_channels=384, out_channels=384, ksize=3, stride=1, pad=1)) \
        .add_layer(Convolution2D(in_channels=384, out_channels=256, ksize=3, stride=1, pad=1)) \
        .add_layer(MaxPooling(ksize=3, stride=2)) \
        .add_layer(Reshape(output_shape=(1, 6400))) \
        .add_layer(FullyConnected(output_shape=(1, 4096))) \
        .add_layer(FullyConnected(output_shape=(1, 4096))) \
        .add_layer(FullyConnected(output_shape=(1, 10))) \
        .build(input_tensor)

    filename = 'AlexNet.svg'
    if os.path.exists(filename):
        os.remove('AlexNet.svg')
        write_svg_to_file(filename, svg)
    else:
        write_svg_to_file(filename, svg)
AlexNet()


D:\Users\ZPJ\Miniconda3\python.exe "C:/Users/ZPJ/Desktop/d2l-zh/Untitled Folder/drawgraph.py"
Traceback (most recent call last):
  File "C:/Users/ZPJ/Desktop/d2l-zh/Untitled Folder/drawgraph.py", line 74, in <module>
    AlexNet()
  File "C:/Users/ZPJ/Desktop/d2l-zh/Untitled Folder/drawgraph.py", line 65, in AlexNet
    .build(input_tensor)
  File "D:\Users\ZPJ\Miniconda3\lib\site-packages\dnnsvg-0.0.1-py3.7.egg\dnnsvg\svg_builder.py", line 19, in build
  File "D:\Users\ZPJ\Miniconda3\lib\site-packages\dnnsvg-0.0.1-py3.7.egg\dnnsvg\layers\tensor_decorator.py", line 6, in __call__
  File "D:\Users\ZPJ\Miniconda3\lib\site-packages\dnnsvg-0.0.1-py3.7.egg\dnnsvg\layers\reshape.py", line 21, in decorate
  File "D:\Users\ZPJ\Miniconda3\lib\site-packages\dnnsvg-0.0.1-py3.7.egg\dnnsvg\layers\reshape.py", line 122, in _assert_has_same_size
AssertionError

解决办法:将输入图改为(195,195),就可以解决

    input_tensor = Tensor3D(x=initial_position[0],
                            y=initial_position[1],
                            depth=1,
                            height=195,
                            width=195,
                            scale=(0.1, 1, 1))
D:\Users\ZPJ\Miniconda3\python.exe "C:/Users/ZPJ/Desktop/d2l-zh/Untitled Folder/drawgraph.py"

Process finished with exit code 0

上图
AlexNet

为什么不能是(224,224)?

解析
图像每经过一层的时候,这个式子
经过一层输出图像size计算公式
n h − k h + p h + s h s h ∗ n w − k w + p w + s w s w \dfrac {n_{h}-k_{h}+p_{h}+s_{h}}{s_{h}}*\dfrac {n_{w}-k_{w}+p_{w}+s_{w}}{s_{w}} shnhkh+ph+shswnwkw+pw+sw
n h 表 示 输 入 图 片 的 h e i g h t n_{h}表示输入图片的height nhheight
k h 表 示 输 入 图 片 经 过 那 一 层 运 算 的 k e r n e l _ s i z e 的 h e i g h t k_{h}表示输入图片经过那一层运算的kernel\_size的height khkernel_sizeheight
p h 表 示 输 入 图 片 经 过 那 一 层 运 算 的 p a d d i n g 值   记 得 p a d d i n g 值 应 该 要 乘 2 才 对 例 如 p a d = 1 , p h = 2 p_{h}表示输入图片经过那一层运算的padding值\,记得padding值应该要乘2才对 例如pad=1,p_{h}=2 phpaddingpadding2pad=1,ph=2
s h 表 示 输 入 图 片 经 过 那 一 层 的 步 幅 值 s t r i d e s s_{h}表示输入图片经过那一层的步幅值strides shstrides

举个例子:有一张图片我们只计算它经过一层卷积层后的窗口变化,不考虑通道数。
输入图片为28*28,卷积层为conv2D(in_channel=None, out_channel=6, ksize=11, stride=4, pad=1)
n h = 28   , k h = 11   , p h = 2   , s h = 4 n_{h}=28 \ , k_{h}=11 \ , p_{h}=2\ , s_{h}=4 nh=28 ,kh=11 ,ph=2 ,sh=4
输出图片的 height * weight = 5.75 * 5.75
使用dnnsvg的时候,并不能自动把5.75化成5,所以就会报错,也就是每一层的都可以把输入图片整数处理输出图片。
每一层的通道也要设置好,不然一样也会报错,

### 解决方案 当遇到 `AssertionError: Torch not compiled with CUDA enabled` 错误时,这表明当前安装的 PyTorch 版本不支持 CUDA 或者未正确配置 GPU 支持。以下是针对 A 卡(AMD 显卡)环境的具体解决方案。 #### 1. 验证硬件和驱动程序兼容性 在解决问题之前,需确认显卡是否支持 ROCm(Radeon Open Compute Platform),这是 AMD 提供的一种开源计算框架[^3]。运行以下命令来验证系统是否已启用 ROCm: ```bash rocm-smi ``` 如果显示正常,则说明 ROCm 已经被正确安装;否则需要先安装 ROCm 并更新相关驱动程序[^1]。 #### 2. 安装适合的 PyTorch 版本 对于基于 AMD Radeon 的设备,PyTorch 社区提供了专门适配 ROCm 的构建版本。可以通过以下 pip 命令安装最新版支持 ROCm 的 PyTorch: ```bash pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm5.4.2 ``` 上述 URL 中指定了特定于 ROCm 的镜像源地址,请根据实际使用的 ROCm 版本来调整链接中的版本号[^2]。 #### 3. 测试 CUDA 和 GPU 可用性 完成安装之后,在 Python 脚本或者交互式环境中执行如下代码片段测试设置是否生效: ```python import torch print("是否可用:", torch.cuda.is_available()) # 如果返回 True 表明可以访问到至少一块 NVIDIA 设备; 对于 A 卡应改为 rocm_is_available() print("GPU 数量:", torch.cuda.device_count()) print("torch 方法查看 CUDA 版本:", torch.version.cuda) print("当前 GPU 索引号:", torch.cuda.current_device()) ``` 注意这里提到的是 cuda 函数系列调用,而实际上对于 AMD 架构应当替换为对应的 roc 函数接口实现。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰柯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值