初识深度学习以及keras的使用

什么是深度学习

深度学习是机器学习的一个分支领域,是从数据中学习表示的一种新方法,其主要是在连续的层中进行学习,含多个隐藏层的多层感知器就是一种深度学习结构。深度学习通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。
下面放一张图来解释深度学习的过程。
在这里插入图片描述
首先是输入层,输入层中每一个节点表示一个特征,以这张图为例,假设特征数为4,分别为s1,s2,s3,s4,第一个隐藏层节点分别为h1,h2,h3,h4,h5,h6,那么,这里默认隐藏层没有激活函数。
h1=(s1w11+b1)+(s2w21+b2)+(s3w31+b3)+(s4w41+b4)
h2=(s1w12+b1)+(s2w22+b2)+(s3w32+b3)+(s4w42+b4)
h3=(s1w13+b1)+(s2w23+b2)+(s3w33+b3)+(s4w43+b4)
h4=(s1w14+b1)+(s2w24+b2)+(s3w34+b3)+(s4w44+b4)
h5=(s1w15+b1)+(s2w25+b2)+(s3w35+b3)+(s4w45+b4)
h6=(s1w16+b1)+(s2w26+b2)+(s3w36+b3)+(s4w46+b4)
这些w和b是什么呢?
这是神经网络通过训练学出来的参数。
层与层之间的连接就是通过这样的运算来实现的。
那么神经网络是怎么通过训练而学习到正确的参数呢?
答案是优化器所实现的梯度下降。


为什么要叫深度学习呢?"深度学习"的"深度"指的是一系列连续的隐藏层,也就是一个模型中包含了多少层,这就被称为模型的深度。现代的深度学习通常包含几十上百个隐藏层,这些层的权重都是在训练中自动调整的,有时候一个模型包含了几千万个参数,这就对性能有着极高的要求,现代深度学习通常采用GPU进行训练。

至于上文提到了激活函数,优化器,梯度下降,有些朋友可能由于第一次接触并不是很理解,下面博主将简单地为大家解释一下这些概念。

激活函数

所谓激活函数,就是在每一层上(这里不包含输入层)将输入映射到输出上的函数,上文提到的h1,h2,…实际上是从第一个隐藏层的输入,如果没有激活函数,那么这些节点上的输入就等于输出,如果加上了激活函数,这里以常用激活函数relu为例,relu函数使小于0的输入变为0,使大于0的输入保持不变。

为什么要使用激活函数

如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,而这种线性组合是没办法适用于复杂的问题的。
而激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。

损失函数和优化器

想要神经网络能够输出正确,就需要能够衡量实际输出与预期值之间的距离,而这个任务就是损失函数(也叫目标函数)的任务,该函数的输入是网络的预测值和真实的目标值,即你所希望网络输出的结果,然后计算两者的距离值,用来衡量该网络在这一个示例上运行效果的好坏。
深度学习就是利用这个距离值作为反馈来对权值进行微调,目的是为例降低损失值,这种调节就是由优化器来完成,它实现了我们所说的反向传播算法。
而神经网络就是在不断的迭代过程中不断的调整权值,是损失值越来越小。
下图为梯度下降过程:
在这里插入图片描述
可以看到我们的网络在训练的过程中不断地向损失值最小的方向移动,也就是梯度下降过程。


理论部分说了这么多了,下面我们来进行实际操作。
这里以鸢尾花的分类为例,之前有一篇文章使用的是sklearn做传统的机器学习,这里我们使用keras库做深度学习。

keras

Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行。Keras 的开发重点是支持快速的实验。能够以最小的时延把你的想法转换为实验结果,是做好研究的关键,简单的说keras可以很友好地构建神经网络,适用于快速开发。要使用keras必须确保已经安装了一种后端,例如tensorflow。

训练一个神经网络

#导入相关模块
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import keras
from sklearn.preprocessing import StandardScaler
#SGD优化器
from keras.optimizers import SGD
from keras.utils import to_categorical
#加载数据
iris = load_iris()
x = iris.data
y = iris.target
#将特征标准化,均值为0,方差为1
x = StandardScaler().fit_transform(x)
#将标签转为独热编码
y_hot = to_categorical(y)
#分为120条训练数据和标签以及30条测试数据和标签
train_x,val_x,train_y,val_y = train_test_split(x,y_hot,test_size = 30)
#神经网络模型的创建
model = keras.Sequential({
	#全连接层,节点数为3,激活函数为tanh,输入特征量为4
    keras.layers.Dense(3,activation="tanh",input_shape=(4,)),
    keras.layers.Dense(7,activation="tanh"),
    keras.layers.Dense(4,activation="tanh"),
    #激活函数为softmax,用于独热编码的激活函数,将输出映射到0到1,且三个通道输出		之和为1,分别代表目标属于某一类别的概率
    keras.layers.Dense(3,activation="softmax")
})
#模型编译,损失函数为分类交叉熵,优化器为随机梯度下降,学习率为0.01
model.compile(loss="categorical_crossentropy",
             optimizer=SGD(0.01),
             metrics=["acc"])
#模型训练,训练15个迭代周期,每次训练量为1
model.fit(train_x,train_y,validation_data=(val_x,val_y),batch_size=1,epochs=10)

训练结果如下:
在这里插入图片描述
我们可以看到随着训练的不断进行,模型的损失值在不断减小,精度也在慢慢提高。

经过了这篇文章,不知道大家对深度学习有没有了初步的认识了?往后博主也会给大家分享更多的深度学习案例,感谢大家的阅读,希望大家能够有所收获~

猜你喜欢

转载自blog.csdn.net/weixin_42494845/article/details/105705191