关于SENet的疑惑?
收藏
看到SENet的实现代码,在
global_avgpool = fluid.layers.pool2d(input,pool_type='avg',global_pooling=True) //全局平均池化
sq = fluid.layers.fc(global_avgpool,size=num_channels//16,act='relu') // 压缩
ex = fluid.layers.fc(sq,size=num_channels,act='sigmoid') //膨胀
mul = fluid.layers.elementwise_mul(input,ex,axis=0) // 输入和注意力相乘
有个疑惑?在最后的相乘步骤,用了elementwise_mul 为什么 axis = 0 ? axis = 0不就代表着【n,c,h,w】中的 n 吗? 不应该是在 通道c 的维度相乘吗? axis = 1?
0
收藏
请登录后评论
如果elementwise_mul的2个输入shape相同,axis参数无用,输出结果总是对应元素相乘的矩阵
你的代码没问题,具体的解释发布出去,审核不通过,
可以参考这个,
import paddle
import numpy as np
from paddle.fluid.layers import elementwise_mul
x_v = [[[[1,1],[2,2],[3,3]]],[[[3,3],[2,2],[1,1]]]]
y_v = [[1],[2]]
x_np = np.array(x_v).astype(np.float64)
# x_np = np.ones((2,1,3,2))*2
y_np = np.array(y_v).astype(np.float64)
with paddle.fluid.dygraph.guard():
x = paddle.fluid.dygraph.to_variable(x_np)
y = paddle.fluid.dygraph.to_variable(y_np)
print(x.shape)
print(y.shape)
r = elementwise_mul(x,y,axis=1)
print(r)
print(r.numpy())
elementwise_mul的2个输入shape不同时的输出,
文字发不出去,看下图片吧,具体的运行下前面的代码就清楚了
我觉得 @xashagua 解释的很好,axis这种抽象的东西要是让我们自己理解起来会很困难。如果一个二维数组的相加,我们可以很轻松理解;但是四维Tensor按照axis相加的话,我们很难去想相加的两个数据应该输出什么结果
不过我没弄懂这个axis=1是代表第一维度吗?那第一维度指的是下标为1的数据还是下标为0的数据呢?
1是下标,我习惯称呼第0、1、2、3维度
飞桨的tensor对象,把常用的运算符重载了,加减乘除(点乘)直接用~~
动态图下,我就是直接用,测试结果和用layers下的方法一样
飞桨的函数确实会在某些条件下忽略参数。比如pool时,如果用全局池化,pool size 就被忽略了
详细说明会在函数的文档里注明
这样做也是为了方便、自适应吧