目录
1. 卷积神经网络的基本结构
CNN是一种特殊的神经网络模型,特别适合于处理具有网格结构的数据,如图像。CNN通常由以下几个部分组成:
- 输入层:接受原始图像数据。
- 卷积层:通过一组可学习的滤波器对输入进行卷积操作。
- 激活函数:引入非线性,如ReLU函数。
- 池化层:降低空间维度以减少计算量,同时保持最重要的特征。
- 全连接层:将卷积层提取的特征映射到分类标签上。
- 输出层:产生最终预测。
1.1 卷积运算
给定一个输入图像I和一个滤波器K,卷积运算可以表示为:
在实际应用中,我们通常会限制m和n的范围,使其在滤波器尺寸范围内。例如,对于3x3的滤波器,m和n的范围通常是[−1,1][−1,1]。
1.2 滤波器权重更新
滤波器的权重是通过反向传播算法进行更新的。损失函数L关于滤波器K的梯度可以通过链式法则计算得到:
1.3 正则化项
为了防止过拟合,可以在损失函数中加入正则化项,如L2正则化:
1.4 激活函数
常用的激活函数有ReLU、tanh等。ReLU定义如下:
1.5 池化层
池化层用于降低输出的维度,常见的池化方法包括最大池化(Max Pooling)和平均池化(Average Pooling)。假设池化窗口大小为2x2,则最大池化操作可以表示为:
1.6 全连接层与输出层
全连接层将卷积层和平铺后的特征映射到分类标签上。输出层通常采用softmax函数进行概率分布预测:
其中zi=wi⊤x+bi是第i个类别的未归一化的得分,wi和bi分别是权重向量和偏置项。
1.7 损失函数与优化
对于多分类问题,交叉熵损失是一个很好的选择:
其中C是类别数量,yi是真实标签的one-hot编码,y^i是预测概率。
优化器如随机梯度下降(SGD)或Adam用于最小化损失函数。以SGD为例,权重更新规则为:
其中η是学习率。
1.8 训练流程
- 初始化网络参数。
- 对于每个训练样本,前向传播计算预测值。
- 计算损失函数。
- 反向传播计算梯度。
- 更新网络参数。
- 重复步骤2至5直到达到预定的迭代次数或满足停止条件。
2.mnist手写数字库
MNIST手写数字数据库是机器学习和计算机视觉领域中最著名和最广泛使用的数据集之一,它被用来作为基准测试各种算法的有效性和性能。MNIST数据集是由Yann LeCun等人收集并整理的,主要来源于美国国家标准与技术研究所(NIST)的手写数字样本。该数据集分为两个部分:
- 训练集:包含60,000张手写数字图像。
- 测试集:包含10,000张手写数字图像。
每张图像都是28x28像素的灰度图像,像素值介于0到255之间,其中0代表白色背景,255代表黑色笔画。每个图像都表示一个0到9之间的数字。数据集中每张图像都是一个二维数组,可以表示为I28×28。为了方便处理,通常将这些图像转换为一维向量,即I784。
每个图像都有一个对应的标签,指示该图像所代表的数字。这些标签通常是整数形式,范围从0到9。在训练过程中,这些标签通常会被转化为one-hot编码形式,以便进行多分类任务的学习。例如,数字“3”的标签将会被表示为一个长度为10的向量,其中只有索引3的位置上的值为1,其余位置均为0。
MNIST数据集被明确划分为训练集和测试集。训练集用于训练模型,而测试集用于评估模型的泛化能力。通常情况下,我们不会使用测试集来直接调整模型参数,而是用来评估最终模型的性能。
MNIST数据集因其简单性、易于获取以及广泛的可用性,成为了一个理想的基准测试数据集,尤其适合初学者学习和实践机器学习及深度学习技术。
3.MATLAB程序
........................................................................................
load mnist_uint8;
%含有70000个手写数字样本其中60000作为训练样本,10000作为测试样本。
train_x = double(reshape(train_x',28,28,60000))/255;
test_x = double(reshape(test_x',28,28,10000))/255;
train_y = double(train_y');
test_y = double(test_y');
%Convolutional neural network
%设置网络结构及训练参数
rand('state',0)
cnn.layers = {
struct('type', 'i') %input layer
struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer
struct('type', 's', 'scale', 2) %sub sampling layer
struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer
struct('type', 's', 'scale', 2) %subsampling layer
};
%训练选项,alpha学习率(不用),batchsize批训练中样本的数量,numepochs迭代次数。
opts.alpha = 1;
opts.batchsize = 50;
opts.numepochs = 10;
%初始化网络,对数据进行批训练,验证模型准确率
cnn = cnnsetup(cnn, train_x, train_y);
cnn = cnntrain(cnn, train_x, train_y, opts);
[er, bad] = cnntest(cnn, test_x, test_y);
er
tt=cnn.rL;
%绘制均方误差曲线
figure;
plot(1:10:length(tt),tt(1:10:end),'-r',...
'LineWidth',2,...
'MarkerSize',6,...
'MarkerEdgeColor','k',...
'MarkerFaceColor',[0.9,0.9,0.0]);
grid on
up4133