My Learning Channel

ANN | MLP多层感知器 | 手写数字识别

2022-09-18

1
2
3
4
5
import numpy as np
import matplotlib.pyplot as plt
import keras
from keras import layers
from keras.datasets import mnist # keras库中带得数据集。

1. 准备数据:X, y

1
2
#加载数据集
(X_train,y_train),(X_test,y_test) = mnist.load_data()
1
X_train.shape,y_train.shape,X_test.shape,y_test.shape
((60000, 28, 28), (60000,), (10000, 28, 28), (10000,))
1
2
3
#查看原始数据
plt.imshow(X_train[0])
y_train[0]
5

png

Step1准备数据

1
2
3
4
#1.1处理图片 / 归一化处理
X_train_shape = X_train.reshape(60000,28*28)/255
X_test_shape = X_test.reshape(10000,28*28)/255
X_train_shape.shape # 查看X的形状
(60000, 784)
1
2
3
4
5
#1.2处理结果[0-9] 类别向量 | one-hot编码
from keras.utils.np_utils import to_categorical
y_train_cat = to_categorical(y_train)
y_test_cat = to_categorical(y_test)
y_train_cat[1]
array([1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32)
1
X_train_shape.shape,y_train_cat.shape
((60000, 784), (60000, 10))

2. 构建网络模型:

1
model=keras.Sequential()
1
model.add(layers.Dense(128,input_dim=784,activation='relu')) #输入层
1
model.add(layers.Dense(64,activation='relu')) #隐藏层
1
model.add(layers.Dense(10,activation='softmax')) #输 出层
1
model.summary()
Model: "sequential_2"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense_5 (Dense)             (None, 128)               100480    
                                                                 
 dense_6 (Dense)             (None, 64)                8256      
                                                                 
 dense_7 (Dense)             (None, 10)                650       
                                                                 
=================================================================
Total params: 109,386
Trainable params: 109,386
Non-trainable params: 0
_________________________________________________________________
1
2
3
 #二分类 输出层的激活函数 sigmoid - loss: binary_crossentropy  
# 多分类 输出的激活函数 softmax - loss: categorical_crossentory
# to_caget... #

3. 编译模型:

1
model.compile(optimizer='Adam',loss='categorical_crossentropy',metrics=['acc'])

4. 训练模型:

1
history = model.fit(X_train_shape,y_train_cat,epochs=10,validation_data=(X_test_shape,y_test_cat))
Epoch 1/10
1875/1875 [==============================] - 14s 7ms/step - loss: 0.2399 - acc: 0.9307 - val_loss: 0.1117 - val_acc: 0.9628
Epoch 2/10
1875/1875 [==============================] - 16s 9ms/step - loss: 0.0991 - acc: 0.9694 - val_loss: 0.1036 - val_acc: 0.9685
Epoch 3/10
1875/1875 [==============================] - 20s 11ms/step - loss: 0.0697 - acc: 0.9777 - val_loss: 0.0816 - val_acc: 0.9741
Epoch 4/10
1875/1875 [==============================] - 20s 11ms/step - loss: 0.0515 - acc: 0.9840 - val_loss: 0.0815 - val_acc: 0.9755
Epoch 5/10
1875/1875 [==============================] - 20s 11ms/step - loss: 0.0414 - acc: 0.9865 - val_loss: 0.0821 - val_acc: 0.9764
Epoch 6/10
1875/1875 [==============================] - 12s 7ms/step - loss: 0.0366 - acc: 0.9881 - val_loss: 0.0748 - val_acc: 0.9797
Epoch 7/10
1875/1875 [==============================] - 11s 6ms/step - loss: 0.0265 - acc: 0.9911 - val_loss: 0.0828 - val_acc: 0.9771
Epoch 8/10
1875/1875 [==============================] - 11s 6ms/step - loss: 0.0218 - acc: 0.9929 - val_loss: 0.0978 - val_acc: 0.9750
Epoch 9/10
1875/1875 [==============================] - 15s 8ms/step - loss: 0.0230 - acc: 0.9925 - val_loss: 0.0801 - val_acc: 0.9793
Epoch 10/10
1875/1875 [==============================] - 15s 8ms/step - loss: 0.0187 - acc: 0.9939 - val_loss: 0.0981 - val_acc: 0.9777

4. 评估模型:

1
loss,acc = model.evaluate(X_train_shape,y_train_cat)
1875/1875 [==============================] - 8s 4ms/step - loss: 0.0149 - acc: 0.9949
1
loss,acc = model.evaluate(X_test_shape,y_test_cat)
313/313 [==============================] - 1s 4ms/step - loss: 0.0981 - acc: 0.9777

5. 预测模型:

1
pred=model.predict(X_test_shape)
1
pred.shape
(10000, 10)
1
pred[0]
array([2.6841791e-11, 3.1484275e-12, 2.0740840e-09, 3.1667929e-07,
       2.0627146e-12, 2.2692452e-09, 1.0325417e-16, 9.9999952e-01,
       1.6174454e-11, 6.6967488e-08], dtype=float32)
1
np.argmax(pred[1])
2
1
#原始图片
1
plt.imshow(X_test[1])
<matplotlib.image.AxesImage at 0x1c040a730d0>

png

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章