深度学习引论(一):神经网络简要介绍&熟悉Matlab

来源:互联网 发布:character mysql 编辑:程序博客网 时间:2024/06/06 07:36

在大学的最后一学年,有幸上了我院院长的深度学习引论课程。老师的课程循序渐进,一步一步带着我们了解深度学习。虽然只有八次课,但整个课程收获颇丰。

最近比较闲。。。所以尝试用自己的方式将所学内容讲明白,一方面是为了重新学习,巩固一下,另一方面是觉得老师的课程实在非常适合入门,来种草来了~


1 . 深度神经网络概念

深度神经网络就是一种在某种程度上模仿大脑计算的计算模型
我们的大脑通过:信息输入➡️神经元处理➡️输出结果

举个例子:手写数字识别
这里写图片描述

以第一行第一列的数字‘0‘为例
我们的人眼看到‘0‘就是信息输入,之后经过视觉神经等神经元经过计算处理,得出结果:我们看到的是数字‘0‘

但是在我们小时候,我们并不认识这些数字。家长老师们就会给我们写好多个这些数字,一遍一遍的教我们认这是‘0‘,可能教个八遍十遍的,下次我们看到‘0‘,就知道这是‘0‘。

深度神经网络要做的,就是模仿大脑的这一计算过程,得到我们想要的结果,即实现手写数字的识别。

这个一遍一遍的教我们呢,就是神经网络在学习,或者说在训练神经网络。我们需要给神经网络看图片,同时,也要告诉神经网络,这是‘0‘,即要给神经网络答案。这就是我们训练的时候要做的事了,只要给了神经网络足够的训练数据集,神经网络就能够得出好的结果,就像一个东西我们人刚开始不认识,但看的多了,就认识了。

而之后我们再看到‘0‘,这就是测试。我不知道这个是不是‘0‘,也就是不知道答案,但我认为它是‘0‘,这是神经网络的输出,如果我的输出正确,那说明神经网络训练的还不错,如果输出错误,那就是神经网络训练的不好。

神经网络训练的不好,普遍有两种:
过拟合:在训练数据上效果较好, 但是在训练数据外的数据集上却不能很好地拟合数据,此时认为出现了过拟合的现象。出现这种现象的主要原因是训练数据中存在噪音或者训练数据太少。
欠拟合:模型没有很好地捕捉到数据特征,不能够很好地拟合数据。

我们经常用泛化能力来描述神经网络的效果,泛化能力好,就说明神经网络训练的效果较好,即神经网络能够将特征提取的能力从训练数据集中迁移到其他数据集中。还是举手写数字识别的例子,就是神经网络不仅能够识别训练的时候那些有答案的数字,还能够识别用来测试那些没答案的数字。

2 . 手写数字的识别过程

  1. 数字化图片
    这里写图片描述
    这是一个灰度图‘数字6‘,图片的分辨率为28*28,我们将每一像素点看成二维矩阵28*28中的一个元素,将‘6‘所在的像素点设为1(图中的白色部分),其余像素点设为0(图中的黑色部分),就可以用矩阵表示出上图。
  2. 向量化处理
    将上一步得出的28*28的矩阵变化为784*1的列向量,做这一步变化的原因是使输入层仅用一层完成,而不是28层,从而减少神经网络的层数。这一步骤可通过Matlab中的reshape()函数实现。
  3. 设计算法完成神经网络的计算
    第一堂课中没有讲到。。。
  4. 得出识别结果

3 . 作业:使用Matlab做好训练神经网络的准备工作

  1. 读取图片文件(下载地址)
  2. 将图片转化为二维矩阵
  3. 将二维矩阵变成一维列向量
  4. 给图片集标上标签
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Task:% 1. Read in image files% 2. Transform an image to an vector% 3. Re-organize the vectors in a matrix% 4. Transform digit to label format%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% indicate the directory of imagesimage_list = dir('img/*.jpg');% data and label matrix to be filleddata = [];label = [];% for each image filefor i = 1:numel(image_list)    image_name = image_list(i).name;    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%    % Your code BELOW    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%    % 1. Read in image files (use imread() function)    img = imread(strcat('img/',image_name));     % 2. Transform an image to an vector    v = reshape(img, 28*28, 1);    % 3. Reorgnize the vectors in a matrix    data = [data v];    % Get and store the label of the image    digit = image_name(1) - '0';    % 4. Transform digit to label format    d = [0 0 0 0 0 0 0 0 0 0];    d(digit+1) = 1;    digit_label = reshape(d, 10, 1);    % Reorgnize labels in a matrix    label = [label digit_label];    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%    % Your code ABOVE    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%end% Show resultsclose allrows = 5; % display in 5 rowsfor i = 1:numel(image_list)    subplot(rows, ceil(numel(image_list)/rows), i);    imshow(reshape(data(:, i), 28, []));    title(find(label(:, i))-1);end

结果:
这里写图片描述