稠密连接网络(DenseNet) 讨论区


#8

你好像没有理解稠密块的作用,它用了concat,把输入channel,中间层channel,结尾channel一起concat,所以out的channel会很大,这里即使用了过渡层1*1卷积进行减半降维,channel维数也是不断递增的,这样可以理解吗


#9

原论文中一个dense block是由1x1的conv+3x3的conv


#10

嗯,是呀,我就是对照论文,又仔细算了下层数,教程里面写的是121层,实际每个dense block 少了一个1*1 卷积


#11

貌似DenseNet挺吃记忆体,不过似乎有可以减少记忆体使用的方式:Memory-Efficient Implementation of DenseNets

想请教各位这篇否已经有人在MXNET/Gluon上实现了?或是有人能提示我一下如何将其在MXNET/Gluon实现?(原作者貌似是使用LuaTorch/ PyTorch)


#12

这个模型在gluon model zoo里有,但是目前没有用省内存的方法实现,会考虑改进


#13

是的 我也觉得channel忘记/=2了


#14

+1认为channel忘记除2了。

去查了下keras.applications.densenet里写的,transition_block里先获取了输入的channels的值,再将内部的1 x 1卷积的通道数设置为channels // 2(不过keras的实现里是设置了一个reduction比率,但是取值一直是0.5)。


#15

论文中最后是用了Global Avg Pooling,这里只是用了普通的Avg Pooling?


#16

教程实现过程中几乎没有定义forward函数,只有DenseBlock里有forward, 其他地方都没有.是其他layer都自带默认的forward吗?


#17

的确如此,如果像文档描述的过滤层是将通道减半的话,是应该是把channels//2赋值回channels,不然不是减半,而是比减半多一点,不过也是可跑的通的,延迟初始化就起作用了,最后还是能够到10分类。


#18

到最后宽和高都是1x1,那么Global Avg Pooling和Avg Pooling就没啥区别了


#19

请问原文中 121 层是怎么计算得到的,我看了好久也没发现有121层?


#20

mxnet.base.MXNetError: Error in operator conv10_fwd: [21:00:24] c:\projects\mxnet-distro-win\mxnet-build\src\operator./convolution-inl.h:492: Check failed: dshp.ndim() == 4U (2 vs. 4) Input data should be 4D in batch-num_filter-y-x

请问这个错误遇见过吗


#21

@szha 新版教程里发现了bug: DenseBlock中的forward方法,return Y应当改为return X


#22

@mli 应该已经修过了


#23

我也感觉很奇怪,难怪通道数计算出来的是10,不是23


#24

同意//=2, @szha


#25

image
image
这个forward函数里面的代码是下图的意思


红色箭头是代码的意思 每块的输入和输出在通道维上连结
但是绿色是原论文里面的意思就是下图
image
并不是每块的输入和输出在通道维上连结而是X、前面所有卷积输出和当前卷积输出在通道维上连结,ps这里当为第一个卷积时候不存在上一个卷积即只有输入X。大佬们能解答一下小弟的疑惑吗?谢谢


#26

原文中Dense connectivity的公式说明更清楚, x_l=H_l([x_0, x_1, ..., x_{l-1} ]) ,依据你的理解就会变成那么第 l 层会出现 lx_0 ,实际上图片的意思只是说每一层都会接收到前面所有层的信息。


#27

关于Densenet的Feature Reuse分析环节的问题:请问各层之间的依赖性是如何计算的?