Deconvolution
总体约束
设:
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处理逻辑为:
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限制计算方式如下:
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
- 参数解释: 无
- 规格限制: 无
父主题: 支持Caffe算子清单