Py学习  »  机器学习算法

深度学习入门 | 第二讲 图像数据与运算基础

狗熊会 • 4 年前 • 450 次点击  



“大家好,我是水妈,熊大的金牌助教。这是深度学习入门的第二讲。在第一讲,熊大提到深度学习是一种特殊的非线性回归分析方法。在这一讲,熊大将会跟大家分享图像数据的处理,轻松又有趣,同学们赶紧学习起来!”

大家好,我是熊大。在上一讲咱们提到,深度学习是一种特殊的非线性回归分析方法戳这里查看第一讲,它的特殊之处主要在于非常善于处理非结构化数据。此课程作为一门入门课程,将从图像入手,原因有三。第一,基于图像的应用特别广泛。在上一讲中咱们看到了很多基于图像的深度学习应用。第二,数据相对容易获得。在这方面大量的学者已经沉淀了非常多的图像数据,很多是公开免费的。第三,图像上手相对较快,很快就能感受到深度学习的魅力所在。因此我们从图像数据开始学习。

接下来我们切身感受一下图像数据到底是什么样子。为此我在网上找了一张可爱的熊大的照片,并存在服务器的一个特定位置上。这个照片我还给它取了一个名字,叫做xiongda.jpg。我把这张照片存在这个特定的位置之后,可以通过三行python的代码把它读进来,然后展现。


这里首先要回答:为什么我们要选用Python这门语言?原因很简单,做深度学习有几个特别重要的框架,包括Tensorflow和PyTorch。跟它们对接的最好的语言是Python,所以Python是做深度学习的重要入门语言。这是一门入门课程,要跟大家分享的并不是Tensorflow的编程语言,而是建立在Tensorflow上的Keras。Keras的语句极大简化,但灵活性稍差,因此可能不适合需要进阶的同学去学习,更适合打基础。


接下来跟大家再详细地讨论一下这张彩色的熊大图片。计算机是怎么存储它的呢?我们小时候都学过三原色理论:我们看到的彩色图像是三种基本的原色构成的,有的地方说是红黄蓝,有的地方说红绿蓝,而计算机采用了红绿蓝这种格式。所以我们看到的彩色熊大照片,在计算机的背后,可以想象成存了三张彩色照片,一张是红色的,一张是绿色的,一张是蓝色的,它们叠加在一起才形成了这张彩色的熊大照片。所以这是三个不同颜色的照片的叠加,那一个很自然的问题是,每一种单色的熊大照片又是如何存储的?

为了回答上面的问题,需要引入像素矩阵。举一个简单的例子。例如这张绿色的熊大的照片,横着均匀等间隔的切十刀,纵着切十刀,就形成了一百个格点,这就是一百个像素点。在每一个像素点上,计算机将不再区分颜色的深浅。每一个像素点颜色的深浅用一个数字表示,这是个均匀的绿色小方块,如果取值为零,表示绿色的元素是最少的,这时候对应的事实上是黑色。如果小方块上取值为1.0,那说明绿色是最饱满的。在这张示例的熊大图片中,它的左上角是绿色最饱满的,因此取值为1.0;而熊大的鼻子这个位置是最黑的,绿色色素是最少的,因此取值是0.07。

这说明计算机将一个我们看到的单色熊大照片,做成了一个10×10的像素矩阵,事实上也就是一个10×10的矩阵,就像下图展示的。大家努力去找找,看能不能找到熊大的鼻子在哪里?

你可能会有疑问,10×10的像素和千万级的像素的差别是什么呢?请看下面这张图片。第一排最左边是10×10的像素,也就是根据上面的像素矩阵所生成的熊大的图片。像素矩阵越小,分辨率就越低,我们能够判断的形状特征就越少。随着分辨率的增加,熊大的样子逐渐显现出来。

这就是计算机存储图片的方式,因此一个标准的彩色图片应该是三个的超大号矩阵累加而成的。图片被计算机储存为立体矩阵,它有长有宽,还有深度,我们可以把它抽象成一种广义的矩阵,叫矢量或Tensor。这就是为什么大量基于深度学习的算法都要基于Tensor,也是为什么最流行的深度学习框架叫做Tensorflow的原因。

目前为止,我们已经读入并把熊大的这张照片通过Photo.resize函数规范成128×128。那么我们现在可以对Photo进行代数运算了吗?还不可以,因为Photo仍然是一种Python认可的特殊的图像格式。我们接下来的任务是要把Photo变成一个可以做代数运算的一般化的矩阵矢量形式。要利用numpy这个package,为了方便通常将其简写为np。numpy中np.array这个函数就可以帮助我们把Photo转化为一个真正的矩阵矢量形式。把这个矩阵赋予一个新的变量名叫Im,Im是一个128×128×3的立体矩阵。进一步,可以把lm的某一层打印出来,它一共有三层,分别是第0层,第1层和第2层。请大家注意,Python对数组的标记是从0开始的。

这下Photo已经变成一个立体矩阵了,我们可以对立体矩阵行进代数运算。刚才我们讲了像素矩阵的最大值是1最小值是0,可怎么这里最大值是255呢?原因很简单,这仅仅是图像存储格式的选择问题。在图像的存储过程中人们会选择像素的最大值到底是多少,例如Tensorflow的默认值就是1。为了方便利用Tensorflow和Keras进行编程,我们把立体矩阵Im的数值和尺度重新变化,用Im除以255形成一个新的立体矩阵。打印出新的立体矩阵的第0层打印,可以看到像素点已经变成0到1之间。

“在这一讲的课程中,熊大还尝试了一些有趣夸张的代数运算,包括加减乘除,得到了令人意外的结果。移步阅读原文,到个人会员平台上看熊大的视频,寻找到他是如何做的吧。”


END

本讲内容整理:郭柏杉、水妈

视频制作:高天辰


往期精彩回顾
深度学习与回归分析





识别下方二维码成为狗熊会会员!

友情提示:

个人会员不提供数据、代码

视频only!

个人会员网址:http://teach.xiong99.com.cn

点击“阅读原文”,成为狗熊会会员!
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/33378
 
450 次点击