查看数据
from tensorflow.keras.datasets import mnist
import matplotlib.pyplot as plt
(train_x,train_y),(test_x,test_Y)=mnist.load_data()
plt.figure(figsize=(10, 10))
for i in range(25):
plt.subplot(5, 5, i+1 )
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(train_x[i], cmap=plt.cm.binary)
plt.xlabel(train_y[i])
plt.show()
处理数据 数据归一化
train_x=train_x.reshape((-1,28,28,1))/255.0
test_x=test_x.reshape((-1,28,28,1))/255.0
使用全连接model
import tensorflow as tf
from tensorflow.python.keras.utils import multi_gpu_model
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation=tf.nn.relu),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
#model=multi_gpu_model(model,gpus=2)
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
history=model.fit(train_x, train_y, epochs=5,batch_size=64,validation_data=(test_x,test_Y))
print(history.history)
Train on 60000 samples, validate on 10000 samples
Epoch 1/5
60000/60000 [==============================] - 3s 44us/step - loss: 0.2453 - acc: 0.9292 - val_loss: 0.1210 - val_acc: 0.9645
Epoch 2/5
60000/60000 [==============================] - 2s 39us/step - loss: 0.1045 - acc: 0.9685 - val_loss: 0.0873 - val_acc: 0.9742
Epoch 3/5
60000/60000 [==============================] - 2s 39us/step - loss: 0.0734 - acc: 0.9772 - val_loss: 0.0760 - val_acc: 0.9754
Epoch 4/5
60000/60000 [==============================] - 2s 39us/step - loss: 0.0544 - acc: 0.9827 - val_loss: 0.0626 - val_acc: 0.9808
Epoch 5/5
60000/60000 [==============================] - 2s 39us/step - loss: 0.0431 - acc: 0.9865 - val_loss: 0.0606 - val_acc: 0.9809
{'val_loss': [0.12101827680170536, 0.08727486125305295, 0.07602117696609348, 0.06258633336527274, 0.06062790886806324], 'val_acc': [0.9645, 0.9742, 0.9754, 0.9808, 0.9809], 'loss': [0.24529895100792248, 0.10447835950454076, 0.07340832727799813, 0.05438600577091177, 0.04305711637934049], 'acc': [0.9291833333333334, 0.96845, 0.9772, 0.9827166666666667, 0.9864833333333334]}
卷积神经网络model
import tensorflow as tf
from tensorflow.python.keras.utils import multi_gpu_model
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32, kernel_size=(5, 5), input_shape=(28, 28, 1),activation='relu',name='conv2d-32'),
tf.keras.layers.MaxPool2D(strides=(2, 2),name='MaxPool2D-32'),
tf.keras.layers.Conv2D(64, kernel_size=(5, 5),activation='relu',name='Conv2D-64'),
tf.keras.layers.MaxPool2D(strides=(2, 2),name='MaxPool2D-64'),
tf.keras.layers.Flatten(name='Flatten'),
tf.keras.layers.Dropout(0.5,name='Dropout'),
tf.keras.layers.Dense(10, activation='softmax',name='Dense-10')
])
model.summary()
model=multi_gpu_model(model,gpus=2)
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
history=model.fit(train_x, train_y, epochs=10,validation_data=(test_x,test_Y))
print(history.history)
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d-32 (Conv2D) (None, 24, 24, 32) 832
_________________________________________________________________
MaxPool2D-32 (MaxPooling2D) (None, 12, 12, 32) 0
_________________________________________________________________
Conv2D-64 (Conv2D) (None, 8, 8, 64) 51264
_________________________________________________________________
MaxPool2D-64 (MaxPooling2D) (None, 4, 4, 64) 0
_________________________________________________________________
Flatten (Flatten) (None, 1024) 0
_________________________________________________________________
Dropout (Dropout) (None, 1024) 0
_________________________________________________________________
Dense-10 (Dense) (None, 10) 10250
=================================================================
Total params: 62,346
Trainable params: 62,346
Non-trainable params: 0
_________________________________________________________________
Train on 60000 samples, validate on 10000 samples
Epoch 1/10
60000/60000 [==============================] - 10s 172us/step - loss: 0.1965 - acc: 0.9391 - val_loss: 0.0442 - val_acc: 0.9869
Epoch 2/10
60000/60000 [==============================] - 10s 160us/step - loss: 0.0712 - acc: 0.9780 - val_loss: 0.0314 - val_acc: 0.9904
Epoch 3/10
60000/60000 [==============================] - 10s 161us/step - loss: 0.0527 - acc: 0.9835 - val_loss: 0.0254 - val_acc: 0.9921
Epoch 4/10
60000/60000 [==============================] - 10s 161us/step - loss: 0.0439 - acc: 0.9862 - val_loss: 0.0216 - val_acc: 0.9928
Epoch 5/10
60000/60000 [==============================] - 10s 161us/step - loss: 0.0376 - acc: 0.9881 - val_loss: 0.0246 - val_acc: 0.9922
Epoch 6/10
60000/60000 [==============================] - 10s 160us/step - loss: 0.0353 - acc: 0.9888 - val_loss: 0.0188 - val_acc: 0.9937
Epoch 7/10
60000/60000 [==============================] - 10s 161us/step - loss: 0.0308 - acc: 0.9902 - val_loss: 0.0202 - val_acc: 0.9939
Epoch 8/10
60000/60000 [==============================] - 10s 161us/step - loss: 0.0291 - acc: 0.9911 - val_loss: 0.0235 - val_acc: 0.9923
Epoch 9/10
60000/60000 [==============================] - 10s 161us/step - loss: 0.0265 - acc: 0.9913 - val_loss: 0.0200 - val_acc: 0.9940
Epoch 10/10
60000/60000 [==============================] - 10s 161us/step - loss: 0.0259 - acc: 0.9917 - val_loss: 0.0228 - val_acc: 0.9918
{'val_loss': [0.04419064577044919, 0.031431237593130205, 0.025389306041694364, 0.02164296607077413, 0.024627994345039768, 0.01881986585248378, 0.02021861595758237, 0.023530831995893096, 0.020035049462070312, 0.022779195395996793], 'val_acc': [0.9869, 0.9904, 0.9921, 0.9928, 0.9922, 0.9937, 0.9939, 0.9923, 0.994, 0.9918], 'loss': [0.1964585481060048, 0.07116204217337072, 0.05266052842771945, 0.04390566666952024, 0.037550158609023006, 0.03534947692871792, 0.030789569879024446, 0.029085736439652586, 0.026527962450721924, 0.025876243178133154], 'acc': [0.9391166666666667, 0.97805, 0.9835, 0.9862166666666666, 0.9880666666666666, 0.9887666666666667, 0.9902, 0.9910833333333333, 0.99135, 0.9917333333333334]}
可视化model
from IPython.display import SVG
from tensorflow.python.keras.utils.vis_utils import model_to_dot
SVG(model_to_dot(model).create(prog='dot', format='svg'))
打印训练曲线
import matplotlib.pyplot as plt
history_dict = history.history
acc = history.history['acc']
loss = history.history['loss']
val_acc = history.history['val_acc']
val_loss = history.history['val_loss']
epochs = range(1, len(acc) + 1)
# "bo" is for "blue dot"
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Training val_loss')
# b is for "solid blue line"
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()
plt.clf() # clear figure
acc_values = history_dict['acc']
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Training val_acc')
plt.title('Training and validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show()
查看验证
import numpy as np
plt.figure(figsize=(10, 10))
p_label=np.argmax(model.predict(test_x[0:49]),axis=1)
p1_label=model.predict(test_x[0:49])
p_max_labels=np.max(p1_label, axis=1)
for i in range(49):
plt.subplot(7,7,i+1)
plt.imshow(test_x[i].reshape(28,28))
plt.xticks([])
plt.yticks([])
if p_label[i]==test_Y[i]:
color = 'blue'
else:
color = 'red'
plt.xlabel("{} {:2.1f}% ({})".format(p_label[i],
100 * p_max_labels[i],
test_Y[i]),color=color)
看看那些错了
p_label=np.argmax(model.predict(test_x),axis=1)
result=np.equal(p_label,test_Y)
index_wrong=np.where(result==False)
print(index_wrong)
x=test_x[index_wrong]
right_y=test_Y[index_wrong]
wrong_y=np.argmax(model.predict(x),axis=1)
wrong_max=np.max(model.predict(x), axis=1)
print(wrong_y)
print(len(right_y))
print(wrong_max)
plt.figure(figsize=(12, 12))
for i in range(49):
plt.subplot(7,7,i+1)
plt.imshow(x[i].reshape(28,28))
plt.xticks([])
plt.yticks([])
if wrong_y[i]==right_y[i]:
color = 'blue'
else:
color = 'red'
plt.xlabel("{} {:2.1f}% ({})".format(wrong_y[i],
100 * wrong_max[i],
right_y[i]),color=color)
(array([ 320, 340, 445, 449, 659, 684, 846, 947, 1014, 1039, 1112,
1138, 1226, 1232, 1242, 1247, 1260, 1522, 1621, 1709, 1901, 2035,
2070, 2130, 2293, 2329, 2414, 2447, 2462, 2488, 2597, 2654, 2770,
2896, 2927, 2939, 2995, 3030, 3225, 3384, 3422, 3520, 3534, 3558,
3730, 4027, 4176, 4400, 4731, 4761, 4807, 4814, 4823, 5937, 5997,
6172, 6569, 6576, 6597, 6625, 6651, 8408, 9015, 9642, 9664, 9679,
9698, 9729, 9770]),)
[8 3 0 5 1 2 9 9 5 1 6 1 2 4 9 5 1 9 6 5 4 3 9 9 6 2 4 9 0 4 3 1 5 0 2 5 8
0 9 6 0 4 8 0 9 1 7 1 2 8 0 0 4 3 9 5 2 1 7 2 8 5 2 7 7 2 5 6 0]
69
[0.5487968 0.7154917 0.9463902 0.95204204 0.6993093 0.61079836
0.9542614 0.789387 0.99403703 0.8320868 0.9761881 0.59718984
0.7508293 0.8380351 0.7072604 0.9447838 0.625205 0.66415906
0.5856947 0.95903456 0.85126615 0.9803823 0.6441936 0.9830293
0.7776802 0.8865479 0.7413854 0.5177151 0.71139973 0.7475217
0.9774415 0.9998882 0.7372158 0.9488201 0.6718568 0.8249474
0.5528 0.54504114 0.54805565 0.62762654 0.99735606 0.9991032
0.65194035 0.9706246 0.6190088 0.4959286 0.8655964 0.6018419
0.5978997 0.71149963 0.68390083 0.7572602 0.6328306 0.903725
0.5591738 0.5529782 0.6141367 0.96959394 0.6757054 0.54540163
0.9384903 0.4220014 0.6736965 0.5338367 0.58165085 0.41066182
0.47381133 0.9988312 0.58307064]