总体约束
设:
Ny, Cy, Hy, Wy [x1] = x.shape
Nk, Ck/group, Hk, Wk = filter.shape (k=kernel)
stride、stride_h、stride_w和pad、pad_h、pad_w处理逻辑为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | if stride.size() == 0:
stride_h, stride_w
elif stride.size() == 1:
stride_h, stride_w = stride[0]
else:
stride_h = stride[0]
stride_w = stride[1]
if pad.size() == 0:
pad_h, pad_w
elif pad.size() == 1:
pad_h = pad_w = pad[0]
else:
pad_h = pad[0]
pad_w = pad[1]
if dilation.size() == 1:
dilation_h = dilation_w = dilation[0]
else:
dilation_h = dilation[0]
dilation_w = dilation[1]
|
设输出shape为[Nx,Cx,Hx,Wx],其中:
- Nx=Ny, Cx=Ck
- Wx = (Wy-1)*stride_w - 2*pad_w + dilation_h*(Wk-1)+1
- Hx = (Hy-1)*stride_h - 2*pad_h + dilation_w*(Hk-1)+1
则总体限制如下:
- 1<=stride_h*stride_w<256
- Hy+2*pad_h>=dilation_h*(Hk-1)+1,Wy+2*pad_w>=dilation_w*(Wk-1)+1
- Hy*stride_h, Wy*stride_w范围为[2,4096]:
- AL1Size限制计算方式如下:
设w_value = Wy*stride_w
| if Wx>16:
h_value_max = Hk + 1
else if 16% Wx== 0:
h_value_max = Hk + 16//Wx - 1
else:
h_value_max = Hk + 16//Wx +1
|
则,AL1Size= h_value_max*w_value*32Byte、BL1Size = Hk*Wk*512Byte
AL1Size+BL1Size <= l1_size(l1_size见对应芯片的配置文件,例如platform_config/${soc_version}.ini)
其中,Hy>=dilation*(Hk-1)+1,Wy>=dilation*(Wk-1)+1
当Hy=1, Hk=1, pad_h=0, stride_h=1, dilation_h=1时,AL1Size = [15*stride_w+(Wk-1)*dilation_w+1]*32B
输入
- x:
- 是否必填: 必填
- 数据类型: float16
- 参数解释: 输入Tensor
- 规格限制: 无
- filter:
- 是否必填: 必填
- 数据类型: float16
- 参数解释: 卷积核,shape为 [Nk, Ck, Hk, Wk ],Nk必须与Cy相等
- 规格限制:
- 如果Wx==Hx==1: Wy==Hy==Wk==Hk,且取值范围在1~11
- 不支持输出的W==1,输出的H不等于1的场景
- 其它场景: Wx和Hx配置范围在1~255
- bias:
- 是否必填: 非必填
- 数据类型: float16
- 参数解释: 无
- 规格限制: 无
属性
- pad:
- 是否必填: 非必填
- 数据类型: ListInt
- 参数解释: 高和宽轴开始和结束的Padding,pad和pad_h/pad_w不能同时提供,默认值为0;pad List的长度最大为2
- 规格限制: List长度为1时: pad<Hk&pad<Wk;List长度为2时: pad[0]<Hk,pad[1]<Wk
- pad_h:
- 是否必填: 非必填
- 数据类型: int
- 参数解释: 高和宽轴开始和结束的Padding,pad和pad_h/pad_w不能同时提供,默认值为0
- 规格限制: pad_h<Hk
- pad_w:
- 是否必填: 非必填
- 数据类型: int
- 参数解释: 高和宽轴开始和结束的Padding,pad和pad_h/pad_w不能同时提供,默认值为0
- 规格限制: pad_w<Wk
- stride:
- 是否必填: 非必填
- 数据类型: ListInt
- 参数解释: 高和宽轴的stride.stride和stride_h/stride_w不能同时提供,默认值为1;stride的List长度最大为2
- 规格限制: List长度为1时: 0<=stride*stride<256;List长度为2时: 1<=stride[0]<=63, 1<=stride[1]<=63, 1<=stride[0]*stride[1]<256
- stride_h:
- 是否必填: 非必填
- 数据类型: int
- 参数解释: 高和宽轴的stride.stride和stride_h/stride_w不能同时提供,默认值为1
- 规格限制: 1<=stride<=63
- stride_w:
- 是否必填: 非必填
- 数据类型: int
- 参数解释: 高和宽轴的stride.stride和stride_h/stride_w不能同时提供,默认值为1
- 规格限制: 1<=stride<=63
- dilation:
- 是否必填: 非必填
- 数据类型: ListInt
- 参数解释: Filter的高和宽轴的放大系数,List长度最大为2,默认值为1
- 规格限制: 支持1~255,配置后(kernel-1)*dilation+1<256
- group:
- 是否必填: 非必填
- 数据类型: int
- 参数解释: 无
- 规格限制: group能被channel整除
输出
y:
- 是否必填: 必填
- 数据类型: float16
- 参数解释: 无
- 规格限制: 无