MNIST手写数字识别——进阶多层神经网络与应用(使用Keras序列模型建模)

前言

Keras序列模型建模的一般步骤:

1)创建一个Sequential模型;

(2)根据需要,通过“add()”方法在模型中添加所需要的神经网络层, 完成模型构建;

(3)编译模型,通过“compile()”定义模型的训练模式;

(4)训练模型,通过“fit()”方法进行训练模型;

(5)评估模型,通过“evaluate()”进行模型评估;

(6)应用模型,通过“predict()”进行模型预测

1、载入数据

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

print("Tensorflow版本是:",tf.__version__)

mnist = tf.keras.datasets.mnist
(train_images,train_labels),(test_images,test_labels)=mnist.load_data()

MNIST手写数字识别——进阶多层神经网络与应用(使用Keras序列模型建模)_第1张图片

2、 特征数据归一化

train_images = train_images / 255.0
test_images = test_images / 255.0

3、标签数据独热编码

train_labels_ohe = tf.one_hot(train_labels,depth=10).numpy()

test_labels_ohe = tf.one_hot(test_labels,depth=10).numpy()

4、新建一个序列模型

5、添加输入层 (平坦层,Flatten)

6、添加隐藏层(密集层,Dense)

model.add(tf.keras.layers.Dense(units=64,
                               kernel_initializer='normal',
                               activation='relu'))

model.add(tf.keras.layers.Dense(units=32,
                               kernel_initializer='normal',
                               activation='relu'))

7、添加输出层(还是密集层)

model.add(tf.keras.layers.Dense(10,activation='softmax'))

8、模型摘要

model.summary()

MNIST手写数字识别——进阶多层神经网络与应用(使用Keras序列模型建模)_第2张图片

9、定义训练模式

model.compile(optimizer='adam',
             loss='categorical_crossentropy',
             metrics=['accuracy'])

tf.keras.Model.compile 接受 3 个重要的参数:

optimizer :优化器,可从 tf.keras.optimizers 中选择;

loss :损失函数,可从 tf.keras.losses 中选择;

metrics :评估指标,可从 tf.keras.metrics 中选择。

10、设置训练参数

train_epochs=10
batch_size=30

11、模型训练

train_history=model.fit(train_images,train_labels_ohe,
                        validation_split=0.2,
                        epochs=train_epochs,
                        batch_size=batch_size,
                        verbose=2)

MNIST手写数字识别——进阶多层神经网络与应用(使用Keras序列模型建模)_第3张图片

tf.keras.Model.fit()常见参数:

x :训练数据;

y :目标数据(数据标签);

epochs :将训练数据迭代多少遍;

batch_size :批次的大小;

validation_data :验证数据,可用于在训练过程中监控模型的性能

verbose训练过程的日志信息显示,0为不在标准输出流输出日志信息,1为输出进度条记录,2为每个epoch输出一行记录

12、训练过程指标数据

train_history.history

MNIST手写数字识别——进阶多层神经网络与应用(使用Keras序列模型建模)_第4张图片

        history是一个字典类型数据,包含了4个Key: loss、accuracy、val_loss和val_accuracy,分 别表示训练集上的损失、准确率和验证集上的损 失和准确率。 它们的值都是一个列表,记录了每个周期该指标 的具体数值。

13、训练过程指标可视化

import matplotlib.pyplot as plt
def show_train_history(train_history,train_metric,val_metric):
    plt.plot(train_history.history[train_metric])
    plt.plot(train_history.history[val_metric])
    plt.title('Train History')
    plt.ylabel(train_metric)
    plt.xlabel('Epoch')
    plt.legend(['train','validation'],loc='upper left')
    plt.show()

show_train_history(train_history,'loss','val_loss')

show_train_history(train_history,'accuracy','val_accuracy')

MNIST手写数字识别——进阶多层神经网络与应用(使用Keras序列模型建模)_第5张图片

14、评估模型

test_loss,test_acc=model.evaluate(test_images,test_labels_ohe,verbose=2)

15、模型的度量指标

yy=model.evaluate(test_images,test_labels_ohe,verbose=2)

yy

model.metrics_names

MNIST手写数字识别——进阶多层神经网络与应用(使用Keras序列模型建模)_第6张图片

      模型评估evaluate()的返回值是一个损失值的标量(如果没有指定其他度量指标), 或者是一个列表(如果指定了其他度量指标)。

16、应用模型

test_pred=model.predict(test_images)
test_pred.shape
np.argmax(test_pred[0])
test_pred=model.predict_classes(test_images)
test_pred[0]
test_labels[0]

MNIST手写数字识别——进阶多层神经网络与应用(使用Keras序列模型建模)_第7张图片

你可能感兴趣的