摘要:看動畫也不忘機器學習這個項目在后端為上實現(xiàn)用神經(jīng)網(wǎng)絡根據(jù)動畫片截圖對辛普森一家的成員進行分類,使用的是目前最復雜和艱深的神經(jīng)網(wǎng)絡之一卷積神經(jīng)網(wǎng)絡,。數(shù)據(jù)集為個辛普森家族的成員的動畫片截圖,存放在個文件夾中,每個成員有大約張圖片。
看動畫也不忘機器學習?( ?? ω ?? )y:
這個項目在Keras(后端為Tensorflow)上實現(xiàn)用神經(jīng)網(wǎng)絡根據(jù)動畫片截圖對辛普森一家的成員進行分類,使用的是目前最復雜和艱深的神經(jīng)網(wǎng)絡之一:卷積神經(jīng)網(wǎng)絡(Convolutional Neural Network,CNN)。
數(shù)據(jù)集為11個辛普森家族的成員的動畫片截圖,存放在11個文件夾中,每個成員有大約1000張圖片。
這些圖片有不一樣的尺寸,在進過歸一化后和標簽一起輸入神經(jīng)網(wǎng)絡進行訓練
由于這次圖像識別訓練直接用的圖片,因此該程序?qū)嶋H上可以用來做很多事情(驗證碼識別,智能交通領域的機器視覺,行人和車輛識別),只需更換文件夾路徑,指向新的數(shù)據(jù)集即可。
直接上代碼:
導入依賴庫:
from PIL import Image import numpy as np import os import glob import re import keras from keras.optimizers import SGD, Adam from keras.models import Sequential from keras.models import load_model from keras.layers import Dense, Dropout, Activation, Flatten from keras.layers import Conv2D, MaxPooling2D from keras.utils import np_utils from keras import backend as K
*定義函數(shù):從數(shù)據(jù)集中導入圖片,歸一化后再轉(zhuǎn)化為特征矩陣:
每個文件夾中取前100張圖片的數(shù)據(jù)放到測試集,剩余的樣本全都作為訓練集。*
def read_img(location): x_train = [] y_train = [] x_test = [] y_test = [] label_name = [] dirs = os.listdir(location) label = 0 count = 0 for i in dirs: #loop all directory print(i) n = 0 label_name.append(i) #save folder name in var label_name x_s = 200 y_s = 200 for pic in glob.glob(location+""+i+"*.jpg"): im = Image.open(pic) #open data im = im.resize((x_s, y_s), Image.ANTIALIAS) im = np.array(im) #store im as numpy array if(im.shape[0]==200 and im.shape[1]==200): r = im[:,:,0] g = im[:,:,1] b = im[:,:,2] if(n<100): x_test.append([r,g,b]) #save in x_test y_test.append([label]) #save in y_test else: #remaining data set as training data x_train.append([r,g,b]) #save in x_train y_train.append([label]) #save in y_train n = n + 1 count = count + 1 label = label + 1 #increment label print(label_name) print(dirs) return np.array(x_train),np.array(y_train),np.array(x_test),np.array(y_test)
將圖片經(jīng)過歸一化處理,變?yōu)?00p200p的尺寸:*
原圖:
歸一化的圖片:
通過定義的函數(shù)生成訓練數(shù)據(jù)、訓練標簽、測試數(shù)據(jù)、測試標簽:
path="E:JLDdesktop he-simpsons-characters-datasetsimpsons_dataset" img_rows = 200 #num of image height img_cols = 200 #num of image width num_class = 11 #num of classes/labels x_train,y_train,x_test,y_test = read_img(path)
輸出的結(jié)果:完成對11個文件夾的遍歷,并輸出訓練標簽向量和測試標簽向量:
對訓練數(shù)據(jù)和測試數(shù)據(jù)的值做線性變化,提高機器學習的速率,并將標簽轉(zhuǎn)化為向量,以便用交叉熵計算loss值:
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 3) x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 3) input_shape = (img_rows, img_cols, 3) x_train = x_train.astype("float32") x_test = x_test.astype("float32") x_train /= 255 x_test /= 255 y_train = keras.utils.to_categorical(y_train, num_class) y_test = keras.utils.to_categorical(y_test, num_class)
輸出訓練訓練特征矩陣、訓練標簽向量、測試特征矩陣、測試標簽向量的維度:
print(x_train.shape) print(y_train.shape) print(x_test.shape) print(y_test.shape)
運行結(jié)果:
定義CNN神經(jīng)網(wǎng)絡模型:
model = Sequential() model.add(Conv2D(64, kernel_size=(3, 3),activation="relu",input_shape=input_shape)) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Conv2D(32, (3, 3), activation="relu")) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Dropout(0.25)) model.add(Conv2D(32, (3, 3), activation="relu")) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128, activation="relu")) model.add(Dropout(0.5)) model.add(Dense(num_class, activation="softmax"))
編譯模型:用交叉熵作為損失值,隨機梯度下降作為優(yōu)化器,預測的準確率用以定義模型的好壞。
model.compile(loss="categorical_crossentropy", optimizer=SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True), metrics=["accuracy"])
訓一次模型并保存:模型一個批次處理64個樣本,迭代1次,用測試集數(shù)據(jù)做驗證。
model.fit(x_train, y_train, batch_size=64, epochs=1, verbose=1, validation_data=(x_test, y_test)) model.save("Simpson.h5")
循環(huán)進行模型訓練,每一次循環(huán)迭代一次訓練,保存并讀取模型,循環(huán)十次,這樣寫是因為避免顯存溢出導致之前所有訓練結(jié)果丟失。該語句可重復運行。機器學習,俗稱“煉丹”:
for i in range(0,10): print("The "+str(i)+" th Iteration") model=load_model("Simpson.h5") model.fit(x_train, y_train, batch_size=64, epochs=1, verbose=1, validation_data=(x_test, y_test)) model.save("Simpson.h5") K.clear_session()
運行結(jié)果:該模型在測試集上最終達到了99.09%的準確率。
若要用該模型進行識別應用,只需調(diào)用model.predict()函數(shù)就行。
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/40775.html
摘要:為的內(nèi)置一個方法,用法和原生的事件機制一毛一樣。 前言 上兩篇Mvvm教程的熱度超出我的預期,很多碼友留言表揚同時希望我繼續(xù)出下一篇教程,當時我也半開玩笑說只要點贊超10就兌現(xiàn)承諾,沒想到還真破了10,所以就有了今天的文章。 準備工作 熟讀 【教學向】150行代碼教你實現(xiàn)一個低配版的MVVM庫(1)- 原理篇【教學向】150行代碼教你實現(xiàn)一個低配版的MVVM庫(2)- 代碼篇 本篇是在...
摘要:模塊則負責維護,以及各個模塊間的調(diào)度思考題了解了的實現(xiàn)機制,你能否自己動手也試著用百來行代碼實現(xiàn)一個庫呢好了本教程第一部分設計篇就寫到這里,具體請移步下一篇教學向行代碼教你實現(xiàn)一個低配版的庫代碼篇我會用給出一版實現(xiàn)。 適讀人群 本文適合對MVVM有一定了解(如有主流框架ng,vue等使用經(jīng)驗配合本文服用則效果更佳),雖然會用這類框架,但是對框架底層核心實現(xiàn)又不太清楚,或者能說出個所以然...
摘要:導言最近發(fā)掘了一個特別的網(wǎng)頁小游戲。于是第二天我就繼續(xù)沉迷,隨著一陣抽搐,這個游戲索然無味之后,冷靜的我決定用和開發(fā)出一個低配版。我的低配版在交互操作比較高的情況下,還是比較卡的,沒有原網(wǎng)頁的流暢性,可能后續(xù)考慮版本實現(xiàn)。 導言 最近發(fā)掘了一個特別happy的網(wǎng)頁小游戲--MikuTap。打開之后沉迷了一下午,導致開發(fā)工作沒做完差點就要刪庫跑路了,還好boss瞥了我一眼就沒下文了。于是...
閱讀 564·2023-04-25 16:00
閱讀 1598·2019-08-26 13:54
閱讀 2496·2019-08-26 13:47
閱讀 3402·2019-08-26 13:39
閱讀 1037·2019-08-26 13:37
閱讀 2734·2019-08-26 10:21
閱讀 3534·2019-08-23 18:19
閱讀 1601·2019-08-23 18:02