对于卷积公式

可能有的人知道,可能有的人不知道,或者也仅仅只是知道而不理解。但是不管你知不知道这个公式的意义,都不影响你自己去实现一个卷积。他具体的数学意义,我先不讲,因为有很多人讲的都比我清楚透彻。而我要告诉你的,则是再卷积神经网络里面的卷积操作是如何实现的

提到卷积神经网络,听到的最多的应该就是卷积,激活,池化这三个操作。就拿VGG16这个经典网络模型来说,其实就是通过卷积+激活+池化这三种操作堆叠而成的。

那么他们具体是什么东西,又是如何实现的,这次就来用numpy手撸一下他们的具体实现原理。

卷积

在神经网络中的卷积,就是利用一个卷积核在你的图像矩阵上滑动,上图中,假设灰色矩阵就是我们输入的图像矩阵,里面的数字就代表着图像中的像素值,绿色矩阵就是卷积核,灰色矩阵上面的绿色区域就是当前卷积核所覆盖的区域每次卷积核滑动的距离叫做步长,在上图中步长就是1。具体操作就是,将卷积核与在图像矩阵中所覆盖的区域对应位置相乘再相加,最后的蓝色矩阵就是这次卷积的结果。

Padding

在上面的卷积操作中,原矩阵的大小是4x4,但是卷积完了之后就变成2x2的矩阵了,这是因为边缘上的像素永远不会位于卷积核中心,而卷积核也没法扩展到边缘区域以外
这个结果我们是不能接受的,有时我们还希望输入和输出的大小应该保持一致。为解决这个问题,可以在进行卷积操作前,对原矩阵进行边界填充(Padding),也就是在矩阵的边界上填充一些值,以增加矩阵的大小,通常都用“0”来进行填充的。

对于卷积核大小为3的卷积,通常只需要在外围填充一圈0就足够了,对于不同大小的卷积核,为了使输出图像的大小一致,在图像外围填充多少圈0是不一样的,填充公式如下:

P代表因该填充几圈,K代表卷积核的边长,卷积核通常都是奇数

多通道卷积

我们都知道,一张彩色图片是RGB三通道,也就是它的channel有3个,那么在这种多通道的情况下应该如何实现卷积操作呢。很简单,输入的图像有多少个通道,那么我们的卷积核也有多少个通道就可以了

跟单通道的卷积操作一样,把卷积核按照对应通道放在图片上滑动,对应位置相乘再相加,最后把三个通道得到的卷积结果加起来就行了

代码实现

#input:输入的数据,input_channel:输入数据的通道数,out_channel:输出的特征图的通道数,kernel_size:卷积核的大小,stride:步长
def convolution(input,input_channel,out_channel,kernel_size,stride):kernel = np.random.randn(out_channel,input_channel,kernel_size,kernel_size)     #创建卷积核padding = int((kernel_size - 1) / 2)        #计算填充的大小padding_input = []# 进行对输入矩阵的填充for i in range(input_channel):padding_input.append(np.pad(input[i], ((padding, padding), (padding, padding)), 'constant', constant_values=(0, 0)))padding_input = np.array(padding_input)#根据填充后的输入尺寸,卷积核大小,步长,计算输出矩阵的大小out_size = int((len(input[0])+2*padding-kernel_size)/stride+1)# 创建一个0填充的输出矩阵out = np.zeros((out_channel,out_size,out_size))for i in range(out_channel):out_x = 0out_y = 0x_end = padding_input.shape[1] - padding - 1  # 卷积边界x = paddingy = paddingwhile x<=x_end:if y>padding_input.shape[1]-padding-1:      #卷积核超出右侧边界时,向下移动一个步长y = paddingx = x+strideout_y = 0out_x = out_x + 1if x>x_end:break#卷积操作out[i][out_x][out_y] = np.sum(padding_input[:,x-padding:x+padding+1,y-padding:y+padding+1]*kernel[i])y = y+strideout_y += 1return out

激活

就是对矩阵中的每个值都进行激活函数的运算,拿Relu举例,Relu就是大于0的不动,小于0的让它变为0:

代码实现

def ReLu(input):out = np.maximum(0,input)return out

池化

池化操作跟卷积操作其实很类似,都需要一个核在图片上进行滑动,对核覆盖的区域进行一些操作,只不过区别就在于,卷积的核里面有数字,卷积操作就是覆盖区域跟核做运算。而池化的核是空的。最常见的池化操作有最大池化,平均池化等。

最大池化

就是选出被核覆盖的区域中的最大值

平均池化

就是选出被核覆盖区域中的平均值

代码实现

以最大池化为例

#input:输入的数据,pooling_size:卷积核大小,stride:步长
def pooling(input,pooling_size,stride):out_size = int((len(input[0])-pooling_size)/stride+1)   #计算池化后的输出矩阵的大小out = np.zeros((len(input[0]),out_size,out_size))       #初始化输出矩阵# 对每个通道开始池化for i in range(input.shape[0]):out_x = 0out_y = 0in_x = 0in_y = 0#开始滑动while True:if out_y>=out_size:in_y = 0in_x+=pooling_sizeout_x+=1out_y = 0if out_x==out_size:break#池化操作out[i][out_x][out_y] = np.max(input[i,in_x:in_x+pooling_size,in_y:in_y+pooling_size])in_y+=pooling_sizeout_y+=1return out

可视化

下面这是一次卷积操作输出的三个通道

从零实现一个简单卷积神经网络相关推荐

  1. 【AI Studio】飞桨图像分类零基础训练营 - 03 - 卷积神经网络基础

    前言:第三天,老师结合ppt文图详细讲解了线性和卷积网络的构建,由简单到复杂的讲解卷积网络的发展.最后结合几个项目加深理解.愈发感觉老师讲的好了.第二天的课听完后还感觉自己什么都懂了,结果轮到自己动手 ...

  2. 基于PyTorch,如何构建一个简单的神经网络

    本文为 PyTorch 官方教程中:如何构建神经网络.基于 PyTorch 专门构建神经网络的子模块 torch.nn 构建一个简单的神经网络. 完整教程运行 codelab→ https://ope ...

  3. 一个简单的神经网络,三种常见的神经网络

    BP人工神经网络方法 (一)方法原理人工神经网络是由大量的类似人脑神经元的简单处理单元广泛地相互连接而成的复杂的网络系统.理论和实践表明,在信息处理方面,神经网络方法比传统模式识别方法更具有优势. 人 ...

  4. tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数

    tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报  分类: tensorflow(4)  目录(?)[+] 本笔记目的 ...

  5. 使用 PyTorch 数据读取,JAX 框架来训练一个简单的神经网络

    使用 PyTorch 数据读取,JAX 框架来训练一个简单的神经网络 本文例程部分主要参考官方文档. JAX简介 JAX 的前身是 Autograd ,也就是说 JAX 是 Autograd 升级版本 ...

  6. 实现一个简单的神经网络

    实现一个简单的神经网络 import numpy as npdef tanh(x): return np.tanh(x)def tanh_deriv(x): return 1.0 - np.tanh( ...

  7. 构造一个简单的神经网络,以DQN方式实现小游戏的自动控制

    在之前的文章中,我们做了如下工作: 如何设计一个类flappy-bird小游戏:[python实战]使用pygame写一个flappy-bird类小游戏 | 设计思路+项目结构+代码详解|新手向 DF ...

  8. 手把手搭建一个【卷积神经网络】

    前言 本文介绍卷积神经网络的入门案例,通过搭建和训练一个模型,来对10种常见的物体进行识别分类:使用到CIFAR10数据集,它包含10 类,即:"飞机","汽车" ...

  9. 使用tensorflow构建简单卷积神经网络

    一 概要 CIFAR-10分类问题是机器学习领域的一个通用基准,其问题是将32X32像素的RGB图像分类成10种类别:飞机,手机,鸟,猫,鹿,狗,青蛙,马,船和卡车.  更多信息请移步CIFAR-10 ...

  10. 如何在 Python 中创建一个简单的神经网络

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 引言 在过去的几十年里,机器学习对世界产生了巨大的影响,而且它的普 ...

最新文章

  1. mysql一次读取500条数据_mysql批量插入500条数据
  2. php print div,JavaScrip实现PHP print_r的数功能(三种方法)
  3. python离散积分_科学网—python数据处理笔记(三)通道积分图 - 钱磊的博文
  4. qq修改群名服务器失败,如何解决qq群名片改不了的问题
  5. 没有U盘纯硬盘安装linux之Ubuntu22.04
  6. 腾讯云短信服务申请+测试
  7. 谈阿里云云效 DevOps | DevOps 不再只是 Jenkins
  8. 怎样从 Google Play 下载 Android 程序到电脑上
  9. AI:华为云HiLens Kit试用测评—全栈全场景的人工智能
  10. C语言——函数(上)
  11. postman使用pre-request script计算md5
  12. 用python计算方差,标准差和百分位数
  13. Google Colab 读取/存储 google drive(谷歌云盘)内的文件
  14. Flutter设置Container的最大最小宽高
  15. 融云开发者沙龙(济南站)活动精彩回顾
  16. jar调用dll文件提示找不到指定的模块Unable to load library
  17. 讲一个老王与客户、供应商的故事
  18. 如何使用CNN进行物体识别和分类_基于CNN目标检测方法(RCNN系列,YOLO,SSD)
  19. 《失控》---自然之流变
  20. 【运维面试】金山科技8月份最新面试题-自动化运维岗位

热门文章

  1. java压缩文件夹下所有文件
  2. 计算机机水平,湖南省计算机水平等级题型知识点及评分机机制介绍.doc
  3. pycharm txt编辑器制表符与代码中\t不匹配
  4. 2021-07-16思考-资本源于贪婪(与人性抗争)
  5. MYSQL默认隔离级别详解
  6. 显示计算机101代码,电脑出现蓝屏故障101停机码,怎么解决问题
  7. python win32gui模块详解_pythonwin-win32gui 窗口查找和遍历
  8. android游戏地图编辑器
  9. linux命令行 jdb,什么使用加多宝(jdb)在linux下调试Java程序
  10. python入门指南阅读答案_第二章 _【Python入门指南】免费在线阅读 - 九六城堡小说论坛...