学习Keras搭建序贯式模型,并学习使用MNIST手写数字识别例子
from tensorflow.keras import layers, models
# 创建一个序贯式模型对象
model = models.Sequential()
# 添加第一个网络层(作为输入层)
# 参数1:本层神经元个数,2:激活函数类型,3:输入样本的形状
model.add(layers.Dense(512, activation='relu', input_shape=(28*28,)))
# 添加第二个网络层(作为输出层)
# 参数1:输出个数,2:激活函数类型
model.add(layers.Dense(10, activation='softmax'))
# 输出模型的概览
model.summary()
使用MNIST手写数字识别例子,MNIST是经典的手写数字图片数据集,下载地址:https://s3.amazonaws.com/img-datasets/mnist.npz,下载后存放于python代码的目录下
from tensorflow.keras import datasets
# 1.加载MNIST数据集
# 加载数据集
(X_train, y_train),(X_test, y_test)=datasets.mnist.load_data()
# 查看拆分结果
print(X_train.shape, y_train.shape)
print(X_test.shape, y_test.shape)
# 2.使用Matplotlib查看图片
import matplotlib.pyplot as plt
# 查看训练集前10张图片
fig = plt.figure(figsize=(12,4)) #定义画板
for i in range(10):
ax = fig.add_subplot(2,5, i+1)
ax.matshow(X_train[i])
plt.show()
# 3.数据预处理,搭建前馈神经网络
#搭建序贯式模型,第一个网络层作为输入层,使用512个神经元(可以自定义),第二个网络层作为输出层,使用10个神经元(对应10个类别),激活函数使用softmax
from tensorflow.keras import layers, models
# 转换数据集的形状,(转成二维)
X_train = X_train.reshape(60000, 28*28)
X_test = X_test.reshape(10000, 28*28)
print(X_train.shape)
# 创建一个序贯式模型对象
model = models.Sequential()
# 添加第一个网络层(作为输入层)
# 参数1:本层神经元个数,2:激活函数类型,3:输入样本的形状
model.add(layers.Dense(512, activation='relu', input_shape=(28*28,)))
# 添加第二个网络层(作为输出层)
model.add(layers.Dense(10, activation='softmax'))
# 输出模型的概览
model.summary()
# 4.编译、训练模型,评估准确率
# 编译参数包括优化器、损失函数、评价指标
# 编译模型
model.compile(optimizer='rmsprop', loss='sparse_categorical_crossentropy',metrics=['accuracy'])
# 训练模型
# 训练参数包括:训练集数据、训练集标签、训练迭代次数、批尺寸
model.fit(X_train, y_train, epochs = 5, batch_size = 128)
# 在测试集上评估模型
# 评估参数包括:测试集数据、测试集标签
test_loss,test_acc = model.evaluate(X_test, y_test)
print(test_acc)
# 5.使用模型识别手写数字图片
import numpy as np
index = 9
plt.matshow(X_test[index].reshape(28,28)) # 查看图片
plt.show()
# 使用模型识别该图片
result = model.predict(X_test[index].reshape(-1,28*28))
print(np.around(result))
print(np.argmax(result))
# 保存模型
# 策略一:保存全模型(网络结构+权重+编译配置)
# model.save('mnist_model.h5')
# model = models.load_model('mnist_model.h5')
# 策略二:仅保存权重
# model.save_weights('mnist_weight_model.h5')
# model.load_weights('mnist_weight_model.h5')
# 策略三:仅保存网络结构
# json_string = model.to_json()
# with open('mnist_model_json.json', 'w') as f:
# f.write(json_string)
# with open('mnist_model_json.json', 'r') as f:
# json_string = f.read()
# model = models.model_from_json(json_string)