基于CNN卷积神经网络的mnist手写数字库训练matlab仿真

目录

1. 卷积神经网络的基本结构

1.1 卷积运算

1.2 滤波器权重更新

1.3 正则化项

1.4 激活函数

1.5 池化层

1.6 全连接层与输出层

1.7 损失函数与优化

1.8 训练流程

2.mnist手写数字库

3.MATLAB程序

4.仿真结果


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 训练流程

  1. 初始化网络参数。
  2. 对于每个训练样本,前向传播计算预测值。
  3. 计算损失函数。
  4. 反向传播计算梯度。
  5. 更新网络参数。
  6. 重复步骤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

4.仿真结果

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对于基于卷积神经网络mnist手写数字识别,我们可以使用以下步骤: 1. 加载数据集:使用Python中的Keras加载MNIST数据集。 2. 数据预处理:将像素值缩放到0到1之间,并将标签进行one-hot编码。 3. 构建模型:使用Keras构建卷积神经网络模型。 4. 编译模型:指定损失函数、优化器和评估指标。 5. 训练模型:使用训练训练模型,并在验证集上进行验证。 6. 评估模型:使用测试集评估模型的性能。 7. 使用模型:使用训练好的模型对新的手写数字图像进行分类。 以下是一个简单的基于卷积神经网络mnist手写数字识别的代码示例: ```python from keras.datasets import mnist from keras.utils import to_categorical from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense # 加载数据集 (train_images, train_labels), (test_images, test_labels) = mnist.load_data() # 数据预处理 train_images = train_images.reshape((60000, 28, 28, 1)) train_images = train_images.astype('float32') / 255 test_images = test_images.reshape((10000, 28, 28, 1)) test_images = test_images.astype('float32') / 255 train_labels = to_categorical(train_labels) test_labels = to_categorical(test_labels) # 构建模型 model = Sequential() model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))) model.add(MaxPooling2D((2, 2))) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D((2, 2))) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(Flatten()) model.add(Dense(64, activation='relu')) model.add(Dense(10, activation='softmax')) # 编译模型 model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) # 训练模型 model.fit(train_images, train_labels, epochs=5, batch_size=64, validation_data=(test_images, test_labels)) # 评估模型 test_loss, test_acc = model.evaluate(test_images, test_labels) print('Test accuracy:', test_acc) # 使用模型 predictions = model.predict(test_images) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值