【已解决】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,所以就会报错,也就是每一层的都可以把输入图片整数处理输出图片。
每一层的通道也要设置好,不然一样也会报错,

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

杰柯

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

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

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

打赏作者

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

抵扣说明:

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

余额充值