卷积神经网络基本概念(卷积篇 01)

Computer Vision
Theory CNN

Part 1 简介

1.1 我先后在以下场景下见到过卷积

  1. 微分方程
  2. 傅立叶变换及其应用
  3. 概率论
  4. 卷积神经网

1.2 相关阅读

1.3 本文将介绍卷积在计算机图像处理上的应用,所以限定讨论条件

  • 离散的
  • 2-维卷积(注:2-维的卷积相当于depth=1的3-维的卷积)
  • 篇幅有限具体的数学和理解请参考相关阅读

Part 2 原理和代码实现

2.1 四种方式简单介绍

无损精度算法

2.1.1滑动窗口

  • 最直观的方法
  • 大规模加速比较困难
  • 某些特定场景下速度比较快

2.1.2 im2col

  • 私以为最主流的实现方式(caffe/MXNet 等使用的是这种方式)
  • 一般来说速度较快(空间换时间)
  • 卷积过程转化成了GEMM过程(被各种极致优化)
  • 算法:
    1. 将没有个需要做卷积的矩阵平摊为一个一维向量
    2. 将所有的向量组成新的矩阵
    3. 新矩阵和kernal做矩阵乘法
    4. 得到结果

有损精度算法

  • FFT/Winograd的卷积算法,它们都是通过:

    1. 某种线性变换将feature map和卷积核变换到另外一个域.
    2. 空间域下的卷积在这个域下变为逐点相乘.
    3. 通过另一个线性变换将结果变换到空间域.
  • 有幸听过王晋玮的关于深度学习加速的 paper reading,其中有提及到: FFT需要复数乘法,如果没有特殊指令支持的话需要用实数乘法来模拟,实数的浮点计算量可能下降的不多,因此FFT也没有Winograd实用.

2.1.3 FFT

  • 傅里叶变换和快速傅里叶变化是在经典图像处理里面经常使用的计算方法.
  • 卷积模板通常都比较小,例如3×3卷机,这种情况下,FFT的时间开销反而更大.
  • 具体而言FFT将空间意义上的实数变换到频域上的复数,最后在复数上做逐点相乘,然后再把这个频率的复数变化为这个空间域的实数.
  • FFT卷积采用傅里叶变换处理 feature map和卷积核,傅里叶逆变换处理结果.

2.1.4 Winograd

  • cudnn中计算卷积就使用了该方法.
  • CNN里面越来越多的1×1卷积和depthwise卷积被加入,Winograd卷积的价值也越来越小了.
  • 可以实现极高的一个加速比,举个例子,Winograd变换对于3×3卷积,最高可以实现9倍的加速比,但精度损失严重.

2.2 有用的链接


2.3 代码实现(python 2.7 with numpy)

——

Talk is cheap show me the code !

——

2.3.1 方法一: 滑动窗口实现

import numpy as np 

# calculate output shape
def calc_shape(input_, kernal_, stride = 1, padding = 0):
	H_out = 1+(input_.shape[0]+2*padding-kernal_.shape[0])/stride
	W_out = 1+(input_.shape[1]+2*padding-kernal_.shape[1])/stride
	return H_out,W_out

def conv2d_naive(input_, kernal_, stride =1, padding = 0):
	# calculate Convolution param
	out = None
	H,W = input_.shape
	x_pad = np.zeros((H+2*padding,W+2*padding))
	x_pad[padding:padding+H,padding:padding+W] = input_
	H_out,W_out = calc_shape(input_, kernal_, stride, padding)
	out = np.zeros((H_out,W_out))
	# Convolution
	for m in xrange(H_out):
		for n in xrange(W_out):
			out[m,n] = np.sum(x_pad[m*stride:m*stride+kernal_.shape[0],n*stride:n*stride+kernal_.shape[1]] *  kernal_)
	return out

2.3.2 方法二: im2col方法实现

import numpy as np 

# calculate output shape
def calc_shape(input_, kernal_, stride = 1, padding = 0):
	H_out = 1+(input_.shape[0]+2*padding-kernal_.shape[0])/stride
	W_out = 1+(input_.shape[1]+2*padding-kernal_.shape[1])/stride
	return H_out,W_out

def im2col(input_, kernal_):
	# calculate param of col matrix
	X_ = input_.shape[0]-kernal_.shape[0]+1
	Y_ = input_.shape[1]-kernal_.shape[1]+1
	output_col = np.empty((kernal_.shape[0]*kernal_.shape[1], X_*Y_))
	# im2col
	for i in range(Y_):
		for j in range(X_):
			output_col[:,i*Y_+j] = input_[j:j+kernal_.shape[0],i:i+kernal_.shape[1]].ravel(order='F')
	return 大专栏  卷积神经网络基本概念(卷积篇 01) output_col

def col2im(input_, kernal_ ,col_matrix):
	output_ = np.zeros(input_.shape)
	weight_ = np.zeros(input_.shape)
	col = 0
	X_ = input_.shape[0] - kernal_.shape[0] + 1
	Y_ = input_.shape[1] - kernal_.shape[1] + 1
	for i in range(Y_):
		for j in range(X_):
			output_[j:j+kernal_.shape[0],i:i+kernal_.shape[1]]+= col_matrix[:,col].reshape(kernal_.shape, order='F')
			weight_[j:j+kernal_.shape[0],i:i+kernal_.shape[1]] += np.ones(kernal_.shape)
			col+=1
	return output_/weight_

def conv2d_im2col(input_, kernal_, stride =1, padding = 0):
	# stride must = 1 in this code
	# this code is only show how im2col work
	# if you want stride = other number , change the np.dot
	H,W = input_.shape
	x_pad = np.zeros((H+2*padding ,W+2*padding))
	x_pad[padding:padding+H,padding:padding+W] = input_

	# im2col processing and dot col and kernal
	output_col = im2col(x_pad, kernal_)
	col_matrix = np.dot(kernal_.reshape(kernal_.shape[0]*kernal_.shape[1],order='F'),output_col)

	# reshape to the final status
	H_out,W_out = calc_shape(input_, kernal_, stride, padding)
	out = np.zeros((H_out,W_out))
	return col_matrix.reshape(out.shape[0],out.shape[1],order='F')

2.3.3 方法三: FFT方法实现


def FFT_convolve(input_,kernal_):
	# calculate the FFT trans size
	T_size = np.array(input_.shape)+np.array(kernal_.shape)-1
	# ceil doc : https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.ceil.html
	F_size = 2**np.ceil(np.log2(T_size)).astype(int)
	F_slice = tuple([slice(0, int(item)) for item in F_size])

	new_input_ = np.fft.fft2(input_, F_size)
	new_kernal_ = np.fft.fft2(kernal_, F_size)
	output_ = np.fft.ifft2(new_input_*new_kernal_)[F_slice].copy()
	# output is a expand matrix which bigger than the result you suppose
	return np.array(output_.real, np.int32)

2.3.4 Final : 运行方法


def demo_1():
	input_ = np.diag([1, 10, 3, 5, 1])
	kernal_ = np.diag([1, 2, 1])
	return conv2d_naive(input_, kernal_, stride =1, padding = 0)

def demo_2():
	input_ = np.diag([1, 1, 1, 1, 1])
	kernal_ = np.diag([1, 1, 1])
	# stride must equal 1 in my demo code
	return conv2d_im2col(input_, kernal_, stride =1, padding = 0)

def demo_3():
	input_ = np.diag([1, 10, 3, 5, 1])
	kernal_ = np.diag([1, 2, 1,])
	return FFT_convolve(input_, kernal_)

print demo_1()
print demo_2()
print demo_3()


Part 3 声明

  • 转载请联系作者,虽然不联系也没什么问题~
  • 邮箱右上角contact
  • 因作者知识水平有限,所述有不确之处欢迎指正批评,感激笔芯~

原文地址:https://www.cnblogs.com/sanxiandoupi/p/11712826.html

时间: 2024-10-11 15:26:38

卷积神经网络基本概念(卷积篇 01)的相关文章

计算机视觉概要和卷积神经网络基础概念

本文主要介绍了CV概要和CNN基础概念. 1 计算机视觉(computer vision)简介 计算机视觉旨在识别和理解图像/视频中的内容.其诞生于1966年MIT AI Group的"the summer vision project".当时,人工智能其他分支的研究已经有一些初步成果.由于人类可以很轻易地进行视觉认知,MIT的教授们希望通过一个暑期项目解决计算机视觉问题.当然,计算机视觉没有被一个暑期内解决,但计算机视觉经过50余年发展已成为一个十分活跃的研究领域.如今,互联网上超过

深度学习:Keras入门(二)之卷积神经网络(CNN)

说明:这篇文章需要有一些相关的基础知识,否则看起来可能比较吃力. 1.卷积与神经元 1.1 什么是卷积? 简单来说,卷积(或内积)就是一种先把对应位置相乘然后再把结果相加的运算.(具体含义或者数学公式可以查阅相关资料) 如下图就表示卷积的运算过程: (图1) 卷积运算一个重要的特点就是,通过卷积运算,可以使原信号特征增强,并且降低噪音. 1.2 激活函数 这里以常用的激活函数sigmoid为例: 把上述的计算结果269带入此公式,得出f(x)=1 1.3 神经元 如图是一个人工神经元的模型: (

Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN

http://m.blog.csdn.net/blog/wu010555688/24487301 本文整理了网上几位大牛的博客,详细地讲解了CNN的基础结构与核心思想,欢迎交流. [1]Deep learning简介 [2]Deep Learning训练过程 [3]Deep Learning模型之:CNN卷积神经网络推导和实现 [4]Deep Learning模型之:CNN的反向求导及练习 [5]Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN [6]Deep Learn

CS231n 卷积神经网络与计算机视觉 9 卷积神经网络结构分析

终于进入我们的主题了ConvNets或者CNNs,它的结构和普通神经网络都一样,之前我们学习的各种技巧方法都适用,其主要不同之处在于: ConvNet假定输入的是图片,我们根据图片的特性对网络进行设定以达到提高效率,减少计算参数量的目的. 1. 结构总览 首先我们分析下传统神经网络对于图片的处理,如果还是用CIFAR-10上的图片,共3072个特征,如果普通网络结构输入那么第一层的每一个神经单元都会有3072个权重,如果更大的像素的图片进入后参数更多,而且用于图片处理的网络一般深度达10层之上,

神经网络以及卷积神经网络(CNN)初始

1 人工神经网络 1.1 神经元 神经网络由大量的神经元相互连接而成.每个神经元接受线性组合的输入后,最开始只是简单的线性加权,后来给每个神经元加上了非线性的激活函数,从而进行非线性变换后输出.每两个神经元之间的连接代表加权值,称之为权重(weight).不同的权重和激活函数,则会导致神经网络不同的输出. 举个手写识别的例子,给定一个未知数字,让神经网络识别是什么数字.此时的神经网络的输入由一组被输入图像的像素所激活的输入神经元所定义.在通过非线性激活函数进行非线性变换后,神经元被激活然后被传递

《卷积神经网络的Python实现》PDF代码+《解析深度学习卷积神经网络原理与视觉实践》PDF分析

CNN正在革新几个应用领域,如视觉识别系统.自动驾驶汽车.医学发现.创新电子商务等.需要在专业项目或个人方案中利用复杂的图像和视频数据集来实现先进.有效和高效的CNN模型. 深度卷积网络DCNN是目前十分流行的深度神经网络架构,它的构造清晰直观,效果引人入胜,在图像.视频.语音.语言领域都有广泛应用. 深度学习,特别是深度卷积神经网络是人工智能的重要分支领域,卷积神经网络技术也被广泛应用于各种现实场景,在许多问题上都取得了超越人类智能的结果. <卷积神经网络的Python实现>作为深度学习领域

使用CNN(convolutional neural nets)检测脸部关键点教程(三):卷积神经网络训练和数据扩充

第五部分 第二个模型:卷积神经网络 上图演示了卷积操作 LeNet-5式的卷积神经网络,是计算机视觉领域近期取得的巨大突破的核心.卷积层和之前的全连接层不同,采用了一些技巧来避免过多的参数个数,但保持了模型的描述能力.这些技巧是: 1, 局部联结:神经元仅仅联结前一层神经元的一小部分. 2, 权重共享:在卷积层,神经元子集之间的权重是共享的.(这些神经元的形式被称为特征图[feature map]) 3, 池化:对输入进行静态的子采样. 局部性和权重共享的图示 卷积层的单元实际上连接了前一层神经

浅谈卷积神经网络及matlab实现

前言,好久不见,大家有没有想我啊.哈哈.今天我们来随便说说卷积神经网络. 1卷积神经网络的优点 卷积神经网络进行图像分类是深度学习关于图像处理的一个应用,卷积神经网络的优点是能够直接与图像像素进行卷积,从图像像素中提取图像特征,这种处理方式更加接近人类大脑视觉系统的处理方式.另外,卷积神经网络的权值共享属性和pooling层使网络需要训练的参数大大减小,简化了网络模型,提高了训练的效率. 2 卷积神经网络的架构 卷积神经网络与原始神经网络有什么区别呢,现在我分别给他们的架构图. 图 1 普通深度

卷积神经网络之原理详解

本文来源1:http://blog.csdn.net/zouxy09/article/details/9993371 本文来源2:http://blog.csdn.net/qiaofangjie/article/details/16826849 卷积神经网络是人工神经网络的一种,已成为当前语音分析和图像识别领域的研究热点.它的权值共享网络结构使之更类似于生物神经网络,降低了网络模型的复杂度,减少了权值的数量.该优点在网络的输入是多维图像时表现的更为明显,使图像可以直接作为网络的输入,避免了传统识