一、概述
本博文基于tensorflow的官方指南,演示一个keras的使用例子,环境为win10+spyder3.3.3+python3.6。
keras的定义:用一句很通俗的话来说,就是tensorflow中的高阶API,实际开发中会更方便易用。
二、代码演示
1、检测Keras版本
Keras需要单独安装,如果没有安装的话,可以在Anaconda Prompt中键入以下命令,然后重启下spyder即可。
pip install keras
安装完之后,我们可以看下版本号。
import tensorflow as tf
from tensorflow.keras import layers
print(tf.VERSION)
print(tf.keras.__version__)
#######################以下是运行结果#######################
1.12.0
2.1.6-tf
可以看到,我用的tensorflow版本是1.12.0,keras版本为2.1.6-tf
2、构建三层神经网络模型
一般使用Sequential接口来构建模型,首先,创建一个Sequential对象。
model = tf.keras.Sequential()
然后使用add方法增加单层网络结构,比如输入层构建为一个64节点relu激活函数的densely层
model.add(layers.Dense(64, activation='relu'))
隐藏层也一样为64节点relu激活函数的densely层
model.add(layers.Dense(64, activation='relu'))
输出层构建为 10节点的softmax层
model.add(layers.Dense(10, activation='softmax'))
这样一个简单的三层神经网络就形成了。
3、编译模型
然后就是编译模型,对应的接口为compile,望文生义,及其好用,代码如下:
model.compile(optimizer=tf.train.AdamOptimizer(0.001),
loss=tf.keras.losses.categorical_crossentropy,
metrics=[tf.keras.metrics.categorical_accuracy])
注意下compile方法里面的参数,optimizer表示选择哪种优化算法,这里使用的是Adam算法,0.001是指学习率。常用的优化算法有梯度下降算法tf.train.GradientDescentOptimizer,
RMSProp算法tf.train.RMSPropOptimizer等,具体可以参考官方API
loss顾名思义就是损失函数,这里传的是分类交叉熵函数categorical_crossentropy
,另外常见的有均方差mse、交叉熵损失函数binary_crossentropy等,具体可以参考官方API。
metrics用于监控训练。
4、拟合模型
使用fit方法拟合模型,拟合模型之前需要给模型喂数据,这里我们通过numpy生成随机数据,然后拟合,代码如下:
import numpy as np
data = np.random.random((1000, 32))
labels = np.random.random((1000, 10))
model.fit(data, labels, epochs=10, batch_size=32)
#######################以下是运行结果#######################
Epoch 1/10
1000/1000 [==============================] - 0s 437us/step - loss: 11.5771 - categorical_accuracy: 0.0940
Epoch 2/10
1000/1000 [==============================] - 0s 16us/step - loss: 11.5316 - categorical_accuracy: 0.1000
Epoch 3/10
1000/1000 [==============================] - 0s 31us/step - loss: 11.5245 - categorical_accuracy: 0.0950
Epoch 4/10
1000/1000 [==============================] - 0s 31us/step - loss: 11.5170 - categorical_accuracy: 0.1100
Epoch 5/10
1000/1000 [==============================] - 0s 31us/step - loss: 11.5119 - categorical_accuracy: 0.1200
Epoch 6/10
1000/1000 [==============================] - 0s 31us/step - loss: 11.5078 - categorical_accuracy: 0.1340
Epoch 7/10
1000/1000 [==============================] - 0s 31us/step - loss: 11.5041 - categorical_accuracy: 0.1390
Epoch 8/10
1000/1000 [==============================] - 0s 31us/step - loss: 11.5004 - categorical_accuracy: 0.1480
Epoch 9/10
1000/1000 [==============================] - 0s 31us/step - loss: 11.4962 - categorical_accuracy: 0.1420
Epoch 10/10
1000/1000 [==============================] - 0s 16us/step - loss: 11.4914 - categorical_accuracy: 0.1500
在方法中:
batch_size表示一个batch数据集的大小,由于我们的data是一个1000*32的矩阵,所以其实有32000个单数据,一次训练32个,总共训练完这32000个,也就是一个epoch。我们也可以更改epoch和batch_size的大小来调整样本训练和迭代次数。
5、评估模型
使用evaluate来评估模型的误差和准确度,这里我们用了7个不同batch_size来评估,对比发现,batch_size选为128时,误差最小(11.797072265625),准确度最高(0.09900000011920929)
print(model.evaluate(data, labels, batch_size=1,verbose=0))
print(model.evaluate(data, labels, batch_size=32,verbose=0))
print(model.evaluate(data, labels, batch_size=64,verbose=0))
print(model.evaluate(data, labels, batch_size=128,verbose=0))
print(model.evaluate(data, labels, batch_size=256,verbose=0))
print(model.evaluate(data, labels, batch_size=512,verbose=0))
print(model.evaluate(data, labels, batch_size=1024,verbose=0))
#######################以下是运行结果#######################
[11.79707234954834, 0.099]
[11.797072402954102, 0.099]
[11.797072357177735, 0.09900000011920929]
[11.797072265625, 0.09900000011920929]
[11.79707233428955, 0.09900000077486039]
[11.79707208251953, 0.09899999970197677]
[11.797072410583496, 0.0989999994635582]
6、预测
模型构建好之后,我们就可以使用predict方法来做预测了,代码和运行结果如下:
result = model.predict(data, batch_size=128)
print("样本值为:{0},预测值为:{1}".format(labels[0][0],result[0][0]))
print("样本值为:{0},预测值为:{1}".format(labels[1][1],result[1][1]))
print("样本值为:{0},预测值为:{1}".format(labels[99][3],result[99][3]))
print("样本值为:{0},预测值为:{1}".format(labels[99][9],result[99][9]))
#######################以下是运行结果#######################
样本值为:0.16150409836130775,预测值为:0.09359117597341537
样本值为:0.396365489533654,预测值为:0.09647810459136963
样本值为:0.10301416501284555,预测值为:0.09253861755132675
样本值为:0.35652257869247117,预测值为:0.10236872732639313
从运行结果来看,误差基本上没有偏离太大,但还是不小,主要因为我们本来输入的就是随机数据。