网站开发公司 网站空间,门面装修设计方案,开网店的流程和步骤及费用,网络营销服务策略卷积
用MLP处理图片的问题#xff1a;假设一张图片有12M像素#xff0c;那么RGB图片就有36M元素#xff0c;使用大小为100的单隐藏层#xff0c;模型有3.6B元素#xff0c;这个数量非常大。
识别模式的两个原则#xff1a;
平移不变性#xff08;translation inva…卷积
用MLP处理图片的问题假设一张图片有12M像素那么RGB图片就有36M元素使用大小为100的单隐藏层模型有3.6B元素这个数量非常大。
识别模式的两个原则
平移不变性translation invariance不管检测对象出现在图像中的哪个位置神经网络的前面几层应该对相同的图像区域具有相似的反应即为“平移不变性”。局部性locality神经网络的前面几层应该只探索输入图像中的局部区域而不过度在意图像中相隔较远区域的关系这就是“局部性”原则。最终可以聚合这些局部特征以在整个图像级别进行预测。
从全连接层到卷积
需要将输入和输出变形为矩阵(宽度高度)因为现在处理的信息含有空间上的信息
将权重变形为四维张量从(h,w)到(h’,w’)记录输入图的横纵坐标对输出图的横纵坐标的影响。 h i , j b i , j ∑ k ∑ l w i , j , k , l x k , l b i , j ∑ a ∑ b v i , j , a , b x i a , i b v 是 w 的重新索引 v i , j , a , b w i , j , i a , j b h_{i,j} b_{i,j}\sum_{k}\sum_{l}w_{i,j,k,l}x_{k,l}b_{i,j}\sum_{a}\sum_bv_{i,j,a,b}x_{ia,ib}\\ v是w的重新索引 v_{i,j,a,b} w_{i,j,ia,jb} hi,jbi,jk∑l∑wi,j,k,lxk,lbi,ja∑b∑vi,j,a,bxia,ibv是w的重新索引vi,j,a,bwi,j,ia,jb 索引 a a a和 b b b通过在正偏移和负偏移之间移动覆盖了整个图像。对于隐藏表示中任意给定位置 ( i , j ) (i,j) (i,j)处的像素值 h i , j h_{i,j} hi,j可以通过 x x x中以 ( i , j ) (i,j) (i,j)为中心对像素进行加权求和得到加权使用的权重为 v i , j , a , b v_{i,j,a,b} vi,j,a,b
平移不变性
x x x的平移导致 h h h的平移 h i , j b i , j ∑ a ∑ b v i , j , a , b x i a , i b h_{i,j}b_{i,j}\sum_{a}\sum_bv_{i,j,a,b}x_{ia,ib} hi,jbi,j∑a∑bvi,j,a,bxia,ib, v v v应该不依赖于 i , j i,j i,j它是整张图的权重则我们可以让 v i , j , a , b v a , b v_{i,j,a,b}v_{a,b} vi,j,a,bva,b则 h i , j b i , j ∑ a ∑ b v a , b x i a , i b h_{i,j} b_{i,j}\sum_{a}\sum_bv_{a,b}x_{ia,ib} hi,jbi,ja∑b∑va,bxia,ib 这就是2维卷积数学上叫做2维交叉相关
这样的简化让权重矩阵简化了不少
局部性 h i , j b i , j ∑ a ∑ b v a , b x i a , i b h_{i,j} b_{i,j}\sum_{a}\sum_bv_{a,b}x_{ia,ib} hi,jbi,ja∑b∑va,bxia,ib
在评估 h i , j h_{i,j} hi,j时我们不应该用远离 x i , j x_{i,j} xi,j的参数那么可以只取一个小范围
当 ∣ a ∣ , ∣ b ∣ Δ |a|,|b|\Delta ∣a∣,∣b∣Δ时使得 v a , b 0 v_{a,b}0 va,b0 h i , j b i , j ∑ a − Δ Δ ∑ b − Δ Δ v a , b x i a , j b h_{i,j} b_{i,j}\sum^\Delta_{a-\Delta}\sum^\Delta_{b-\Delta} v_{a,b}x_{ia,jb} hi,jbi,ja−Δ∑Δb−Δ∑Δva,bxia,jb 对全连接层使用平移不变性和局部性得到了卷积层 h i , j b i , j ∑ a ∑ b v i , j , a , b x i a , i b ⟹ h i , j b i , j ∑ a − Δ Δ ∑ b − Δ Δ v a , b x i a , j b h_{i,j} b_{i,j}\sum_{a}\sum_bv_{i,j,a,b}x_{ia,ib} \Longrightarrow h_{i,j} b_{i,j}\sum^\Delta_{a-\Delta}\sum^\Delta_{b-\Delta} v_{a,b}x_{ia,jb} hi,jbi,ja∑b∑vi,j,a,bxia,ib⟹hi,jbi,ja−Δ∑Δb−Δ∑Δva,bxia,jb
卷积层
二维交叉相关 对应数字相乘再相加。
二维卷积层 输入 X : n h × n w X:n_h \times n_w X:nh×nw
核 W : k h × k w W:k_h \times k _w W:kh×kw
偏差 b ∈ R b\in \R b∈R
输出 Y : ( n h − k h 1 ) × ( n w − k w 1 ) Y:(n_h-k_h1)\times (n_w-k_w1) Y:(nh−kh1)×(nw−kw1) (卷积核横向和纵向滑动的次数) Y X ⋅ W b Y X\cdot W b YX⋅Wb W W W和 b b b是可学习的参数 边缘检测中间大周围是负数
由于对称性交叉相关和卷积在实际使用中没有区别
一维和三维交叉相关
1.一维 y i ∑ a 1 h w a x i 1 y_i \sum^h_{a1} w_ax_{i1} yia1∑hwaxi1
文本语言时序序列
2.三维
y i , j , k ∑ a 1 h ∑ b 1 w ∑ c 1 d w a , b , c x i a , j b , k c y_{i,j,k} \sum ^h _{a1}\sum^w_{b1} \sum^d_{c1} w_{a,b,c} x_{ia,jb,kc} yi,j,ka1∑hb1∑wc1∑dwa,b,cxia,jb,kc 视频医学图像气象地图
卷积层将输入和核矩阵进行交叉相关加上偏移后得到输出核矩阵和偏移是可学习的参数核矩阵的大小是超参数。
代码实现
import torch
from torch import nn
from d2l import torch as d2ldef corr2d(X, K): # X是输入矩阵K是核矩阵 2D卷积计算二维互相关运算h, w K.shapeY 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 YX torch.tensor([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]])
K torch.tensor([[0.0, 1.0], [2.0, 3.0]])
Y corr2d(X, K)
print(Y)卷积层卷积层在进行互相关运算后加上偏置产生输出那么卷积层被训练的参数是卷积核权重和标量偏置class Conv2D(nn.Module):def __init__(self, kernel_size):super().__init__()self.weight nn.Parameter(torch.rand(kernel_size))self.bias nn.Parameter(torch.zeros(1))def forward(self, x):return corr2d(x, self.weight) self.bias # 前向传播函数调用corr2d并进行偏置将带有h×w卷积核的卷积层称为h×w卷积层# 检测图像中不同颜色的边缘
X torch.ones((6, 8))
X[:, 2:6] 0
print(X)
# 如果元素相同则输出为0不同则非0
k torch.tensor([[1.0, -1.0]])
Y corr2d(X, k)
print(边缘检测结果:\n, Y)# 这个K只能检测垂直边缘将X转置后
Z corr2d(X.t(), k)
print(垂直边缘检测结果:\n, Z)学习卷积核# 构造一个二维卷积层它具有1个输出通道和形状为12的卷积核
conv2d nn.Conv2d(1, 1, kernel_size(1, 2), biasFalse)# 这个二维卷积层使用四维输入和输出格式批量大小、通道、高度、宽度
# 其中批量大小和通道数都为1X X.reshape((1, 1, 6, 8))
Y Y.reshape((1, 1, 6, 7))
lr 3e-2 # 学习率for i in range(10):Y_hat conv2d(X)l (Y_hat - Y) ** 2 # 均方误差conv2d.zero_grad()l.sum().backward()# 迭代卷积核conv2d.weight.data[:] - lr * conv2d.weight.gradif (i 1) % 2 0:print(fepoch {i 1}, loss {l.sum():.3f})print(训练结果:, conv2d.weight.data.reshape((1, 2)))
个人理解
卷积的动机是为了减少训练的参数模式识别的特点(平移不变性局部性)也保证了这样是合理的。