# -*- coding:utf-8 -*-
'''
mnist手写体识别
采用卷积-池化-卷积-池化-全连接-dropout-全连接
优化器:用rmsprop优化器进行梯度下降
误差:交叉熵
'''
import numpy as np
from keras.datasets import mnist
# to_categorical将类别向量转换为二进制(只有0和1)的矩阵类型
from keras.utils import to_categorical
from keras import models
from keras import layers
'---加载数据---'
data = np.load('mnist.npz')
train_images, train_labels = data['x_train'], data['y_train']
test_images, test_labels = data['x_test'], data['y_test']
'将标签转化'
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
'---数据预处理---'
'训练集'
# 改形状
train_images = train_images.reshape((60000, 28*28))
# 改数据类型,把值除255以缩放至[0,255]
train_images = train_images.astype('float32')/255
'测试集'
test_images = test_images.reshape((10000, 28*28))
test_images = test_images.astype('float32')/255
'---载入模型---'
import os
if(os.path.exists('my_model.h5')):
network = models.load_model('my_model.h5')
print('已载入网络')
else:
print('开始架构网络')
'---架构网络---'
network = models.Sequential()
'全连接层'
network.add(layers.Dense(512, activation='relu', input_shape=(28*28, )))
'全连接层,属于十个数(类别)的概率'
network.add(layers.Dense(10, activation='softmax', input_shape=(28*28, )))
'优化器、损失函数、精度'
network.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
'训练5次,训练集的精度98.8%'
history = network.fit(train_images, train_labels, epochs=1, batch_size=128)
history_dict = history.history
print(history_dict.keys())
'---测试---'
test_loss , test_acc = network.evaluate(test_images, test_labels)
'测试集的精度97.9%,过拟合造成'
print('test_acc:', test_acc)
'---保存模型---'
# 保存参数,载入参数
network.save('my_model.h5')