第一步:先写一个只有待卷积矩阵data和卷积核k的方法,默认步长step==1,不设置padding
import numpy as np
def convolution(data, k):
x, y = k.shape
n, m = data.shape
result = []
for i in range(n - x + 1):
line = []
for j in range(m - y + 1):
a = data[i:i + x, j:j + y]
line.append(np.sum(np.multiply(k, a)))
result.append(line)
return np.array(result)
第二步:补充padding功能,默认设置上下左右一层
def convolution(data, k, padding):
x, y = k.shape
n, m = data.shape
result = []
if padding:
data_0 = np.pad(data, ((1, 1), (1, 1)), 'constant', constant_values=(0, 0))
print(data_0)
for i in range(n):
line = []
for j in range(m):
a = data_0[i:i + x, j:j + y]
line.append(np.sum(np.multiply(k, a)))
result.append(line)
else:
for i in range(n - x + 1):
line = []
for j in range(m - y + 1):
a = data[i:i + x, j:j + y]
line.append(np.sum(np.multiply(k, a)))
result.append(line)
return np.array(result)
第三步:补充步长step功能
def convolution(data, k, step, padding):
x, y = k.shape
n, m = data.shape
result = []
if padding:
data_0 = np.pad(data, ((1, 1), (1, 1)), 'constant', constant_values=(0, 0))
print(data_0)
for i in range(n//step):
line = []
for j in range(m//step):
a = data_0[i:i + x, j:j + y]
line.append(np.sum(np.multiply(k, a)))
result.append(line)
else:
for i in range((n - x)//step + 1):
line = []
for j in range((m - y)//step + 1):
a = data[i:i + x, j:j + y]
line.append(np.sum(np.multiply(k, a)))
result.append(line)
return np.array(result)
第四步:将padding设置为自适应,不用硬编码
def convolution(data, k, step, padding):
x, y = k.shape
n, m = data.shape
result = []
if padding:
padding_h = (x - 1) // 2
padding_v = (y - 1) // 2
data_0 = np.pad(data, ((padding_h, padding_h), (padding_v, padding_v)), 'constant',
constant_values=(0, 0))
print(data_0)
for i in range((n - x + 2 * padding_h) // step + 1):
line = []
for j in range((m - y + 2 * padding_v) // step + 1):
a = data_0[i:i + x, j:j + y]
line.append(np.sum(np.multiply(k, a)))
result.append(line)
else:
for i in range((n - x) // step + 1):
line = []
for j in range((m - y) // step + 1):
a = data[i:i + x, j:j + y]
line.append(np.sum(np.multiply(k, a)))
result.append(line)
return np.array(result)
这写主要针对二维图像的卷积,后续有空继续更新。