iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 22
0
自我挑戰組

Tensorflow學習日記系列 第 22

tensorflow學習日記Day22 CNN卷積神經網路實作

  • 分享至 

  • xImage
  •  

input:
from keras.datasets import mnist
from keras.utils import np_utils
import numpy as np
np.random.seed(10)

output:
Using TensorFlow backend.

#資料預處理
input:
(x_Train,y_Train),(x_Test,y_Test)=mnist.load_data()#讀取資料
#下兩行將資料改為四維陣列(6000x28x28x1)
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
#下兩行將真實值以OneHot encoding轉換
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,Dropout,Flatten,Conv2D,MaxPooling2D
#建立線性堆疊模型
model = Sequential()
#建立卷積層1號
model.add(Conv2D(filters=16,#建立16個濾鏡filter weight
kernel_size=(5,5),#濾鏡大小為5x5
padding='same',#這一行讓影像大小不受卷積影像
input_shape=(28,28,1),#輸入影像為28x28(28,28)且是單色灰階影像(1)
activation='relu'))#激活函數為relu
#建立池化層1號
model.add(MaxPooling2D(pool_size=(2,2)))#28x28的影像會變成二分之一(16x16)
#建立卷積層2號
model.add(Conv2D(filters=36,
kernel_size=(5,5),
padding='same',
activation='relu',
))
#建立池化層2號
model.add(MaxPooling2D(pool_size=(2,2)))
#加入dropout避免overfitting
model.add(Dropout(0.25))#這邊會隨機放棄25%的神經元
#建立平坦層
model.add(Flatten())
#建立隱藏層
model.add(Dense(128,activation='relu'))
#加入dropout避免overfitting
model.add(Dropout(0.5))
#建立輸出層
model.add(Dense(10,activation='softmax'))
#輸出模型摘要
print(model.summary())
output:
https://scontent.ftpe8-2.fna.fbcdn.net/v/t1.15752-9/72819662_560973981314247_8851040278287482880_n.png?_nc_cat=103&_nc_oc=AQlkeSyIwJrnuUcveginBthHRZPvOiTnarxU8wOhXr_wf5IP_UfmZibm52FgTnZGOOs&_nc_ht=scontent.ftpe8-2.fna&oh=d0e46697c20810703d0f60dff0fc96f5&oe=5E35918B

#開始訓練
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=300,
verbose=2
)
output:
https://scontent.ftpe8-2.fna.fbcdn.net/v/t1.15752-9/72352224_527334987811711_7585441633814970368_n.png?_nc_cat=101&_nc_oc=AQnksLj7lZVjzVgQLtOLTp28jwO-oxMQbSGzix_pvIBPsa8IZ8SHmtT0b4G1MgCF2Zk&_nc_ht=scontent.ftpe8-2.fna&oh=b3d0aa5d6c5016fdaa61495e03776fa1&oe=5E3AC188

#建立show_train_history
import matplotlib.pyplot as plt#定義show_train_history(之前訓練產生的)(train_history,訓練執行結果,驗證資料執行結果)
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(train)#顯示y軸標籤
plt.xlabel('Epoch')#設定x軸標籤是'Epoch'
plt.legend(['train','validation'],loc='upper left')#設定圖例顯示'train','validation'在左上角
plt.show()

#畫出accuracy
show_train_history(train_history,'accuracy','val_accuracy')
https://scontent.ftpe8-1.fna.fbcdn.net/v/t1.15752-9/71719183_2374876256057472_1006016456099364864_n.png?_nc_cat=109&_nc_oc=AQmIRDBbUh-KRzHI7ulutpmPZrpQCMYbqM6N-iKNb-Ff6CUVA5cXADTz71EQ0TaXsv8&_nc_ht=scontent.ftpe8-1.fna&oh=a3ed92a0f334841ebe4bbe9ba660b29a&oe=5E2CCB92
#畫出loss
show_train_history(train_history,'loss','val_loss')
https://scontent.ftpe8-2.fna.fbcdn.net/v/t1.15752-9/72218374_2487120161379646_2389536369736155136_n.png?_nc_cat=103&_nc_oc=AQlGVmA49Md6SImKL74lArIZoav3E94CmM3O-0E5DgtQ4VQ6EDMOylaLOIKdLjj1hho&_nc_ht=scontent.ftpe8-2.fna&oh=2ac968fe8b6ee509f666a2335fe7396c&oe=5E1AE9DF

#顯示準確率
input:
scores=model.evaluate(x_Test4D_normalize,y_TestOneHot)
scores[1]
output:
10000/10000 [==============================] - 2s 216us/step
0.9912999868392944#準確率為0.99
#進行預測
prediction=model.predict_classes(x_Test4D_normalize)
prediction[:10]#顯示前十筆結果
output:
array([7, 2, 1, 0, 4, 1, 4, 9, 5, 9])

#建立plot_images_labels_prediction顯示圖片
def plot_images_labels_prediction(images,labels,prediction,idx,num=10):
#設定顯示圖片大小
fig=plt.gcf()
fig.set_size_inches(12,4)
#假如顯示比數超過25,設定為25以免發生錯誤
if num>25:num=25
for i in range(0,num):
ax=plt.subplot(5,5,1+i)#建立subgraph子圖形為5x5
ax.imshow(images[idx],cmap='binary')#畫出子圖形
title="label="+str(labels[idx])#設定子圖形的title,顯示標籤欄位
if len(prediction)>0:#如果有傳入預測結果
title+=",predict="+str(prediction[idx])#標題title加入預測結果
ax.set_title(title,fontsize=10)#設定子圖形的標題title和大小
ax.set_xticks([]);ax.set_yticks([])#設定為不顯示刻度
idx+=1#讀下一筆
plt.show()
#顯示前十筆資料的圖
plot_images_labels_prediction(x_Test,y_Test,prediction,idx=0)
https://scontent.ftpe8-3.fna.fbcdn.net/v/t1.15752-9/71685759_411429919567078_4991195281526620160_n.png?_nc_cat=106&_nc_oc=AQmfJBipaD5wggFsi4-hXUKWF_o-wWuY7jPNivy8mcBTlQvyqKhuey4jRoB1tY7m_h4&_nc_ht=scontent.ftpe8-3.fna&oh=10482671db3630eca319ab57d6058b7d&oe=5E1FE84D
#顯示混淆矩陣
import pandas as pd
pd.crosstab(y_Test,prediction,rownames=['label'],colnames=['predict'])
https://scontent.ftpe8-2.fna.fbcdn.net/v/t1.15752-9/71766557_1313818778769125_4018888692293697536_n.png?_nc_cat=100&_nc_oc=AQkE2dq-Js_WLXWPErInb_TtNp60geHbVuOlg7Wpg05pxcIDYEMWCKxIUincG34oajo&_nc_ht=scontent.ftpe8-2.fna&oh=31b23f7870e58761e33192290993d999&oe=5E265104

可以看到準確率比MLP高


上一篇
tensorflow學習日記Day21 什麼是CNN卷積神經網路
下一篇
tensorflow學習日記Day23 OneHot encoding
系列文
Tensorflow學習日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言