感知机(Perceptron)是 Frank Rosenblatt 在1957年提出的概念,其结构与MP模型类似,一般被视为最简单的人工神经网络,也作为二元线性分类器被广泛使用。通常情况下指单层的人工神经网络,以区别于多层感知机(Multilayer Perceptron)。尽管感知机结构简单,但能够学习并解决较复杂问题
感知机结构与MP模型类似,一般被视为最简单的人工神经网络,也作为二元线性分类器被广泛使用。通常情况下指单层的人工神经网络,以区别于多层感知机。尽管感知机结构简单,但能够学习并解决较复杂问题。
单层感知器类似一个逻辑回归模型,可以做线性分类任务,但是不能做更复杂的任务。
首先是原理上的缺陷:BP神经网络仍然是有监督的传统机器学习方法,遵循着以下思路。
不过是在最后面将SVM或者其他分类器换成神经网络,在大部分情况下其实没有什么优势,甚至增加了问题的复杂度。
提取的特征虽然是研究者们经过反复实验证明有效的特征,但仍然会一定程度上丢失了图像中的结构信息,从而丢失了一些对旋转扭曲等的不变性。而且要求输入的大小是固定的。为了学习到如偏移等微小的变化,需要有足够多的参数和足够多丰富的样本,最终学习到的权重,很可能在不同的位置处还会有非常相似的权重。
再一个就是结构上的缺陷:参数巨多,丢失空间信息。
如果一个隐藏层特征图像大小为100×100,输入层的特征图像大小为100×100,这意味着学习这一层需要100×100×100×100=108108的参数。如果以32位的浮点数进行存储,就需要4×1084×108的字节的存储量,约等于400MB的参数量。仅仅这样的一个网络层,其模型参数量已经超过了AlexNet网络的参数量,而100×100的特征图像分辨率,已经低于很多任务能够成功解决的下限。除了计算过程中需要存储的海量的参数,还有海量的计算,这些都超过了当时硬件的能力,因此大大限制了网络的大小,尤其是对于一些大的图像输入。
卷积神经网络:Convolutional Neural Networks、简称:CNN
CNN 主要包含卷积层、池化层和全连接层
卷积在工程和数学上有非常多的应用,在信号处理领域中,任意一个线性系统的输出,就是输入信号和系统激励函数的卷积。放到数字图像处理领域,卷积操作一般指图像领域的二维卷积。
一个二维卷积的案例如上,在图像上滑动,取与卷积核大小相等的区域,逐像素做乘法然后相加。 例如原始图像大小是5×5,卷积核大小是3×3。首先卷积核与原始图像左上角3×3对应位置的元素相乘求和,得到的数值作为结果矩阵第一行第一列的元素值,然后卷积核向右移动一个单位(即步长stride为1),与原始图像前三行第2、3、4列所对应位置的元素分别相乘并求和,得到的数值作为结果矩阵第一行第二列的元素值,以此类推。
卷积:一个核矩阵在一个原始矩阵上从上往下、从左往右扫描,每次扫描都得到一个结果,将所有结果组合到一起得到一个新的结果矩阵。它们的区别只在于权重算子是否进行了翻转。
import torch
from torch import nn
def corr2d(X, K): # X 是输入,K是卷积核
h, w = K.shape # 获取卷积核的大小
Y = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1))
for i in range(Y.shape[0]):
for j in range(Y.shape[1]):
Y[i, j] = (X[i: i + h, j: j + w] * K).sum() # 累加
return Y
X = torch.tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) # 模拟一个输入
K = torch.tensor([[0, 1], [2, 3]]) # 模拟一个卷积核
corr2d(X, K)
使卷积后图像分辨率不变,方便计算特征图尺寸的变化
弥补边界信息“丢失”
填充是指在输入高和宽的两侧填充元素。我们在原输入高和宽的两侧分别添加了值为0的元素,使得输入高和宽从3变成了5,并导致输出高和宽由2增加到4。下图阴影部分为第一个输出元素及其计算所使用的输入和核数组元素:0×0+0×1+0×2+0×3=0。
卷积窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。我们将每次滑动的行数和列数称为步幅或步长。
卷积神经网络不再是有监督学习了,不需要从图像中提取特征,而是直接从原始图像数据进行学习,这样可以最大程度的防止信息在还没有进入网络之前就丢失。