基于MNIST数据集的深度学习库keras的学习
目录
基于MNIST数据集的深度学习库keras的学习
目录学习步骤搭建简单模型训练预测
先上代码如下训练的结果如下 搭建CNN模型训练预测
还是先上代码训练结果如下 数字图片的预测测试
测试代码测试图片测试结果 总结参考内容
个人主页
学习步骤
学习过程很简单(haha),先看官方文档,结合例子看文档,不懂的看博客,一些大牛总结的非常好~!
搭建简单模型训练预测
先上代码,如下
from keras.models
import Sequential
from keras.layers
import Dense, Dropout, Activation
from keras.optimizers
import SGD
from keras.datasets
import mnist
from keras.utils
import np_utils
from keras.models
import model_from_json
import numpy
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(x_train.shape[
0], x_train.shape[
1] * x_train.shape[
2]).astype(
'float32')
x_test = x_test.reshape(x_test.shape[
0], x_test.shape[
1] * x_test.shape[
2]).astype(
'float32')
y_train = np_utils.to_categorical(y_train,
10)
y_test = np_utils.to_categorical(y_test,
10)
x_train = x_train /
255
x_test = x_test /
255
model = Sequential()
layers1 = Dense(
784, input_dim=
784, kernel_initializer=
'normal', activation=
'relu')
model.add(layers1)
model.add(Dropout(
0.2))
model.add(Dense(
512))
model.add(Activation(
'relu'))
model.add(Dropout(
0.2))
model.add(Dense(
10, kernel_initializer=
'normal', activation=
'softmax'))
model.summary()
model.compile(loss=
'categorical_crossentropy', optimizer=
'adam', metrics=[
'accuracy'])
model.fit(x_train, y_train, validation_data=(x_test, y_test), batch_size=
200, epochs=
10, shuffle=
True, verbose=
2)
print '正在测试数据...'
scores = model.evaluate(x_test, y_test, verbose=
0)
print scores
print '=' *
30
print(
"MLP4MNIST Error: %.2f%%" % (
100 - scores[
1]*
100))
json_string = model.to_json()
open(
'baseline4MNIST_model.json',
'w').write(json_string)
model.save_weights(
'baseline4MNIST_weights.h5')
需要注意的是输入需要归一化x_train = x_train / 255,没有归一化训练过程中损失函数值很大,准确率只有40%左右(具体机理还不知);
模型为两层全连接,神经元分别为784,512个;
搭建的模型与训练的权重结果分别以json和h5格式保存。
训练的结果如下
Using TensorFlow backend.
_________________________________________________________________
Layer (
type) Output Shape Param
=================================================================
dense_1 (Dense) (None,
784)
615440
_________________________________________________________________
dropout_1 (Dropout) (None,
784)
0
_________________________________________________________________
dense_2 (Dense) (None,
512)
401920
_________________________________________________________________
activation_1 (Activation) (None,
512)
0
_________________________________________________________________
dropout_2 (Dropout) (None,
512)
0
_________________________________________________________________
dense_3 (Dense) (None,
10)
5130
=================================================================
Total params:
1,
022,
490
Trainable params:
1,
022,
490
Non-trainable params:
0
_________________________________________________________________
Train on
60000 samples, validate on
10000 samples
Epoch
1/
10
27s - loss:
0.2584 - acc:
0.9225 - val_loss:
0.1032 - val_acc:
0.9675
Epoch
2/
10
27s - loss:
0.0997 - acc:
0.9695 - val_loss:
0.0724 - val_acc:
0.9773
Epoch
3/
10
29s - loss:
0.0646 - acc:
0.9796 - val_loss:
0.0714 - val_acc:
0.9771
Epoch
4/
10
29s - loss:
0.0515 - acc:
0.9833 - val_loss:
0.0655 - val_acc:
0.9800
Epoch
5/
10
29s - loss:
0.0379 - acc:
0.9876 - val_loss:
0.0679 - val_acc:
0.9787
Epoch
6/
10
28s - loss:
0.0324 - acc:
0.9891 - val_loss:
0.0636 - val_acc:
0.9820
Epoch
7/
10
27s - loss:
0.0264 - acc:
0.9912 - val_loss:
0.0783 - val_acc:
0.9782
Epoch
8/
10
27s - loss:
0.0264 - acc:
0.9912 - val_loss:
0.0646 - val_acc:
0.9822
Epoch
9/
10
27s - loss:
0.0225 - acc:
0.9923 - val_loss:
0.0692 - val_acc:
0.9819
Epoch
10/
10
29s - loss:
0.0207 - acc:
0.9925 - val_loss:
0.0636 - val_acc:
0.9815
test set...
[
0.063634108908620687,
0.98150000000000004]
==============================
MLP4MNIST Error:
1.85%
loss和acc分别是训练集的损失函数值和正确率,后面是测试集的结果。 测试样本集的错误率为1.85%,当然现在手写数字的识别准确率可以做到100%。
搭建CNN模型训练预测
模型结构参考如下图:
图片来自这里
还是先上代码
from keras.models
import Sequential
from keras.layers
import Dense, Dropout, Flatten, Reshape
from keras.layers
import Conv2D, MaxPooling2D
from keras.utils
import np_utils
from keras.datasets
import mnist
from keras.optimizers
import SGD
from keras
import metrics
import numpy
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.astype(
'float32')
x_test = x_test.astype(
'float32')
x_train = x_train /
255
x_test = x_test /
255
y_train = np_utils.to_categorical(y_train,
10)
y_test = np_utils.to_categorical(y_test,
10)
print x_train.shape
print y_train.shape
model = Sequential()
model.add(Reshape((
28,
28,
1), input_shape=(
28,
28)))
model.add(Conv2D(
6, (
5,
5), activation=
'relu', input_shape=(
28,
28,
1)))
model.add(MaxPooling2D(pool_size=(
2,
2)))
model.add(Conv2D(
16, (
5,
5), activation=
'relu'))
model.add(MaxPooling2D(pool_size=(
2,
2)))
model.add(Dropout(
0.2))
model.add(Flatten())
model.add(Dense(
120, activation=
'relu'))
model.add(Dense(
84, activation=
'relu'))
model.add(Dense(
10, activation=
'softmax'))
model.summary()
sgd = SGD(lr=
0.01, decay=
1e-6, momentum=
0.9, nesterov=
True)
model.compile(loss=
'categorical_crossentropy', optimizer=sgd, metrics=[
'accuracy'])
model.fit(x_train, y_train, batch_size=
50, epochs=
5, verbose=
2)
score = model.evaluate(x_test, y_test, batch_size=
100, verbose=
1)
print '=' *
30
print(
"CNN Score: %.2f%%" % (score[
1]*
100))
json_string = model.to_json()
open(
'CNN4MNIST_model.json',
'w').write(json_string)
model.save_weights(
'CNN4MNIST_weights.h5')
首先将输入(28,28)的shape按tensorflow的tensor模式reshape成(28,28,1)
此CNN模型包括两个卷积层,两个池化层,两个全连接层
训练结果如下
Using TensorFlow backend.
(
60000,
28,
28)
(
60000,
10)
_________________________________________________________________
Layer (
type) Output Shape Param
=================================================================
reshape_1 (Reshape) (None,
28,
28,
1)
0
_________________________________________________________________
conv2d_1 (Conv2D) (None,
24,
24,
6)
156
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None,
12,
12,
6)
0
_________________________________________________________________
conv2d_2 (Conv2D) (None,
8,
8,
16)
2416
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None,
4,
4,
16)
0
_________________________________________________________________
dropout_1 (Dropout) (None,
4,
4,
16)
0
_________________________________________________________________
flatten_1 (Flatten) (None,
256)
0
_________________________________________________________________
dense_1 (Dense) (None,
120)
30840
_________________________________________________________________
dense_2 (Dense) (None,
84)
10164
_________________________________________________________________
dense_3 (Dense) (None,
10)
850
=================================================================
Total params:
44,
426
Trainable params:
44,
426
Non-trainable params:
0
_________________________________________________________________
Epoch
1/
5
41s - loss:
0.3166 - acc:
0.8970
Epoch
2/
5
40s - loss:
0.0979 - acc:
0.9686
Epoch
3/
5
40s - loss:
0.0731 - acc:
0.9769
Epoch
4/
5
40s - loss:
0.0624 - acc:
0.9807
Epoch
5/
5
41s - loss:
0.0536 - acc:
0.9825
9900/
10000 [============================>.] - ETA:
0s==============================
CNN Score:
98.64%
对比:CNN的准确率要比前面的简单MLP模型的略高,但是可以从下面的测试看出CNN优势(泛化能力强)。
数字图片的预测测试
将前面保存的模型以及训练权重结果重新加载进来,对输入图像进行预测。
测试代码
from keras.models
import model_from_json
from keras.preprocessing
import image
import numpy
as np
import sys
from scipy
import misc
import matplotlib.image
as mpimg
import matplotlib.pyplot
as plt
print '*' *
50
print 'Usage:python *.py modelName.json weightsName.h5 img.jpg'
print '*' *
50
def rgb2gray(rgb):
return np.dot(rgb[...,:
3],[
0.299,
0.587,
0.114])
model=model_from_json(open(sys.argv[
1]).read())
model.load_weights(sys.argv[
2])
img_path = sys.argv[
3]
img = mpimg.imread(img_path)
print 'original img shape:', img.shape
imgGray = rgb2gray(img)
img_newsize=misc.imresize(imgGray,[
28,
28])
plt.imshow(img_newsize, cmap=plt.get_cmap(
'PuBuGn_r'))
img_newsize = img_newsize.reshape(
1,
28,
28).astype(
'float32')
x = img_newsize /
255
preds2 = model.predict_classes(x)
print '*' *
50
print 'Predicted:', preds2[
0]
plt.show()
上述代码是对CNN的模型进行测试,对MLP模型测试时,需将输入reshape成(1,784)。
测试图片
测试结果
nums:MLPCNN
047105205445715995338555557715991555555
在训练以及对测试数据集进行测试时,CNN和MLP模型准确率>98%,但是这测试结果远远没有达到理想中的效果;
有可能输入数据没有做好处理,训练数据集和测试数据集的数据与图片输入数据还是有很大不同,输入图像空白处大部分是255,而训练和测试数据集都是0,后续实验再验证…继续学习…
将输入图像翻转img = 255 - img,再进行测试,测试结果如下:
numsMLPCNN
000111222444787989333355557761991755555
相比于前面的预测结果要好很多,但是感觉还是没有达到训练的准确率>98%(虽然测试数据只有这几个),还要继续努力…
单看目前的结果还是可以看出CNN比MLP的泛化能力要强。
学习中…
总结
keras还是很容易上手的,文档写得清晰明了,深度学习库的结构也清晰,功能强大,以tensorflow作为后端进行包装,灵活,但是感觉较慢。keras库集成的CIFAR10、IMDB、MNIST、BOSTON房屋价格等数据集挺好用,以及有预训练好的架构模型可以用。刚刚接触,还要继续学习…
先定个目标万一实现了呢
星期四, 04. 五月 2017 09:46上午
参考内容
博客1
博客2