CS231n笔记四:神经网络与卷积神经网络

一、神经网络 Neural networks

  1. 在之前我们讨论的classifier都是一维的,我们只有一个参数矩阵W,将输入x与W计算之后直接就得到了输出结果。但是这种模型会遇到一个问题,就是无法很好的处理多模态的输入,因为W的每一行只能为每一个类别提供一种模板template,即它需要把有很强variation的输入数据全部融合到一个template中。
  2. 现在我们将以上模型拓展为两层模型,也就是两层神经网络。在这里有一个W1和一个W2,W1和之前的一样,是一个combination of various templates,W2是一个weighting matrix,它将赋给W1中各个templates一个权重,将输入数据在每个template上的得分h做一个加权求和操作,得到最终相对于每个类别的得分s。
  3. 双层神经网络的作用具体来讲,就比如W1给我的horse的template是一个双头马,就像之前说的那样,有一个冲左的脑袋和一个冲右的脑袋。
    1、假设我现在输入了一个冲左的马,那么这个输入将会对左脑袋马的template有一个较高的得分h1,对右脑袋马dtemplate有一个较低的得分h2,现在对h1和h2做加权求和,由于h1较高,那么最终求和的结果可能也是马的得分比较高,那么预测结果即为马。
    2、那么再假设我现在输入了一个正着的马,那么这个马既不是冲左的,又不是冲右的,它可能在两个template上的得分h1和h2都很一般,但由于我最后要做加权求和,那么可能最终对应马这一类的得分s还是会比较高。
    在这里插入图片描述
  4. 下面是一个两层神经网络的实现代码:
    其中,N表示输入数据个数,D_in为输入数据维度,H为中间结果的维度,D_out为输出结果的维度。由此可推出x,y,w1,w2的维度分别是多少。之后进行2000轮的迭代,计算出中间结果h和输出结果y_pred,然后算出loss(这里的loss不是classifier里的loss函数,是神经网络的loss)。随后用反向传播算梯度grad,最后更新w1和w2。
    在这里插入图片描述

二、神经网络

内容基本同人工智能基础课,以下仅进行一些补充。

  1. 神经网络基本结构
    一般以全连接层的层数命名神经网络:
    在这里插入图片描述
    以下是一个神经网络前向传播的过程,反向传播类似,用back propagation就行:
    在这里插入图片描述

三、卷积神经网络——卷积和池化

1、全连接层 Fully Connected Layer

在一个全连接层中,两层中的所有节点都会相连。在下面这个例子,输入input本来是32 * 32 *3的图片,但却被伸展成了3072 * 1的向量来保证它能和输出层全连接。input层和output层之间通过一个10 * 3072的参数矩阵W作为边权连接起来。
在这里插入图片描述

2、卷积层 Convolution Layer

卷积层和全连接层最大的区别在于:卷积层可以保留空间结构。卷积层不会把输入图片拉伸成一维向量,而是会保留其原有的空间结构信息。

  1. 卷积核 filter,也叫感受野(receptive field)
    卷积核的深度会和输入图片的深度一致,如输入图片为32 by 32 by 3,则卷积核的大小可以选取5 by 5 by 3
    卷积核会滑动过整个image,并计算与相应部分image的点积。
    在这里插入图片描述
  2. 卷积神经网络的大体架构
    输入图片 ——> 一个包含若干卷积层Conv、非线性层(以ReLu为代表)和池化层Pooling layer的网络 ——> 一个全连接层 ——> 输出结果。
    如下:
    在这里插入图片描述
  3. 卷积神经网络的工作过程
    已然学过。
    1、步长stride:卷积核每次滑动的pixel数。步长的选择要适应input和filter的大小,不然会产生不对称的output,we don’t want that;
    2、output的尺寸:output的尺寸受到input的尺寸、卷积核的尺寸和步长三者的影响。
    output_size = (N - F) / stride + 1
    其中N为input的尺寸(N by N),F为卷积核的尺寸(F by F),stride为步长。当output_size为整数时,说明它们四个是可以配套的;当输出不为整数时,则需要调整stride或filter_size的取值;
    3、零填充边界 zero padding:在输入矩阵的周围一圈/几圈填充上额外的零。这样做的目的在于,如果不进行零填充,那么在边界的那些元素只会和filter进行一次计算,而中间的元素会和卷积核进行三次计算,而在填充了零之后,那些角落里的元素就不再是角落里的元素了,这又所有元素都会和filter进行三次计算;并且在零填充之后,输入和输出的尺寸会保持一致
    一般而言,若 stride = 1:
    F = 3 ——> zero pad with 1
    F = 5 ——> zero pad with 2
    F = 7 ——> zero pad with 3
  4. 问题&补充
    1、一个小问题:
    在这里插入图片描述
    题面里只说了filter的大小是5 by 5,但输入input的大小可是32 by 32 by 3啊!!!说明filter实际大小应该是5 by 5 by 3,它把深度3给省略了,但是你在算的时候不能省略!!!因而单纯的filter总共右5 times 5 times 3 times 10个参数,即750个参数。
    但实际上每个filter还会配套有一个bias的!!!因而会有10个额外的bias参数。故总共参数数量为760。
    2、1 by 1尺寸的filter有什么用???
    1 by 1 的filter就相当于与输入图像某一个位置关于其深度做了一次点积。一个56 by 56 by 64的input和一个1 by 1的filter操作后会变成一个56 by 56 by 1的结果,下图中共有32个卷积核,故计算结果为56 by 56 by 32。
    在这里插入图片描述
    注意!!!卷积层的输出结果的尺寸是 output_size by output_size by filter_num!!!

最后是一个关于卷积层的总结,注意卷积核的数量通常选为2的幂次形式:
在这里插入图片描述

3、池化层 pooling layer
  1. 定义
    池化层又叫降采样层 down sampling,是为了让表示representation更小,这样之后会有更少的参数。但池化层的池化处理只会坐在平面上,不会再深度上降采样。因而池化前输入数据的深度和池化后输出数据的深度是一模一样的。
    在这里插入图片描述
  2. 最大池化法Max Pooling —— 一种常见的池化方法
    和卷积层一样,在最大池化层中,也会有一个filter,它也会按照一定的stride滑动,但不同的是,这里的filter不会和输入数据进行点积操作,而是取输入数据滑动后对应区域中的最大值,将其作为输出结果。如下图,一个2 by 2的卷积核,以步长为2滑动,在红、绿、蓝、黄四个区域中分别取最大值,最终得到右侧的输出。
    tips1:通常stride和filter的边长是相近的,以确保区域间无重叠或重叠较少,以达到降采样效果。一般:F = 2或3时 ——> S = 2。
    tips2:同时,因为神经网络的每一层都相当于一个激活函数(我们把每一层的输出叫激活图,activated map),因而通常更关注最大值,即用最显著的信号来激活,故最大池化更常用。
    tips3:池化时通常不用零填充。
    在这里插入图片描述
卷积神经网络的典型结构

[(Conv - RELU) * N - POOL?] * M - (FC - RELU) * K, SOFTMAX
通常N最大取到5,M可以很大,K在0到2之间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 MATLAB 实现卷积神经网络进行图像分类识别的代码示例: 1. 加载数据 首先,需要将数据加载到 MATLAB 中。这里使用 CIFAR-10 数据集作为示例。可以使用以下代码将数据集下载到本地: ```matlab url = 'https://www.cs.toronto.edu/~kriz/cifar-10-matlab.tar.gz'; filename = 'cifar-10-matlab.tar.gz'; datafolder = 'cifar-10-batches-mat'; websave(filename,url); untar(filename,datafolder); ``` 然后,使用以下代码将训练集和测试集加载到 MATLAB 中: ```matlab % 加载训练集 traindata = []; trainlabels = []; for i=1:5 filename = fullfile(datafolder,sprintf('data_batch_%d.mat',i)); load(filename); traindata = [traindata; data]; trainlabels = [trainlabels; labels]; end % 加载测试集 filename = fullfile(datafolder,'test_batch.mat'); load(filename); testdata = data; testlabels = labels; ``` 2. 数据预处理 在训练模型之前,需要对数据进行预处理。这里使用的是简单的归一化处理,将像素值缩放到 [0,1] 范围内: ```matlab % 数据归一化 traindata = double(traindata) / 255; testdata = double(testdata) / 255; ``` 3. 定义卷积神经网络模型 接下来,需要定义卷积神经网络模型。这里使用的是简单的 LeNet-5 模型: ```matlab layers = [ imageInputLayer([32 32 3]) convolution2dLayer(5,6,'Padding','same') reluLayer maxPooling2dLayer(2,'Stride',2) convolution2dLayer(5,16,'Padding','same') reluLayer maxPooling2dLayer(2,'Stride',2) fullyConnectedLayer(120) reluLayer fullyConnectedLayer(84) reluLayer fullyConnectedLayer(10) softmaxLayer classificationLayer]; ``` 4. 指定训练选项 在训练模型之前,需要指定训练选项。这里使用的是随机梯度下降算法进行训练: ```matlab options = trainingOptions('sgdm', ... 'MaxEpochs',20, ... 'InitialLearnRate',0.01, ... 'MiniBatchSize',128, ... 'Shuffle','every-epoch', ... 'Verbose',false, ... 'Plots','training-progress'); ``` 5. 训练模型 有了数据和模型,就可以开始训练模型了。使用以下代码可以训练模型: ```matlab net = trainNetwork(traindata, categorical(trainlabels), layers, options); ``` 6. 测试模型 训练完成后,可以使用以下代码对模型进行测试: ```matlab predictedlabels = classify(net, testdata); testaccuracy = sum(predictedlabels == categorical(testlabels)) / numel(testlabels); fprintf('Test Accuracy: %f\n', testaccuracy); ``` 完整的代码示例如下: ```matlab % 下载数据集 url = 'https://www.cs.toronto.edu/~kriz/cifar-10-matlab.tar.gz'; filename = 'cifar-10-matlab.tar.gz'; datafolder = 'cifar-10-batches-mat'; websave(filename,url); untar(filename,datafolder); % 加载训练集 traindata = []; trainlabels = []; for i=1:5 filename = fullfile(datafolder,sprintf('data_batch_%d.mat',i)); load(filename); traindata = [traindata; data]; trainlabels = [trainlabels; labels]; end % 加载测试集 filename = fullfile(datafolder,'test_batch.mat'); load(filename); testdata = data; testlabels = labels; % 数据归一化 traindata = double(traindata) / 255; testdata = double(testdata) / 255; % 定义卷积神经网络模型 layers = [ imageInputLayer([32 32 3]) convolution2dLayer(5,6,'Padding','same') reluLayer maxPooling2dLayer(2,'Stride',2) convolution2dLayer(5,16,'Padding','same') reluLayer maxPooling2dLayer(2,'Stride',2) fullyConnectedLayer(120) reluLayer fullyConnectedLayer(84) reluLayer fullyConnectedLayer(10) softmaxLayer classificationLayer]; % 指定训练选项 options = trainingOptions('sgdm', ... 'MaxEpochs',20, ... 'InitialLearnRate',0.01, ... 'MiniBatchSize',128, ... 'Shuffle','every-epoch', ... 'Verbose',false, ... 'Plots','training-progress'); % 训练模型 net = trainNetwork(traindata, categorical(trainlabels), layers, options); % 测试模型 predictedlabels = classify(net, testdata); testaccuracy = sum(predictedlabels == categorical(testlabels)) / numel(testlabels); fprintf('Test Accuracy: %f\n', testaccuracy); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值