tensorflow2.0之keras手写数字识别
import tensorflow as tf
import tensorflow.keras as keras
import tensorflow.keras.layers as layers
from tensorflow.keras import Sequential
import matplotlib.pyplot as plt
import pandas as pd
from tensorflow.keras.utils import normalize
from tensorflow.keras.utils import to_categorical
import tensorflow.keras.optimizers as optimizers
import tensorflow.keras.losses as losses
import tensorflow.keras.metrics as metrics
- 导入数据
(x_train, y_train),(x_test, y_test) = tf.keras.datasets.mnist.load_data()
x1_train = x_train.reshape(-1, 784) #改变形状,变一维
x1_test = x_test.reshape(-1, 784)
x_train_nor = normalize(x1_train, axis=1)#归一化
x_test_nor = normalize(x1_test, axis=1)
y_train_onehot = to_categorical(y_train)#标签转为onehot类型
y_test_onthot = to_categorical(y_test)
- 创建网络
network = Sequential()
network.add(layers.Dense(units=256, kernel_initializer='normal', activation='relu'))
network.add(layers.Dropout(0.5))
network.add(layers.Dense(units=10,kernel_initializer='normal',activation='softmax'))
network.build(input_shape=(4,784))#此处的build是为了创建参数,所以需要设置
- 查看网络:
network.summary()
- 训练参数设置以及训练
#设置优化方法, 损失函数, 以及评价指标
network.compile(optimizer=optimizers.Adam(), loss=losses.CategoricalCrossentropy(), metrics=['accuracy'])
#设置训练数据以及标签, 验证集占比重, 循环次数, 批大小, 日志级别
train_history = network.fit(x=x_train_nor, y=y_train_onehot, validation_split=0.2, epochs=5, batch_size=200, verbose=2)
其中verbose是日志等级: verbose:日志显示
verbose = 0 为不在标准输出流输出日志信息
verbose = 1 为输出进度条记录
verbose = 2 为每个epoch输出一行记录
注意: 默认为 1
Train on 48000 samples, validate on 12000 samples
Epoch 1/5
48000/48000 - 4s - loss: 0.9353 - accuracy: 0.7783 - val_loss: 0.3760 - val_accuracy: 0.9023
Epoch 2/5
48000/48000 - 1s - loss: 0.3890 - accuracy: 0.8895 - val_loss: 0.2828 - val_accuracy: 0.9208
Epoch 3/5
48000/48000 - 1s - loss: 0.3156 - accuracy: 0.9080 - val_loss: 0.2428 - val_accuracy: 0.9312
Epoch 4/5
48000/48000 - 1s - loss: 0.2757 - accuracy: 0.9200 - val_loss: 0.2166 - val_accuracy: 0.9382
Epoch 5/5
48000/48000 - 1s - loss: 0.2461 - accuracy: 0.9281 - val_loss: 0.1941 - val_accuracy: 0.9457
- 查看训练过程中相关指标的值:可用于后期画图使用
train_history.history
{‘loss’: [0.9352779900034268,
0.3889504156385859,
0.3156389035284519,
0.27566256585220494,
0.24609261999527612],
‘accuracy’: [0.7783125, 0.8895208, 0.9079792, 0.91997916, 0.928125],
‘val_loss’: [0.37601099784175557,
0.28281597085297105,
0.24280174300074578,
0.21655768944571416,
0.19407257350782553],
‘val_accuracy’: [0.9023333, 0.92083335, 0.93116665, 0.9381667, 0.9456667]}
- 画图:
def show_train_history(history, train, validation):
plt.plot(history.history[train])
plt.plot(history.history[validation])
plt.title('Train History')
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.legend(['validation','train'],loc='upper left')
- 网络评估:
scores = network.evaluate(x_test_nor, y_test_onthot)
- 类别预测
prediction = network.predict_classes(x_test_nor)
- 查看分类结果
分类表:
pd.crosstab(y_test, prediction, rownames=['label'], colnames=['prediction'])
预测错误的样本位置:
df = pd.DataFrame({'label':y_test,'predict':prediction})
print(df[(df.label==5)&(df.predict==3)]) #查看是5预测错成3的数据位置
推荐阅读
-
(sklearn:Logistic回归)和(keras:全连接神经网络)完成mnist手写数字分类
-
Python实现识别手写数字大纲
-
python tensorflow基于cnn实现手写数字识别
-
手写数字识别 ----Softmax回归模型官方案例注释(基于Tensorflow,Python)
-
手写数字识别 ----在已经训练好的数据上根据28*28的图片获取识别概率(基于Tensorflow,Python)
-
Python实现识别手写数字 Python图片读入与处理
-
python实现识别手写数字 python图像识别算法
-
Python神经网络TensorFlow基于CNN卷积识别手写数字
-
C++学习贝叶斯分类器实现手写数字识别示例解析
-
C++编程模板匹配超详细的识别手写数字实现示例