in blocksparse/conv.py [0:0]
def __init__(self, y_shape, x_shape, w_shape, strides=None, padding="SAME", data_format="NHWC", dilations=None, deconv=False):
if data_format in ("NCW","NCHW","NCDHW"):
self.layout = 0
sdim = slice(2,None) # NCHW
#fdim = slice(2,None) # KCRS
# tf keeps its own format for params and does transpose ops..
fdim = slice(0,-2) # RSCK
cdim = 1
else:
self.layout = 1
sdim = slice(1,-1) # NHWC
fdim = slice(0,-2) # RSCK
cdim = -1
C = x_shape[cdim]
K = y_shape[cdim]
MPQ = expand_dims(y_shape[sdim])
DHW = expand_dims(x_shape[sdim])
TRS = expand_dims(w_shape[fdim])
strides = (1,1,1) if strides is None else expand_dims(strides[sdim])
dilates = (1,1,1) if dilations is None else expand_dims(dilations[sdim])
if padding.upper() == "VALID":
padding = (0,0,0)
else:
padding = list()
for S, Q, W, stride, dilate in zip(TRS, MPQ, DHW, strides, dilates):
# match padding formula used in tensorflow
padding.append(max((Q - 1) * stride + S - W, 0) // 2)
if deconv:
lut_func = bprop_lut
MPQ, DHW = DHW, MPQ
C, K = K, C
else:
lut_func = fprop_lut
key = tuple(tuple(a) for a in (MPQ, DHW, TRS, padding, strides, dilates))
entry = ConvEdgeBias.Cache.get(key, None)
if entry is None:
mpqLut = list()
fdata = list(zip(TRS, padding, strides, dilates))
for i in range(3):
mpqLut.append( [ lut_func( dim, DHW[i], *fdata[i]) for dim in range(MPQ[i]) ] )
self._build_edge_lut(MPQ, mpqLut)
ConvEdgeBias.Cache[key] = (self.edgeBiasMap, self.edgeBiasLut, self.edgeEntries)
else:
self.edgeBiasMap, self.edgeBiasLut, self.edgeEntries = entry
self.edgeBiasDim = len(self.edgeBiasMap)
self.shape = (self.edgeBiasDim, K) if self.layout else (K, self.edgeBiasDim)