Numpy实现卷积神经网络(CNN)的示例


Posted in Python onOctober 09, 2020
import numpy as np
import sys


def conv_(img, conv_filter):
  filter_size = conv_filter.shape[1]
  result = np.zeros((img.shape))
  # 循环遍历图像以应用卷积运算
  for r in np.uint16(np.arange(filter_size/2.0, img.shape[0]-filter_size/2.0+1)):
    for c in 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)
      # 将求和保存到特征图中
      result[r, c] = conv_sum

    # 裁剪结果矩阵的异常值
  final_result = 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)]
  return final_result


def conv(img, conv_filter):
  # 检查图像通道的数量是否与过滤器深度匹配
  if len(img.shape) > 2 or len(conv_filter.shape) > 3:
    if img.shape[-1] != conv_filter.shape[-1]:
      print("错误:图像和过滤器中的通道数必须匹配")
      sys.exit()

  # 检查过滤器是否是方阵
  if conv_filter.shape[1] != conv_filter.shape[2]:
    print('错误:过滤器必须是方阵')
    sys.exit()

  # 检查过滤器大小是否是奇数
  if conv_filter.shape[1] % 2 == 0:
    print('错误:过滤器大小必须是奇数')
    sys.exit()

  # 定义一个空的特征图,用于保存过滤器与图像的卷积输出
  feature_maps = np.zeros((img.shape[0] - conv_filter.shape[1] + 1,
               img.shape[1] - conv_filter.shape[1] + 1,
               conv_filter.shape[0]))

  # 卷积操作
  for filter_num in range(conv_filter.shape[0]):
    print("Filter ", filter_num + 1)
    curr_filter = conv_filter[filter_num, :]

    # 检查单个过滤器是否有多个通道。如果有,那么每个通道将对图像进行卷积。所有卷积的结果加起来得到一个特征图。
    if len(curr_filter.shape) > 2:
      conv_map = conv_(img[:, :, 0], curr_filter[:, :, 0])
      for ch_num in range(1, curr_filter.shape[-1]):
        conv_map = conv_map + conv_(img[:, :, ch_num], curr_filter[:, :, ch_num])
    else:
      conv_map = conv_(img, curr_filter)
    feature_maps[:, :, filter_num] = conv_map
  return feature_maps


def pooling(feature_map, size=2, stride=2):
  # 定义池化操作的输出
  pool_out = np.zeros((np.uint16((feature_map.shape[0] - size + 1) / stride + 1),
             np.uint16((feature_map.shape[1] - size + 1) / stride + 1),
             feature_map.shape[-1]))

  for map_num in range(feature_map.shape[-1]):
    r2 = 0
    for r in np.arange(0, feature_map.shape[0] - size + 1, stride):
      c2 = 0
      for c in np.arange(0, feature_map.shape[1] - size + 1, stride):
        pool_out[r2, c2, map_num] = np.max([feature_map[r: r+size, c: c+size, map_num]])
        c2 = c2 + 1
      r2 = r2 + 1
  return pool_out
import skimage.data
import numpy
import matplotlib
import matplotlib.pyplot as plt
import NumPyCNN as numpycnn

# 读取图像
img = skimage.data.chelsea()
# 转成灰度图像
img = skimage.color.rgb2gray(img)

# 初始化卷积核
l1_filter = numpy.zeros((2, 3, 3))
# 检测垂直边缘
l1_filter[0, :, :] = numpy.array([[[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]]])
# 检测水平边缘
l1_filter[1, :, :] = numpy.array([[[1, 1, 1], [0, 0, 0], [-1, -1, -1]]])

"""
第一个卷积层
"""
# 卷积操作
l1_feature_map = numpycnn.conv(img, l1_filter)
# ReLU
l1_feature_map_relu = numpycnn.relu(l1_feature_map)
# Pooling
l1_feature_map_relu_pool = numpycnn.pooling(l1_feature_map_relu, 2, 2)

"""
第二个卷积层
"""
# 初始化卷积核
l2_filter = numpy.random.rand(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)
# Pooling
l2_feature_map_relu_pool = numpycnn.pooling(l2_feature_map_relu, 2, 2)

"""
第三个卷积层
"""
# 初始化卷积核
l3_filter = numpy.random.rand(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)
# Pooling
l3_feature_map_relu_pool = numpycnn.pooling(l3_feature_map_relu, 2, 2)

"""
结果可视化
"""
fig0, ax0 = plt.subplots(nrows=1, ncols=1)
ax0.imshow(img).set_cmap("gray")
ax0.set_title("Input Image")
ax0.get_xaxis().set_ticks([])
ax0.get_yaxis().set_ticks([])
plt.savefig("in_img1.png", bbox_inches="tight")
plt.close(fig0)

# 第一层
fig1, ax1 = plt.subplots(nrows=3, ncols=2)
ax1[0, 0].imshow(l1_feature_map[:, :, 0]).set_cmap("gray")
ax1[0, 0].get_xaxis().set_ticks([])
ax1[0, 0].get_yaxis().set_ticks([])
ax1[0, 0].set_title("L1-Map1")

ax1[0, 1].imshow(l1_feature_map[:, :, 1]).set_cmap("gray")
ax1[0, 1].get_xaxis().set_ticks([])
ax1[0, 1].get_yaxis().set_ticks([])
ax1[0, 1].set_title("L1-Map2")

ax1[1, 0].imshow(l1_feature_map_relu[:, :, 0]).set_cmap("gray")
ax1[1, 0].get_xaxis().set_ticks([])
ax1[1, 0].get_yaxis().set_ticks([])
ax1[1, 0].set_title("L1-Map1ReLU")

ax1[1, 1].imshow(l1_feature_map_relu[:, :, 1]).set_cmap("gray")
ax1[1, 1].get_xaxis().set_ticks([])
ax1[1, 1].get_yaxis().set_ticks([])
ax1[1, 1].set_title("L1-Map2ReLU")

ax1[2, 0].imshow(l1_feature_map_relu_pool[:, :, 0]).set_cmap("gray")
ax1[2, 0].get_xaxis().set_ticks([])
ax1[2, 0].get_yaxis().set_ticks([])
ax1[2, 0].set_title("L1-Map1ReLUPool")

ax1[2, 1].imshow(l1_feature_map_relu_pool[:, :, 1]).set_cmap("gray")
ax1[2, 0].get_xaxis().set_ticks([])
ax1[2, 0].get_yaxis().set_ticks([])
ax1[2, 1].set_title("L1-Map2ReLUPool")

plt.savefig("L1.png", bbox_inches="tight")
plt.close(fig1)

# 第二层
fig2, ax2 = plt.subplots(nrows=3, ncols=3)
ax2[0, 0].imshow(l2_feature_map[:, :, 0]).set_cmap("gray")
ax2[0, 0].get_xaxis().set_ticks([])
ax2[0, 0].get_yaxis().set_ticks([])
ax2[0, 0].set_title("L2-Map1")

ax2[0, 1].imshow(l2_feature_map[:, :, 1]).set_cmap("gray")
ax2[0, 1].get_xaxis().set_ticks([])
ax2[0, 1].get_yaxis().set_ticks([])
ax2[0, 1].set_title("L2-Map2")

ax2[0, 2].imshow(l2_feature_map[:, :, 2]).set_cmap("gray")
ax2[0, 2].get_xaxis().set_ticks([])
ax2[0, 2].get_yaxis().set_ticks([])
ax2[0, 2].set_title("L2-Map3")

ax2[1, 0].imshow(l2_feature_map_relu[:, :, 0]).set_cmap("gray")
ax2[1, 0].get_xaxis().set_ticks([])
ax2[1, 0].get_yaxis().set_ticks([])
ax2[1, 0].set_title("L2-Map1ReLU")

ax2[1, 1].imshow(l2_feature_map_relu[:, :, 1]).set_cmap("gray")
ax2[1, 1].get_xaxis().set_ticks([])
ax2[1, 1].get_yaxis().set_ticks([])
ax2[1, 1].set_title("L2-Map2ReLU")

ax2[1, 2].imshow(l2_feature_map_relu[:, :, 2]).set_cmap("gray")
ax2[1, 2].get_xaxis().set_ticks([])
ax2[1, 2].get_yaxis().set_ticks([])
ax2[1, 2].set_title("L2-Map3ReLU")

ax2[2, 0].imshow(l2_feature_map_relu_pool[:, :, 0]).set_cmap("gray")
ax2[2, 0].get_xaxis().set_ticks([])
ax2[2, 0].get_yaxis().set_ticks([])
ax2[2, 0].set_title("L2-Map1ReLUPool")

ax2[2, 1].imshow(l2_feature_map_relu_pool[:, :, 1]).set_cmap("gray")
ax2[2, 1].get_xaxis().set_ticks([])
ax2[2, 1].get_yaxis().set_ticks([])
ax2[2, 1].set_title("L2-Map2ReLUPool")

ax2[2, 2].imshow(l2_feature_map_relu_pool[:, :, 2]).set_cmap("gray")
ax2[2, 2].get_xaxis().set_ticks([])
ax2[2, 2].get_yaxis().set_ticks([])
ax2[2, 2].set_title("L2-Map3ReLUPool")

plt.savefig("L2.png", bbox_inches="tight")
plt.close(fig2)

# 第三层
fig3, ax3 = plt.subplots(nrows=1, ncols=3)
ax3[0].imshow(l3_feature_map[:, :, 0]).set_cmap("gray")
ax3[0].get_xaxis().set_ticks([])
ax3[0].get_yaxis().set_ticks([])
ax3[0].set_title("L3-Map1")

ax3[1].imshow(l3_feature_map_relu[:, :, 0]).set_cmap("gray")
ax3[1].get_xaxis().set_ticks([])
ax3[1].get_yaxis().set_ticks([])
ax3[1].set_title("L3-Map1ReLU")

ax3[2].imshow(l3_feature_map_relu_pool[:, :, 0]).set_cmap("gray")
ax3[2].get_xaxis().set_ticks([])
ax3[2].get_yaxis().set_ticks([])
ax3[2].set_title("L3-Map1ReLUPool")

plt.savefig("L3.png", bbox_inches="tight")
plt.close(fig3)

以上就是Numpy实现卷积神经网络(CNN)的示例的详细内容,更多关于Numpy实现卷积神经网络的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python获取任意xml节点值的方法
May 05 Python
Python3控制路由器——使用requests重启极路由.py
May 11 Python
Python编程argparse入门浅析
Feb 07 Python
详解python中Numpy的属性与创建矩阵
Sep 10 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
Sep 17 Python
实例讲解python中的序列化知识点
Oct 08 Python
python按照多个条件排序的方法
Feb 08 Python
python multiprocessing模块用法及原理介绍
Aug 20 Python
Python检查 云备份进程是否正常运行代码实例
Aug 22 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
Feb 15 Python
使用python批量转换文件编码为UTF-8的实现
Apr 03 Python
python编写实现抽奖器
Sep 10 Python
Python使用socket_TCP实现小文件下载功能
Oct 09 #Python
python实现逻辑回归的示例
Oct 09 #Python
Django生成数据库及添加用户报错解决方案
Oct 09 #Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
Oct 09 #Python
python实现数据结构中双向循环链表操作的示例
Oct 09 #Python
Python collections模块的使用方法
Oct 09 #Python
python爬取代理IP并进行有效的IP测试实现
Oct 09 #Python
You might like
php strstr查找字符串中是否包含某些字符的查找函数
2010/06/03 PHP
探讨如何在php168_cms中提取验证码
2013/06/08 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
javascript编程起步(第七课)
2007/01/10 Javascript
js 获取浏览器高度和宽度值(多浏览器)
2009/09/02 Javascript
JQuery实现简单时尚快捷的气泡提示插件
2012/12/20 Javascript
jQuery 绑定事件到动态创建的元素上的方法实例
2013/08/18 Javascript
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
jQuery焦点图切换特效代码分享
2015/09/15 Javascript
jQuery实现页面顶部显示的进度条效果完整实例
2015/12/09 Javascript
微信开发 使用picker封装省市区三级联动模板
2016/10/28 Javascript
微信小程序中用WebStorm使用LESS
2017/03/08 Javascript
基于DOM节点删除之empty和remove的区别(详解)
2017/09/11 Javascript
JS解决IOS中拍照图片预览旋转90度BUG的问题
2017/09/13 Javascript
vue移动端UI框架实现QQ侧边菜单组件
2018/03/09 Javascript
vue项目webpack中Npm传递参数配置不同域名接口
2018/06/15 Javascript
layer关闭当前窗口页面以及确认取消按钮的方法
2019/09/09 Javascript
Vue.extend 编程式插入组件的实现
2019/11/18 Javascript
详解为element-ui的Select和Cascader添加弹层底部操作按钮
2020/02/07 Javascript
js实现微信聊天界面
2020/08/09 Javascript
[01:01:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第一场 3月4日
2021/03/11 DOTA
Python写的PHPMyAdmin暴力破解工具代码
2014/08/06 Python
python多线程编程中的join函数使用心得
2014/09/02 Python
Python去除字符串两端空格的方法
2015/05/21 Python
Python中eval带来的潜在风险代码分析
2017/12/11 Python
Python使用指定字符长度切分数据示例
2019/12/05 Python
pip安装tensorflow的坑的解决
2020/04/19 Python
Web前端绘制0.5像素的几种方法
2017/08/11 HTML / CSS
幼儿园大班教学反思
2014/02/10 职场文书
优秀班集体先进事迹材料
2014/05/28 职场文书
班级课外活动总结
2014/07/09 职场文书
婚内房产协议书范本
2014/10/02 职场文书
违纪检讨书范文
2015/01/27 职场文书
检讨书模板
2015/01/29 职场文书
在容器中使用nginx搭建上传下载服务器
2022/05/11 Servers
win10截图快捷键win+shift+s没有反应无法截图怎么解决?
2022/08/14 数码科技