def conv_padding(img,filter_size_x,filter_size_y):
x_padding=int((filter_size_x-1)/2)
y_padding=int((filter_size_y-1)/2)
return np.pad(img,((y_padding,y_padding), (x_padding,x_padding), (0,0)),'constant')
卷积的过程中需要对输入图像进行padding,用np.pad()函数进行0填充
定义产生卷积核参数的函数,第一个维度是y轴方向,第二个维度是x轴方向
用np.random.rand()生成 0到1之间随机数
def filter_weights(filter_size_x,filter_size_y,input_channel):
# 随机种子
np.random.seed(random.randint(1,5))
return np.random.rand(filter_size_y,filter_size_x,input_channel)
卷积核的大小必须为奇数,不然会矩阵点乘的时候会产生维度不一致的错误
#卷积核大小必须为奇数
def conv(input_img,filter_size_x,filter_size_y,input_channel,output_channel,stride_x=1,stride_y=1):
padded_img=conv_padding(input_img,filter_size_x,filter_size_y)
input_img_size_list=input_img.shape
# 卷积后输出图像的大小
conved_size_x=int((input_img_size_list[1]-1)/stride_x+1)
conved_size_y=int((input_img_size_list[0])/stride_y+1)
output_img=np.empty((conved_size_y,conved_size_x,output_channel))
for z in range(0,output_channel):
x_ = 0
for i in range(0,int((input_img_size_list[1]-1)/stride_x+1)):
y_ = 0
for j in range(0,int((input_img_size_list[0]-1)/stride_y+1)):
output_img[j,i,z]=np.sum( np.multiply( filter_weights(filter_size_y,filter_size_x,input_channel), padded_img[y_:y_+filter_size_y,x_:x_+filter_size_x,:]) )
# np.multiply( filter_weights(filter_size_x,filter_size_y,input_channel), padded_img[y_:y_+filter_size_y,x_:x_+filter_size_x,:])
y_ = y_ + stride_y
x_ = x_ + stride_x
return output_img