import tensorflow as tf
F:\Anaconda3\envs\tensorflow-gpu\lib\site-packages\h5py\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
from ._conv import register_converters as _register_converters
tf.__version__
'1.10.0'
import keras
keras.__version__
Using TensorFlow backend.
'2.2.2'
import numpy as np
import pandas as pd
from keras.utils import np_utils
np.random.seed(10)
from keras.datasets import mnist
mnist.load_data()
((array([[[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0]]], dtype=uint8),
array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)))
(x_Train, y_Train), (x_Test, y_Test) = mnist.load_data()
x_Train4D=x_Train.reshape(x_Train.shape[0],784).astype('float32')
x_Test4D=x_Test.reshape(x_Test.shape[0],784).astype('float32')
x_Train4D_normalize = x_Train4D / 255
x_Test4D_normalize = x_Test4D / 255
y_TrainOneHot = np_utils.to_categorical(y_Train)
y_TestOneHot = np_utils.to_categorical(y_Test)
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
model = Sequential()
model.add(Dense(units=1000, input_dim=784, kernel_initializer='normal', activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(units=1000, kernel_initializer='normal', activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(units=10, kernel_initializer='normal', activation='softmax'))
print(model.summary())
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_1 (Dense) (None, 1000) 785000
_________________________________________________________________
dropout_1 (Dropout) (None, 1000) 0
_________________________________________________________________
dense_2 (Dense) (None, 1000) 1001000
_________________________________________________________________
dropout_2 (Dropout) (None, 1000) 0
_________________________________________________________________
dense_3 (Dense) (None, 10) 10010
=================================================================
Total params: 1,796,010
Trainable params: 1,796,010
Non-trainable params: 0
_________________________________________________________________
None
model.compile(loss='categorical_crossentropy',
optimizer='adam',metrics=['accuracy'])
train_history=model.fit(x=x_Train4D_normalize,
y=y_TrainOneHot,validation_split=0.2,
epochs=10, batch_size=200,verbose=2)
Train on 48000 samples, validate on 12000 samples
Epoch 1/10
- 15s - loss: 0.3684 - acc: 0.8844 - val_loss: 0.1362 - val_acc: 0.9611
Epoch 2/10
- 2s - loss: 0.1580 - acc: 0.9519 - val_loss: 0.0988 - val_acc: 0.9706
Epoch 3/10
- 2s - loss: 0.1172 - acc: 0.9637 - val_loss: 0.0900 - val_acc: 0.9727
Epoch 4/10
- 2s - loss: 0.0996 - acc: 0.9695 - val_loss: 0.0858 - val_acc: 0.9733
Epoch 5/10
- 2s - loss: 0.0845 - acc: 0.9734 - val_loss: 0.0859 - val_acc: 0.9750
Epoch 6/10
- 2s - loss: 0.0740 - acc: 0.9765 - val_loss: 0.0756 - val_acc: 0.9778
Epoch 7/10
- 2s - loss: 0.0653 - acc: 0.9781 - val_loss: 0.0760 - val_acc: 0.9785
Epoch 8/10
- 2s - loss: 0.0609 - acc: 0.9810 - val_loss: 0.0807 - val_acc: 0.9788
Epoch 9/10
- 2s - loss: 0.0570 - acc: 0.9813 - val_loss: 0.0693 - val_acc: 0.9804
Epoch 10/10
- 2s - loss: 0.0521 - acc: 0.9829 - val_loss: 0.0799 - val_acc: 0.9787
scores = model.evaluate(x_Test4D_normalize, y_TestOneHot)
print()
print('acc='+str(scores[1]))
10000/10000 [==============================] - 0s 40us/step
acc=0.9799
import matplotlib.pyplot as plt
def show_train_history(train_history, train, validation):
plt.plot(train_history.history[train])
plt.plot(train_history.history[validation])
plt.title('Train History')
plt.ylabel('acc')
plt.xlabel('Epoch')
plt.legend(['train', 'validation'], loc='upper left')
plt.show()
show_train_history(train_history, 'acc', 'val_acc')
from keras.utils import np_utils
import numpy as np
from keras.datasets import mnist
np.random.seed(10)
(x_Train, y_Train), (x_Test, y_Test) = mnist.load_data()
x_Train4D=x_Train.reshape(x_Train.shape[0], 28, 28, 1).astype('float32')
x_Test4D=x_Test.reshape(x_Test.shape[0], 28, 28, 1).astype('float32')
x_Train4D_normalize = x_Train4D / 255
x_Test4D_normalize = x_Test4D / 255
y_TrainOneHot = np_utils.to_categorical(y_Train)
y_TestOneHot = np_utils.to_categorical(y_Test)
F:\Anaconda3\envs\tensorflow-gpu\lib\site-packages\h5py\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
from ._conv import register_converters as _register_converters
Using TensorFlow backend.
print(x_Train[:1].shape)
print(x_Test[:1].shape)
print(x_Train4D[:1].shape)
(1, 28, 28)
(1, 28, 28)
(1, 28, 28, 1)
print(x_Train[:1])
print(x_Train4D[:1])
from keras.layers import Dense,Dropout,Flatten,Conv2D,MaxPooling2D
model_rnn = Sequential()
model_rnn.add(Conv2D(filters=16,
kernel_size=(5,5),
padding='same',
input_shape=(28,28,1),
activation='relu'))
model_rnn.add(MaxPooling2D(pool_size=(2, 2)))
model_rnn.add(Conv2D(filters=36,
kernel_size=(5,5),
padding='same',
activation='relu'))
model_rnn.add(MaxPooling2D(pool_size=(2, 2)))
model_rnn.add(Dropout(0.25))
model_rnn.add(Flatten())
model_rnn.add(Dense(128, activation='relu'))
model_rnn.add(Dropout(0.5))
model_rnn.add(Dense(10,activation='softmax'))
print(model_rnn.summary())
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_1 (Conv2D) (None, 28, 28, 16) 416
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 14, 14, 16) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 14, 14, 36) 14436
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 7, 7, 36) 0
_________________________________________________________________
dropout_3 (Dropout) (None, 7, 7, 36) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 1764) 0
_________________________________________________________________
dense_5 (Dense) (None, 128) 225920
_________________________________________________________________
dropout_4 (Dropout) (None, 128) 0
_________________________________________________________________
dense_6 (Dense) (None, 10) 1290
=================================================================
Total params: 242,062
Trainable params: 242,062
Non-trainable params: 0
_________________________________________________________________
None
model_rnn.compile(loss='categorical_crossentropy',
optimizer='adam',metrics=['accuracy'])
train_history=model_rnn.fit(x=x_Train4D_normalize,
y=y_TrainOneHot,validation_split=0.2,
epochs=20, batch_size=300,verbose=2)
Train on 48000 samples, validate on 12000 samples
Epoch 1/20
- 6s - loss: 0.5052 - acc: 0.8405 - val_loss: 0.1111 - val_acc: 0.9664
Epoch 2/20
- 2s - loss: 0.1513 - acc: 0.9545 - val_loss: 0.0783 - val_acc: 0.9761
Epoch 3/20
- 2s - loss: 0.1092 - acc: 0.9674 - val_loss: 0.0558 - val_acc: 0.9826
Epoch 4/20
- 2s - loss: 0.0897 - acc: 0.9725 - val_loss: 0.0521 - val_acc: 0.9844
Epoch 5/20
- 2s - loss: 0.0769 - acc: 0.9767 - val_loss: 0.0465 - val_acc: 0.9863
Epoch 6/20
- 2s - loss: 0.0683 - acc: 0.9799 - val_loss: 0.0423 - val_acc: 0.9876
Epoch 7/20
- 2s - loss: 0.0632 - acc: 0.9814 - val_loss: 0.0408 - val_acc: 0.9891
Epoch 8/20
- 2s - loss: 0.0539 - acc: 0.9832 - val_loss: 0.0413 - val_acc: 0.9888
Epoch 9/20
- 2s - loss: 0.0498 - acc: 0.9852 - val_loss: 0.0362 - val_acc: 0.9897
Epoch 10/20
- 2s - loss: 0.0443 - acc: 0.9864 - val_loss: 0.0360 - val_acc: 0.9901
Epoch 11/20
- 2s - loss: 0.0444 - acc: 0.9865 - val_loss: 0.0346 - val_acc: 0.9908
Epoch 12/20
- 2s - loss: 0.0415 - acc: 0.9873 - val_loss: 0.0315 - val_acc: 0.9915
Epoch 13/20
- 2s - loss: 0.0367 - acc: 0.9882 - val_loss: 0.0359 - val_acc: 0.9902
Epoch 14/20
- 2s - loss: 0.0358 - acc: 0.9883 - val_loss: 0.0324 - val_acc: 0.9905
Epoch 15/20
- 2s - loss: 0.0332 - acc: 0.9899 - val_loss: 0.0330 - val_acc: 0.9917
Epoch 16/20
- 2s - loss: 0.0312 - acc: 0.9898 - val_loss: 0.0321 - val_acc: 0.9913
Epoch 17/20
- 2s - loss: 0.0297 - acc: 0.9903 - val_loss: 0.0304 - val_acc: 0.9921
Epoch 18/20
- 2s - loss: 0.0288 - acc: 0.9911 - val_loss: 0.0303 - val_acc: 0.9917
Epoch 19/20
- 2s - loss: 0.0252 - acc: 0.9915 - val_loss: 0.0315 - val_acc: 0.9920
Epoch 20/20
- 2s - loss: 0.0258 - acc: 0.9916 - val_loss: 0.0299 - val_acc: 0.9926
scores = model_rnn.evaluate(x_Test4D_normalize, y_TestOneHot)
print()
print('acc='+str(scores[1]))
10000/10000 [==============================] - 1s 125us/step
acc=0.9919
show_train_history(train_history, 'acc', 'val_acc')
print(scores)
[0.023901841590534968, 0.9919]
show_train_history(train_history, 'loss', 'val_loss')
预测
print(x_Test4D_normalize[:1].shape)
print(model_rnn.predict_classes(x_Test4D_normalize[:1]))
print(y_Test[:1])
(1, 28, 28, 1)
[7]
[7]
prediction=model_rnn.predict_classes(x_Test4D_normalize)
import matplotlib.pyplot as plt
def plot_images_labels_prediction(images,labels,prediction,idx,num=10):
fig = plt.gcf()
fig.set_size_inches(12, 14)
if num>25: num=25
for i in range(0, num):
ax=plt.subplot(5,5, 1+i)
ax.imshow(images[idx], cmap='binary')
ax.set_title("label=" +str(labels[idx])+
",predict="+str(prediction[idx])
,fontsize=10)
ax.set_xticks([]);ax.set_yticks([])
idx+=1
plt.show()
plot_images_labels_prediction(x_Test,y_Test,prediction,idx=0)
import pandas as pd
pd.crosstab(y_Test,prediction,
rownames=['label'],colnames=['predict'])
predict |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
label |
|
|
|
|
|
|
|
|
|
|
0 |
976 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
2 |
0 |
1 |
0 |
1132 |
3 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
2 |
1 |
1 |
1029 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
3 |
0 |
0 |
1 |
1000 |
0 |
5 |
0 |
1 |
2 |
1 |
4 |
0 |
0 |
1 |
0 |
976 |
0 |
0 |
1 |
2 |
2 |
5 |
1 |
0 |
0 |
4 |
0 |
884 |
2 |
1 |
0 |
0 |
6 |
4 |
2 |
1 |
0 |
3 |
1 |
947 |
0 |
0 |
0 |
7 |
0 |
2 |
3 |
0 |
0 |
0 |
0 |
1021 |
1 |
1 |
8 |
2 |
1 |
1 |
1 |
1 |
0 |
1 |
0 |
963 |
4 |
9 |
1 |
3 |
0 |
0 |
4 |
4 |
0 |
5 |
1 |
991 |
模型保存与加载
model_rnn.save_weights("drguo_model/cnn_mnist.h5")
print("save model to drguo_model")
save model to drguo_model
from keras.models import Sequential
from keras.layers import Dense,Dropout,Flatten,Conv2D,MaxPooling2D
load_model = Sequential()
load_model.add(Conv2D(filters=16,
kernel_size=(5,5),
padding='same',
input_shape=(28,28,1),
activation='relu'))
load_model.add(MaxPooling2D(pool_size=(2, 2)))
load_model.add(Conv2D(filters=36,
kernel_size=(5,5),
padding='same',
activation='relu'))
load_model.add(MaxPooling2D(pool_size=(2, 2)))
load_model.add(Dropout(0.25))
load_model.add(Flatten())
load_model.add(Dense(128, activation='relu'))
load_model.add(Dropout(0.5))
load_model.add(Dense(10,activation='softmax'))
load_model.compile(loss='categorical_crossentropy',
optimizer='adam',metrics=['accuracy'])
try:
load_model.load_weights("drguo_model/cnn_mnist.h5")
print("model load success!")
except:
print("model load fail!")
model load success!
print(load_model.predict_classes(x_Test4D_normalize[:1]))
[7]
train_history=load_model.fit(x=x_Train4D_normalize,
y=y_TrainOneHot,validation_split=0.2,
epochs=10, batch_size=300,verbose=2)
Train on 48000 samples, validate on 12000 samples
Epoch 1/10
- 3s - loss: 0.0254 - acc: 0.9916 - val_loss: 0.0353 - val_acc: 0.9914
Epoch 2/10
- 2s - loss: 0.0243 - acc: 0.9921 - val_loss: 0.0309 - val_acc: 0.9923
Epoch 3/10
- 2s - loss: 0.0220 - acc: 0.9925 - val_loss: 0.0317 - val_acc: 0.9919
Epoch 4/10
- 2s - loss: 0.0237 - acc: 0.9918 - val_loss: 0.0291 - val_acc: 0.9928
Epoch 5/10
- 2s - loss: 0.0207 - acc: 0.9933 - val_loss: 0.0337 - val_acc: 0.9923
Epoch 6/10
- 2s - loss: 0.0203 - acc: 0.9937 - val_loss: 0.0297 - val_acc: 0.9928
Epoch 7/10
- 2s - loss: 0.0177 - acc: 0.9941 - val_loss: 0.0334 - val_acc: 0.9927
Epoch 8/10
- 2s - loss: 0.0192 - acc: 0.9936 - val_loss: 0.0328 - val_acc: 0.9912
Epoch 9/10
- 2s - loss: 0.0171 - acc: 0.9943 - val_loss: 0.0279 - val_acc: 0.9934
Epoch 10/10
- 2s - loss: 0.0160 - acc: 0.9946 - val_loss: 0.0280 - val_acc: 0.9927
load_model.save_weights("drguo_model/cnn_mnist.h5")
print("save weights to drguo_model")
save model to drguo_model
show_train_history(train_history, 'acc', 'val_acc')
load_model.save("drguo_model/cnn_mnist_model.h5")
print("save model to drguo_model")
save model to drguo_model
!jupyter nbconvert --to markdown "keras_gpu.ipynb"