实现卷积操作(python)

动图

实现卷积操作:

代码如下:

import numpy as np
input_data=[
  [[1,0,1,2,1],
  [0,2,1,0,1],
  [1,1,0,2,0],
  [2,2,1,1,0],
  [2,0,1,2,0]],
 
  [[2,0,2,1,1],
  [0,1,0,0,2],
  [1,0,0,2,1],
  [1,1,2,1,0],
  [1,0,1,1,1]] 
  ]
weights_data=[ 
  [[ 1, 0, 1],
  [-1, 1, 0],
  [ 0,-1, 0]],
  [[-1, 0, 1],
  [ 0, 0, 1],
  [ 1, 1, 1]] 
 
  ]
 
#fm:[h,w]
#kernel:[k,k]
#return rs:[h,w] 
def compute_conv(fm,kernel):
	 [h,w]=fm.shape
	 [k,_]=kernel.shape 
	 r=int(k/2)
	 #定义边界填充0后的map
	 padding_fm=np.zeros([h+2,w+2],np.float32)
	 #保存计算结果
	 rs=np.zeros([h,w],np.float32)
	 #将输入在指定该区域赋值,即除了4个边界后,剩下的区域
	 padding_fm[1:h+1,1:w+1]=fm 
	 #对每个点为中心的区域遍历
	 for i in range(1,h+1):
	 for j in range(1,w+1): 
	  #取出当前点为中心的k*k区域
	  roi=padding_fm[i-r:i+r+1,j-r:j+r+1]
	  #计算当前点的卷积,对k*k个点点乘后求和
	  rs[i-1][j-1]=np.sum(roi*kernel)
	  return rs
  
def my_conv2d(input,weights):
	 [c,h,w]=input.shape
	 [_,k,_]=weights.shape
	 outputs=np.zeros([h,w],np.float32)
	 
	 #对每个feature map遍历,从而对每个feature map进行卷积
	 for i in range(c):
	 #feature map==>[h,w]
	 f_map=input[i]
	 #kernel ==>[k,k]
	 w=weights[i]
	 rs =compute_conv(f_map,w)
	 outputs=outputs+rs 
	 
	 return outputs
 
def main(): 
	  
	 #shape=[c,h,w]
	 input = np.asarray(input_data,np.float32)
	 #shape=[in_c,k,k]
	 weights = np.asarray(weights_data,np.float32) 
	 rs=my_conv2d(input,weights) 
	 print(rs) 
 
 
if __name__=='__main__':
	 main() 

结果如下:

[[ 2. 0. 2. 4. 0.]
 [ 1. 4. 4. 3. 5.]
 [ 4. 3. 5. 9. -1.]
 [ 3. 4. 6. 2. 1.]
 [ 5. 3. 5. 1. -2.]]
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值