最近在进一步了解和学习神经网络,在网上下载了有利于入门的python深度学习的pdf,并在其中选取重要部分进行学习和了解,下方是具体笔记(以下笔记为重点部分,便于有一定神经网络学习基础的人观看学习)
0、深度学习引言概况
首先,我们用一个基础分类的例子来理解深度学习的核心就在于有意义的变换数据
对上方数据进行坐标变换,以便于用一条很简单的规则可以描述黑/白分类问题,如,对于更好的数据表示:“x>0 的是黑点” 或 “x<0 的是白点”。这种新表示可以简洁的解决基本分类问题,机器学习也遵循上方的基本思想,通过不断的训练来找寻最有用的分辨表示,从而解决许多任务。
下方给出一个基本的深度学习算法的多层网络
可将深度网络看作多级信息蒸馏操作,中间的层可以看作filter(过滤器),通过不断的过滤,使其纯度越来越高,也就是对给定任务的帮助越来越大。
接下来是神经网络的总架构,通过优化器不断更新训练,定义轮次来训练出最终的网络模型
深度学习基本特征:1.通过渐进的逐层的形成复杂表示;2.对中间渐进的表示共同进行学习。
1.神经网络的数据表示
1.0张量(tensor)
我们使用数据存储在多维numpy数组中,我们称之为张量,其核心概念是数据容器。
为熟悉这一概念,我们通过大家应该都熟知的矩阵来引入,矩阵是二维张量(2D张量),后续的3维4维张量,都是矩阵在任意维度上的推广,我们也将张量的维度称之为轴(axis)。
1.1标量(0D张量)
仅仅包含一个数字的张量叫做标量(scalar),我们可以用ndim属性来查看一个张量的轴的个数
1.2向量(1D张量)
一维张量只有一个轴,形如[1,2,3,4,5]的可看作一维张量也就是向量,但需要注意的是,多维向量跟多维张量不是同一个概念,比如上方的向量也就是5维向量(5D向量),向量只有一个轴
1.3矩阵(2D张量)
矩阵有两个轴,包含行和列
1.4更高维张量
多个矩阵组合在一起,也就成为了3D张量,我们可以称之为数组
1.5关键属性
张量有以下三个关键属性,轴的个数(阶),形状,数据类型
1.6数据批量
下方是来自MNIST数据集的一个批量,大小为128
1.7图像数据
由于自身专业原因和研究原因,更专注于图像数据,图像数据是一个4D向量,其形状为(samples,height,width,channels)或者(S,C,H,W)。
1.8广播(broadcast)
当较小tensor+较大tensor时,我们会将较小tensor广播,来匹配较大tensor的shape
广播包含以下两步:1.向较小的张量添加轴(叫作广播轴),使其 ndim 与较大的张量相同。
2.将较小的张量沿着新轴重复,使其形状与较大的张量相同。
1.9张量点积
为方便理解点积的形状匹配,我们用以下的图片来理解矩阵点积
来个例子,如下:
2.卷积神经网络模型
对于利用python代码来训练一个网络模型,我们的基本思路如下:
首先我们应该数据预处理,然后构建模型,最后对模型进行训练,我们即可得到整个模型,具体例程在我写的另一篇博客中基于keras和tensorflow2.x的模型生成_Sonne_hfuter的博客-优快云博客在这里面我还多了一步,生成可视化模型,可帮助更好理解神经网络模型
2.1卷积过程
对于卷积的工作原理,我们可以通过以下图形来理解
如上图,卷积核是3*3的kernel size,而且有三个卷积核,输入特征图是5*5*3(channel)的形状,stride步长为1,卷积核与输入特征图进行点积操作,最后得到3*3*3的输出特征图。
2.2构建网络模型
我们用接下来一个例子来构建一个网络模型,帮助我们理解卷积神经网络
from keras import layers
from keras import models
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',
input_shape=(150, 150, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
#模型总结概览
model.summary()
利用上述代码,构建了如下的卷积网络模型
我们利用了sequential函数来构建网络模型,值得一提的,此函数每一层只有一个输入和一个输出,也就是层层递进,层与层之间只有一个连接线,方便初学者理解
而如果想定义其他类型的网络模型,即不使用顺序式的模型构建,我们可以使用model类的函数API来构建网络模型,这里不做赘述,可以自行了解
2.3训练网络
我们可以使用model.compile()来定义损失函数和优化器,以及metrics通过不同的定义函数来衡量训练结果
我们还可以使用model.fit()函数来训练多轮次的数据。