Numpy实现卷积神经网络的方法

  介绍

Numpy实现卷积神经网络的方法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

进口numpy np
  导入系统
  
  
  conv_filter def conv_ (img):
  filter_size=conv_filter.shape [1]
  结果=np.zeros ((img.shape))
  #循环遍历图像以应用卷积运算
  在np.uint16 r (np.arange (filter_size/2.0, img.shape [0] -filter_size/2.0 + 1)):
  对于c np.uint16 (np.arange (filter_size/2.0, img.shape [1] -filter_size/2.0 + 1)):
  #卷积的区域
  curr_region=img [r-np.uint16 (np.floor (filter_size/2.0)): r + np.uint16 (np.ceil (filter_size/2.0)),
  c-np.uint16 (np.floor (filter_size/2.0)): c + np.uint16 (np.ceil (filter_size/2.0)))
  #卷积操作
  curr_result=curr_region * conv_filter
  conv_sum=np.sum (curr_result)
  #将求和保存到特征图中
  结果[r、c]=conv_sum
  
  #裁剪结果矩阵的异常值
  final_result=结果[np.uint16 (filter_size/2.0): result.shape [0] -np.uint16 (filter_size/2.0)
  np.uint16 (filter_size/2.0): result.shape [1] -np.uint16 (filter_size/2.0)]
  返回final_result
  
  
  conv_filter def conv (img):
  #检查图像通道的数量是否与过滤器深度匹配
  如果len (img.shape)比;2或len (conv_filter.shape)比;3:
  如果img。形状[1]!=conv_filter.shape [1]:
  print(“错误:图像和过滤器中的通道数必须匹配“)
  sys.exit ()
  
  #检查过滤器是否是方阵
  如果conv_filter。形状[1]!=conv_filter.shape [2]:
  打印(& # 39;错误:过滤器必须是方阵& # 39;)
  sys.exit ()
  
  #检查过滤器大小是否是奇数
  如果conv_filter。形状[1]% 2==0:
  打印(& # 39;错误:过滤器大小必须是奇数& # 39;)
  sys.exit ()
  
  #定义一个空的特征图,用于保存过滤器与图像的卷积输出
  feature_maps=np.zeros ((img。[0]- conv_filter形状。形状[1]+ 1,
  img。[1]——conv_filter形状。形状[1]+ 1,
  conv_filter.shape [0]))
  
  #卷积操作
  filter_num的范围(conv_filter.shape [0]):
  打印(“过滤器”,filter_num + 1)
  curr_filter=conv_filter [filter_num:]
  
  #检查单个过滤器是否有多个通道。如果有,那么每个通道将对图像进行卷积。所有卷积的结果加起来得到一个特征图。
  如果len (curr_filter.shape)比;2:
  conv_map=conv_ (img [:: 0], curr_filter [:: 0])
  ch_num的范围(1,curr_filter.shape [1]):
  conv_map=conv_map + conv_ (img [:,:, ch_num], curr_filter [:,:, ch_num])
  其他:
  curr_filter conv_map=conv_ (img)
  feature_maps [::, filter_num]=conv_map
  返回feature_maps
  
  
  def池(feature_map,大?2,步=2):
  #定义池化操作的输出
  pool_out=np.zeros ((np.uint16 ((feature_map。形状[0]-大小+ 1)/步+ 1),
  np.uint16 (feature_map。形状[1]——大小+ 1)/步+ 1),
  feature_map.shape [1]))
  
  map_num的范围(feature_map.shape [1]):
  r2=0
  在np r。(0,feature_map不等。形状[0]-大小+ 1,步):
  c2=0
  np的c。(0,feature_map不等。形状[1]——大小+ 1,步):
  pool_out r2 c2, map_num=np。马克斯([feature_map (r, r +大小、c: c +大小,map_num]])
  c2=c2 + 1
  r2=r2 + 1
  返回pool_out 
进口skimage.data
  进口numpy
  进口matplotlib
  进口matplotlib。pyplot作为plt
  进口NumPyCNN NumPyCNN
  
  #读取图像
  img=skimage.data.chelsea ()
  #转成灰度图像
  img=skimage.color.rgb2gray (img)
  
  #初始化卷积核
  l1_filter=numpy。0 ((2、3、3))
  #检测垂直边缘
  l1_filter [0::]=numpy。阵列([[[1,0,1],[1,0,1],[1,0,1]]])
  #检测水平边缘
  l1_filter [1::]=numpy。阵列([[(1 1 1)(0,0,0),[1,1,1]]])
  
  “““
  第一个卷积层
  “““
  #卷积操作
  l1_feature_map=numpycnn。l1_filter conv (img)
  # ReLU
  l1_feature_map_relu=numpycnn.relu (l1_feature_map)
  #池
  l1_feature_map_relu_pool=numpycnn。池(l1_feature_map_relu 2 2)
  
  “““
  第二个卷积层
  “““
  #初始化卷积核
  l2_filter=numpy.random。兰特(3、5、5、l1_feature_map_relu_pool.shape [1])
  #卷积操作
  l2_feature_map=numpycnn。conv (l1_feature_map_relu_pool l2_filter)
  # ReLU
  l2_feature_map_relu=numpycnn.relu (l2_feature_map)
  #池
  l2_feature_map_relu_pool=numpycnn。池(l2_feature_map_relu 2 2)
  
  “““
  第三个卷积层
  “““
  #初始化卷积核
  l3_filter=numpy.random。兰特(1、7、7、l2_feature_map_relu_pool.shape [1])
  #卷积操作
  l3_feature_map=numpycnn。conv (l2_feature_map_relu_pool l3_filter)
  # ReLU
  l3_feature_map_relu=numpycnn.relu (l3_feature_map)
  #池
  l3_feature_map_relu_pool=numpycnn。池(l3_feature_map_relu 2 2)
  
  “““
  结果可视化
  “““
  fig0有ax0=plt。次要情节(nrows=1, ncols=1)
  ax0.imshow (img) .set_cmap (“gray")
  ax0.set_title(“输入Image")
  ax0.get_xaxis () .set_ticks ([])
  ax0.get_yaxis () .set_ticks ([])
  plt.savefig (“in_img1.png" bbox_inches=皌ight")
  plt.close (fig0)
  
  第号一层
  图一,ax?=plt。次要情节(nrows=3, ncols=2)
  ax?(0,0)。imshow (l1_feature_map [:: 0]) .set_cmap (“gray")
  ax?(0,0) .get_xaxis () .set_ticks ([])
  ax?(0,0) .get_yaxis () .set_ticks ([])
  ax?(0,0) .set_title (“L1-Map1")
  
  ax?[0,1]。imshow (l1_feature_map [:: 1)) .set_cmap (“gray")
  ax?[0, 1] .get_xaxis () .set_ticks ([])
  ax?[0, 1] .get_yaxis () .set_ticks ([])
  ax?[0, 1] .set_title (“L1-Map2")
  
  ax?(1,0)。imshow (l1_feature_map_relu [:: 0]) .set_cmap (“gray")
  ax?(1,0) .get_xaxis () .set_ticks ([])
  ax?(1,0) .get_yaxis () .set_ticks ([])
  ax?(1,0) .set_title (“L1-Map1ReLU")
  
  ax?[1]。imshow (l1_feature_map_relu [:: 1)) .set_cmap (“gray")
  ax?[1] .get_xaxis () .set_ticks ([])
  ax?[1] .get_yaxis () .set_ticks ([])
  ax?[1] .set_title (“L1-Map2ReLU")
  
  ax?(2,0)。imshow (l1_feature_map_relu_pool [:: 0]) .set_cmap (“gray")
  ax?(2,0) .get_xaxis () .set_ticks ([])
  ax?(2,0) .get_yaxis () .set_ticks ([])
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null

Numpy实现卷积神经网络的方法