![](https://csdnimg.cn/release/download_crawler_static/86282295/bg7.jpg)
深度学习:卷积⽹络 朱明超
# 计算 padding 维数
pr = int((stride * (out_rows-1) + _fr - in_rows) / 2)
pc = int((stride * (out_cols-1) + _fc - in_cols) / 2)
# 校验,如不等 (right/bottom 处) 添加不对称 0 填充
out_rows1 = int(1 + (in_rows + 2 * pr - _fr) / stride)
out_cols1 = int(1 + (in_cols + 2 * pc - _fc) / stride)
pr1, pr2 = pr, pr
if out_rows1 == out_rows - 1:
pr1, pr2 = pr, pr + 1
elif out_rows1 != out_rows:
raise AssertionError
pc1, pc2 = pc, pc
if out_cols1 == out_cols - 1:
pc1, pc2 = pc, pc + 1
elif out_cols1 != out_cols:
raise AssertionError
# 返回对 X 的 Padding 维数 (left, right, up, down)
return (pr1, pr2, pc1, pc2)
def pad2D(X, pad, kernel_shape=None, stride=None, dilation=1):
"""
二维填充
参数说明:
X:输入数组,为 (n_samples, in_rows, in_cols, in_ch),
其中 padding 操作是应用到 in_rows 和 in_cols
pad:padding 数目,4-tuple, int, 或 'same','valid'
在图片的左、右、上、下 (left, right, up, down) 0 填充
若为 int,表示在左、右、上、下均填充数目为 pad 的 0,
若为 same,表示填充后为相同 (same) 卷积,
若为 valid,表示填充后为有效 (valid) 卷积
kernel_shape:卷积核形状,为 (fr, fc)
stride:卷积步幅,int 型
dilation:扩张率,int 型,default=1
"""
p = pad
if isinstance(p, int):
p = (p, p, p, p)
if isinstance(p, tuple):
X_pad = np.pad(
X,
pad_width=((0, 0), (p[0], p[1]), (p[2], p[3]), (0, 0)),
mode="constant",
constant_values=0,
)
# 'same' 卷积,首先计算 padding 维数
if p == "same" and kernel_shape and stride is not None:
p = calc_pad_dims_sameconv_2D(
X.shape, X.shape[1:3], kernel_shape, stride, dilation=dilation
)
X_pad, p = pad2D(X, p)
if p == "valid":
p = (0, 0, 0, 0)
X_pad, p = pad2D(X, p)
return X_pad, p
[3]: def conv2D(X, W, stride, pad, dilation=1):
"""
7