數據增強、模型訓練+保存+預測

說明

  1. 在前一個案例中,我們構建了CNN網絡模型,此架構的設計目的在于識別圖像中的重要特征,因而它極大提高了模型的性能。但我們的驗證準確率仍落后于訓練準確率,這意味著我們的模型依然有點過擬合。
  2. 為了增強模型在處理新數據時的魯棒性,我們將以編程方式增加數據集的大小和差異。這稱為數據增強,是對很多深度學習應用都非常有用的技術。
  3. 數據的增加讓模型在訓練時能看到更多圖像。數據差異的增加可幫助模型忽略不重要的特征,而只選擇在分類時真正重要的特征。如此一來,在面對新數據時,模型有望在進行預測時更好地泛化。

模型訓練+保存+預測

  1. 載入數據
    數據載入與處理
  2. 搭建模型
    搭建CNN網絡
  3. 數據增強(通過認為差異化數據、增加噪聲,一方面能夠預防過擬合,另一方面能夠提升模型魯棒性)
    數據增強
  4. 數據擬合與模型編譯
    編譯
  5. 模型訓練(驗證集上的精度幾乎與訓練集上的一樣,表明該模型的性能優異)
    模型訓練
  6. 模型保存(這一步會將模型保存到本地,這個模型在本地是一個文件,可以將這個模型遷移到其他機器上進行預測)
    模型保存
  7. 載入模型并預測(這里假設在一臺新的計算機中載入了我們保存的模型)
    載入模型
  8. 載入并查看預測數據
    image.png
  9. 定義載入圖像的方法對圖像進行預處理
    預處理函數
  10. 測試樣本預測(到此,預測過程本質上已經結束)
    預測
  11. 對預測過程進行整理
  • 生成一個標簽與字母對應的字典
    字典
  • 定義一個預測函數
    預測函數
  • 實施預測


    預測b
  • 實施預測
    預測a

Code

## ============數據準備===========

import tensorflow.keras as keras
import pandas as pd

# Load in our data from CSV files
train_df = pd.read_csv("sign_mnist_train.csv")
valid_df = pd.read_csv("sign_mnist_valid.csv")

# Separate out our target values
y_train = train_df['label']
y_valid = valid_df['label']
del train_df['label']
del valid_df['label']

# Separate out our image vectors
x_train = train_df.values
x_valid = valid_df.values

# Turn our scalar targets into binary categories
num_classes = 24
y_train = keras.utils.to_categorical(y_train, num_classes)
y_valid = keras.utils.to_categorical(y_valid, num_classes)

# Normalize our image data
x_train = x_train / 255
x_valid = x_valid / 255

# Reshape the image data for the convolutional network
x_train = x_train.reshape(-1,28,28,1)
x_valid = x_valid.reshape(-1,28,28,1)

## =============構建模型==================

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import (
    Dense,
    Conv2D,
    MaxPool2D,
    Flatten,
    Dropout,
    BatchNormalization,
)

model = Sequential()
model.add(Conv2D(75, (3, 3), strides=1, padding="same", activation="relu", 
                 input_shape=(28, 28, 1)))
model.add(BatchNormalization())
model.add(MaxPool2D((2, 2), strides=2, padding="same"))
model.add(Conv2D(50, (3, 3), strides=1, padding="same", activation="relu"))
model.add(Dropout(0.2))
model.add(BatchNormalization())
model.add(MaxPool2D((2, 2), strides=2, padding="same"))
model.add(Conv2D(25, (3, 3), strides=1, padding="same", activation="relu"))
model.add(BatchNormalization())
model.add(MaxPool2D((2, 2), strides=2, padding="same"))
model.add(Flatten())
model.add(Dense(units=512, activation="relu"))
model.add(Dropout(0.3))
model.add(Dense(units=num_classes, activation="softmax"))

## ===========數據增強===========

from tensorflow.keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(
        rotation_range=10,  # randomly rotate images in the range (degrees, 0 to 180)   # 隨機選擇一個角度
        zoom_range = 0.1, # Randomly zoom image             # 隨機變焦圖像
        width_shift_range=0.1,  # randomly shift images horizontally (fraction of total width)  # 隨機水平平移
        height_shift_range=0.1,  # randomly shift images vertically (fraction of total height)  # 隨機垂直平移
        horizontal_flip=True,  # randomly flip images horizontally    # 允許水平翻轉,因為有左右手
        vertical_flip=False)  # Don't randomly flip images vertically  # 不允許垂直翻轉,因為垂直翻轉可能改變手勢的含義

## ==========將數據擬合到生成器===========
datagen.fit(x_train)

## =========模型編譯==========
model.compile(loss='categorical_crossentropy', metrics=['accuracy'])

## ===========使用增強數據進行模型訓練==========
"""
1.使用 Keras 圖像數據生成器時,模型的訓練略有不同:我們不將 x_train 和 y_train 數據集傳送至模型中,而是傳給生成器,并調用 flow 方法。
  這使得圖像在傳入模型以供訓練之前即可實時得到增強并存儲在內存中。
2.生成器可以提供無限量的數據,所以當我們使用它們來訓練我們的模型時,我們需要明確設置我們希望每次訓練運行多長時間。
  否則,生成器將產生無限多個增強圖像提供給模型,使得該次訓練可以無限期地進行下去。
3.我們使用名為steps_per_epoch的參數明確設置了每次訓練要運行多長時間。
  因為通常steps * batch_size = number_of_images_trained in an epoch,
  所以我們在這里將步數設置為等于非增量數據集的大小除以batch_size(默認值為32)。
"""

model.fit(datagen.flow(x_train,y_train, batch_size=32), # Default batch_size is 32. We set it here for clarity.
          epochs=20,
          steps_per_epoch=len(x_train)/32, # Run same number of steps we would if we were not using a generator.
          validation_data=(x_valid, y_valid))

# ========保存模型===========
model.save('asl_model')

## ============在(新環境)中載入模型==============
from tensorflow import keras
model = keras.models.load_model('asl_model')
## ===========方法定義=============
def show_image(image_path):
    image = mpimg.imread(image_path)
    plt.imshow(image)

def load_and_scale_image(image_path):
    image = image_utils.load_img(image_path, color_mode="grayscale", target_size=(28,28))
    return image

def alpha_dict():
    alpha="abcdefghiklmnopqrstuvwxy"
    dictionary = {}
    for i in range(24):
        dictionary[i] = alphabet[i]
    return dictionary

# 定義預測函數
def predict_letter(file_path):
    show_image(file_path)   # 查看原圖像
    image = load_and_scale_image(file_path)   # 載入圖像并縮放
    image = image_utils.img_to_array(image)  # 將樣本轉換成array
    image = image.reshape(1,28,28,1)         # 重塑樣本結構
    image = image/255                        # 歸一化
    prediction = model.predict(image)        # 預測
    # convert prediction to letter
    dictionary = alpha_dict()
    predicted_letter = dictionary[np.argmax(prediction)]
    return predicted_letter

# 預測b.png這張圖片對應的字母
predict_letter("b.png")
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,179評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,628評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,444評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,948評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,185評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,717評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,794評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,414評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,750評論 2 370

推薦閱讀更多精彩內容