深度学习框架Keras入门八股文
本文介绍3个案例来帮助读者认识和入门深度学习框架Keras。3个案例解决3个问题:回归、二分类、多分类
目录
为什么选择Keras
相信很多小伙伴在入门深度学习时候首选框架应该是TensorFlow或者Pytorch。在如今无数深度学习框架中,为什么要使用 Keras 而非其他?整理自Keras中文官网:
- Keras 优先考虑开发人员的经验
- Keras 被工业界和学术界广泛采用
- Keras 可以轻松将模型转化为产品
- Keras 支持多个后端引擎
- Keras 拥有强大的多 GPU 和分布式训练支持
- Keras 的发展得到关键公司的支持,比如:谷歌、微软等
详细信息见中文官网:https://keras.io/zh/why-use-keras/
主要步骤
使用Keras解决机器学习/深度学习问题的主要步骤:
- 特征工程+数据划分
- 搭建神经网络模型add
- 查看网络架构summary
- 编译网络模型compile
- 训练网络fit
- 保存模型save
- 评估模型evaluate
- 评价指标可视化visualize
导入库
1 | import pandas as pd |
回归案例
回归案例中使用的是Keras自带的波士顿房价数据集。
导入数据
In [2]:
1 | from keras.datasets import boston_housing |
In [3]:
1 | train_X.shape # 数据形状 |
Out[3]:
1 | (404, 13) |
In [4]:
1 | train_X[:3] |
Out[4]:
1 | array([[1.23247e+00, 0.00000e+00, 8.14000e+00, 0.00000e+00, 5.38000e-01, |
In [5]:
1 | train_y[:3] |
Out[5]:
1 | array([15.2, 42.3, 50. ]) |
数据标准化
神经网络中一般输入的都是较小数值的数据,数据之间的差异不能过大。现将特征变量的数据进行标准化处理
In [6]:
1 | train_X[:3] |
Out[6]:
1 | array([[1.23247e+00, 0.00000e+00, 8.14000e+00, 0.00000e+00, 5.38000e-01, |
针对训练集的数据做标准化处理:减掉均值再除以标准差
In [7]:
1 | mean = train_X.mean(axis=0) # 均值 |
针对测集的数据处理:使用训练集的均值和标准差
In [8]:
1 | test_X -= mean |
构建网络
In [9]:
1 | train_X.shape |
Out[9]:
1 | (404, 13) |
In [10]:
1 | model = models.Sequential() |
网络架构
In [11]:
1 | model.summary() |
训练网络
In [12]:
1 | history = model.fit(train_X, # 特征 |
保存模型
In [13]:
1 | model.save("my_model.h5") # 保存模型 |
In [14]:
1 | model = load_model('my_model.h5') # 加载模型 |
评估模型
返回的是loss和mae的取值
In [15]:
1 | model.evaluate(test_X, test_y) |
Out[15]:
1 | [16.107179641723633, 2.5912036895751953] |
history对象
In [16]:
1 | type(history) # 回调的History对象 |
Out[16]:
1 | keras.callbacks.History |
In [17]:
1 | type(history.history) # 字典 |
Out[17]:
1 | dict |
In [18]:
查看history.history字典对象中的信息:keys就是每个评价指标,values其实就是每次输出的指标对应的值
1 | for keys,_ in history.history.items(): |
In [19]:
1 | len(history.history["loss"]) |
Out[19]:
1 | 100 |
In [20]:
1 | history.history["loss"][:10] |
Out[20]:
1 | [197.65003967285156, |
loss-mae
In [21]:
1 | # 损失绘图 |
二分类
使用的是sklearn中自带的cancer数据集
导入数据
In [22]:
1 | cancer=datasets.load_breast_cancer() |
部分数据信息截图
1 | # 生成特征数据和标签数据 |
数据标准化
In [24]:
1 | X[:2] |
Out[24]:
1 | array([[1.799e+01, 1.038e+01, 1.228e+02, 1.001e+03, 1.184e-01, 2.776e-01, |
In [25]:
1 | ss = StandardScaler() |
Out[25]:
1 | array([[ 1.09706398e+00, -2.07333501e+00, 1.26993369e+00, |
数据集划分
In [26]:
1 | X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2,random_state=123) |
Out[26]:
1 | (455, 30) |
In [27]:
1 | y_train.shape |
Out[27]:
1 | (455,) |
In [28]:
1 | X_test.shape # 测试集长度是114 |
Out[28]:
1 | (114, 30) |
构建网络
这是一个二分类的问题,最后一层使用sigmoid作为激活函数
In [29]:
1 | model = models.Sequential() |
网络架构
In [30]:
1 | model.summary() |
编译模型
在keras搭建的神经网络中,如果输出是概率值的模型,损失函数最好使用:交叉熵crossentropy
常用目标损失函数的选择:
- binary_crossentropy:针对二分类问题的交叉熵
- categorical_crossentropy:针对多分类问题的交叉熵
两种不同的指定方法:
1 | # 方法1 |
常用的性能评估函数:
- binary_accuracy: 针对二分类问题,计算在所有预测值上的平均正确率
- categorical_accuracy:针对多分类问题,计算再所有预测值上的平均正确率
- sparse_categorical_accuracy:与categorical_accuracy相同,在对稀疏的目标值预测时有用
In [31]:
1 | # 配置优化器 |
训练网络
In [32]:
1 | len(X_train) |
Out[32]:
1 | 455 |
In [33]:
1 | history = model.fit(X_train, # 特征向量 |
评估模型
In [34]:
1 | model.evaluate(X_test, y_test) |
Out[34]:
1 | [0.08793728798627853, 0.9824561476707458] |
可以看到模型的精度达到了惊人的98.2%!
loss-acc
In [35]:
1 | for keys, _ in history.history.items(): |
In [36]:
1 | # 损失绘图 |
可以看到:随着轮数的增加loss在逐渐降低,而精度acc在逐渐增加,趋近于1
多分类案例
多分类的案例使用sklearn中自带的iris数据集,数据集不多介绍。最终结果是存在3个类的。
导入数据
In [37]:
1 | iris = datasets.load_iris() |
In [38]:
1 | # 特征数据和标签数据 |
Out[38]:
1 | array([[5.1, 3.5, 1.4, 0.2], |
In [39]:
1 | y[:3] |
Out[39]:
1 | array([0, 0, 0]) |
数据标准化
In [40]:
1 | ss = StandardScaler() |
数据集划分
In [41]:
1 | X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2,random_state=123) |
Out[41]:
1 | (120, 4) |
标签向量化
In [42]:
1 | y_test[:5] |
Out[42]:
1 | array([1, 2, 2, 1, 0]) |
In [43]:
1 | # 内置方法实现标签向量化 |
In [44]:
1 | y_test[:5] |
Out[44]:
1 | array([[0., 1., 0.], |
In [45]:
1 | X_train[:3] |
Out[45]:
1 | array([[ 1.88617985, -0.59237301, 1.33113254, 0.92230284], |
构建模型
In [46]:
1 | model = models.Sequential() |
模型编译
多分类问题一般是使用categorical_crossentropy作为损失函数。它是用来衡量网络输出的概率分布和标签的真实概率分布的距离。
In [47]:
1 | model.compile(optimizer="rmsprop", |
训练网络
In [48]:
1 | len(X_train) |
Out[48]:
1 | 120 |
In [49]:
1 | history = model.fit(X_train, |
评估模型
In [50]:
1 | model.evaluate(X_test, y_test) |
Out[50]:
1 | [0.17986173927783966, 1.0] |
loss-acc曲线
In [51]:
1 | for keys, _ in history.history.items(): |
In [52]:
1 | # 损失绘图 |
待补充学习
上面的方案只是从最基本的方式来通过Keras进行神经网络的建模,还有很多可以深入学习和挖掘的点:
- 验证集数据的引入
- 加入正则化技术,防止模型过拟合
- 如何评估训练的轮次,使得模型在合适时机停止
- 激活函数的选择等