机器学习与计算机视觉(keras和mnist)

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

 

    在所有机器学习的教程里面,mnist几乎是最简单的数据库。这是一个首先的字母识别库。而相比较而言,keras又是比较好的深度学习封装库,所以大家不妨可以尝试一下keras和mnist。文中涉及的python代码来自网友博文,一并表示感谢。

 

1、获取mnist库

    如果利用keras去获取mnist数据,那么它会从亚马逊云上面下载,十分不方便。建议大家手工下载,然后用numpy直接加载就可以了。

 

2、数据向量化

    不管是什么数据,输入给深度学习的时候都要进行向量化处理。比如mnist每一幅图像都是28*28的小图,它都会要求你转成一个784的一唯向量。这个工作一般由reshape来完成后。

 

3、分类扁平化

    因为原来的数据一般直接就是归为某一类,所以我们就要把它转换成一个数组,比如5变成[0,0,0,0,0,1,0,0,0,0]。to_categorical函数可以帮助我们实现这一功能。

 

4、训练次数

    一般训练次数是自己设定的,对于中间的模型结果可以保存下来。

 

5、模型的保存

    训练的时候有时候会得到很多的模型,建议大家可以将这些中间结果保存下来,后期分析的时候非常有用。当然,在模型保存时,对于名字的选择非常讲究,最好表明是什么参数、训练多少次获得的模型。

 

6、模型的加载

    模型训练非常麻烦,但是加载很简单,它包含了网络、模型等很多数据。

 

7、模型预测

    如果需要预测结果,直接使用predict函数就可以。当然获取的数据也是向量形式,里面的数值表示预测对象代表当前类的最大概率。这个时候需要用函数argmax转换一下就可以了。

 

8、训练过程中的中间结果

shell> python3 recognize.py

Using TensorFlow backend.
(60000, 28, 28) (60000,)
(10000, 28, 28) (10000,)
(60000, 784)
(10000, 784)
2019-12-14 22:48:42.912275: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
dense_1 (Dense)              (None, 512)               401920
_________________________________________________________________
dense_2 (Dense)              (None, 256)               131328
_________________________________________________________________
dense_3 (Dense)              (None, 10)                2570
=================================================================
Total params: 535,818
Trainable params: 535,818
Non-trainable params: 0
_________________________________________________________________
Train on 60000 samples, validate on 10000 samples
Epoch 1/5
60000/60000 [==============================] - 8s 138us/step - loss: nan - accuracy: 0.0986 - val_loss: nan - val_accuracy: 0.0980
Epoch 2/5
60000/60000 [==============================] - 11s 183us/step - loss: nan - accuracy: 0.0987 - val_loss: nan - val_accuracy: 0.0980
Epoch 3/5
60000/60000 [==============================] - 10s 173us/step - loss: nan - accuracy: 0.0987 - val_loss: nan - val_accuracy: 0.0980
Epoch 4/5
60000/60000 [==============================] - 12s 205us/step - loss: nan - accuracy: 0.0987 - val_loss: nan - val_accuracy: 0.0980
Epoch 5/5
60000/60000 [==============================] - 10s 164us/step - loss: nan - accuracy: 0.0987 - val_loss: nan - val_accuracy: 0.0980
10000/10000 [==============================] - 1s 76us/step

9、训练后的结果预测

shell> python3 predict.py

Using TensorFlow backend.
2019-12-14 22:52:50.258952: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
10000
784
10000
10
980

 

附录1:

    完整的mnist训练代码,用python3.5实现

#!/usr/bin/python
# -*- coding: utf-8 -*- 
#
# 首次使用深度学习来进行处理 20191214
#

import os
import sys
import re
import keras
import sklearn
import tensorflow
import numpy as np
import cv2

# keras里面的数据和模型需要单独添加

from keras.datasets import mnist
from keras.models  import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
from keras.models import load_model

#
# 原本数据从利用keras.datasets获取的
# 但是keras是从亚马逊下载,这里直接从第三方下载好,然后用numpy加载即可
#

x_train = np.load("./mnist/x_train.npy")
y_train = np.load("./mnist/y_train.npy")
x_test = np.load("./mnist/x_test.npy")
y_test = np.load("./mnist/y_test.npy")

print(x_train.shape,y_train.shape)
print(x_test.shape,y_test.shape)

# 打印显示图片

import matplotlib.pyplot as plt
im = plt.imshow(x_train[0],cmap='gray')
#plt.show()
#cv2.waitKey(0)

# 将图片摊平,变成向量

x_train = x_train.reshape(60000,784) 
x_test = x_test.reshape(10000,784) # 对测试集进行同样的处理
print(x_train.shape)
print(x_test.shape)

# 将数据扁平化,比如5设置为[0,0,0,0,0,1,0,0,0,0],这里的5应该是字符5的意思

y_train = keras.utils.to_categorical(y_train,10)
y_test = keras.utils.to_categorical(y_test,10)

model = Sequential() # 构建一个空的序贯模型

# 添加神经网络层

model.add(Dense(512,activation='relu',input_shape=(784,)))
model.add(Dense(256,activation='relu'))
model.add(Dense(10,activation='softmax'))
model.summary()

# 设置损失函数和优化方法

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

# 开始训练,训练5次

model.fit(x_train,y_train,batch_size=64,epochs=5,validation_data=(x_test,y_test)) 

# 检验识别效果
score = model.evaluate(x_test,y_test)

# 保存模型,

model.save('partly_trained.h5')
del model

# 加载模型继续训练

model = load_model('partly_trained.h5')

#继续训练

#model.fit(x_train[3000:], y_train[3000:], nb_epoch=10, batch_size=200, verbose=2)
model.fit(x_train,y_train,batch_size=64,epochs=5) 

scores = model.evaluate(x_test, y_test, verbose=0)
print("Baseline Error: %.2f%%" % (100-scores[1]*100))

 

附录2:

    mnist预测代码,重点在argmax的转换,

#!/usr/bin/python
# -*- coding: utf-8 -*- 
#
# 利用keras预测分类数据
#

import os
import sys
import re
import keras
import sklearn
import tensorflow
import numpy as np
import cv2

# keras里面的数据和模型需要单独添加

from keras.datasets import mnist
from keras.models  import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
from keras.models import load_model

# 加载模型继续训练

model = load_model('partly_trained.h5')
#
# 原本数据从利用keras.datasets获取的
# 但是keras是从亚马逊下载,这里直接从第三方下载好,然后用numpy加载即可
#

x_test = np.load("./mnist/x_test.npy")
y_test = np.load("./mnist/y_test.npy")

# 对测试集进行同样的处理
x_test = x_test.reshape(10000,784) 

print(x_test.shape[0])
print(x_test.shape[1])

# 加载一个预测结果
# 注意,这里预测的结果只是属于某一个品类的概率,一定要用np.argmax转换一下
y_pred=model.predict(x_test,batch_size = 1)

print(y_pred.shape[0])
print(y_pred.shape[1])

# 判断数值
y_pred = np.argmax(y_pred, axis=1)

cnt = 0
for i in range(len(y_test)):
	if y_test[i]==y_pred[i]:
		cnt += 1
print(cnt)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章