TensorFlow 是一個開放源代碼軟件庫,用于進行高性能數(shù)值計算。借助靈活的架構,用戶可以輕松地將計算工作部署到多種平臺(CPU、GPU、TPU)和設備(桌面設備、服務器集群、移動設備、邊緣設備等)。最近在 JS 社區(qū)中,對 TF 中 Java API 相關項目與技術的高度需求是前所未有的。
近日,TensorFlow 發(fā)表推文正式發(fā)布 TensorFlow v1.9 ,大家可以更新各自的代碼啦~~在 TF 的更新文檔中更新了 keras,包括一個新的基于keras的入門,一個非常適合初學者的Jupyter 筆記本,還增加了更多的實例。
其中有兩個案例受到了大家的廣泛關注,這個項目是通過 Colab 在 tf.keras 中訓練模型,并通過TensorFlow.js 在瀏覽器中運行;最近在 JS 社區(qū)中,對這些相關項目的高度需求是前所未有的。之前人工智能頭條也為大家介紹了一個在瀏覽器中通過TensorFlow.js 進行多人人臉識別與特征檢測的項目,也受到大家的廣泛關注。此外 TensorFlow 還給那些想了解、學習相關項目技術的關注者們推出了系列官方教學視頻。
今天人工智能頭條會帶領大家學習這個新項目,JS 愛好者和開發(fā)者們不要錯過!
另一個項目是簡單的RNN網絡生成文本的實踐,這次作者不僅在GitHub 上分享了源碼,大家還可以利用這次 v1.9 中的筆記本新功能來進行端到端的直接運行。
在 Google Colab 中看到這個項目的第一眼,就覺得真的很適合初學者研究學習。左側可以一目了然地看 “目錄” 與 “代碼段”。
已經分解的源碼結構,從安裝、導入需要的工具,到下載讀取數(shù)據(jù),創(chuàng)建訓練模型,最后預測模型,只要跟著一步一步來,相信大家都會學有所成。
▌TensorFlow v1.9 實踐
前言
在這個應用中我們將完成通過識別圖畫來輸出當前圖畫的名稱的實踐。使用 Google Colab 來訓練模型,使用 TensorFlow.js 在瀏覽器上進行部署,直接在瀏覽器上運行。需要注意的一點是,務必要在測試 Google Colab 的 notebook 工具:
https://colab.research.google.com/github/zaidalyafeai/zaidalyafeai.github.io/blob/master/sketcher/Sketcher.ipynb
數(shù)據(jù)集
我們將使用 CNN 來識別不同類型的圖畫。CNN 將在Quick Draw數(shù)據(jù)集上進行訓練。這個數(shù)據(jù)集包含了大約5000萬張、345類別的圖畫。
管道
我們將使用 Keras 在 Google Colab 上訓練模型,然后通過 TensorFlow.js (tfjs) 在瀏覽器上直接運行。下圖向大家展示了這個項目的管道圖
參考教程:
https://js.tensorflow.org/
https://github.com/tensorflow/tfjs-examples
輸入
我們將使用帶有tensorflow后端的keras:
importosimportglobimportnumpyasnpfromtensorflow.kerasimportlayersfromtensorflowimportkerasimporttensorflowastf
加載數(shù)據(jù)
由于內存有限,我們不會在所有的類別進行訓練。我們只使用100個類別的數(shù)據(jù)集。在Google Cloud 的quickdraw_dataset 上每個類別的數(shù)據(jù)都可以用形狀表示為[N,784]的numpy數(shù)組,其中N是該特定類的的圖像數(shù)量。我們首先下載數(shù)據(jù)集:
importurllib.requestdefdownload():base='https://storage.googleapis.com/quickdraw_dataset/full/numpy_bitmap/'forcinclasses:cls_url=c.replace('_','%20')path=base+cls_url+'.npy'print(path)urllib.request.urlretrieve(path,'data/'+c+'.npy')
由于內存有限,因此每個類只能加載5000個圖像到內存。另外還保留了20%的用于測試的數(shù)據(jù)。
defload_data(root,vfold_ratio=0.2,max_items_per_class=5000):all_files=glob.glob(os.path.join(root,'*.npy'))#initializevariablesx=np.empty([0,784])y=np.empty([0])class_names=[]#loadasubsetofthedatatomemoryforidx,fileinenumerate(all_files):data=np.load(file)data=data[0:max_items_per_class,:]labels=np.full(data.shape[0],idx)x=np.concatenate((x,data),axis=0)y=np.append(y,labels)class_name,ext=os.path.splitext(os.path.basename(file))class_names.append(class_name)data=Nonelabels=None#separateintotrainingandtestingpermutation=np.random.permutation(y.shape[0])x=x[permutation,:]y=y[permutation]vfold_size=int(x.shape[0]/100*(vfold_ratio*100))x_test=x[0:vfold_size,:]y_test=y[0:vfold_size]x_train=x[vfold_size:x.shape[0],:]y_train=y[vfold_size:y.shape[0]]returnx_train,y_train,x_test,y_test,class_names
預處理數(shù)據(jù)
我們對數(shù)據(jù)進行預處理,為訓練做準備。該模型將采用 [N, 28, 28, 1] 批次并輸出為[N, 100]的概率。
#Reshapeandnormalizex_train=x_train.reshape(x_train.shape[0],image_size,image_size,1).astype('float32')x_test=x_test.reshape(x_test.shape[0],image_size,image_size,1).astype('float32')x_train/=255.0x_test/=255.0#Convertclassvectorstoclassmatricesy_train=keras.utils.to_categorical(y_train,num_classes)y_test=keras.utils.to_categorical(y_test,num_classes)
創(chuàng)建模型
我們將創(chuàng)建一個簡單的CNN。參數(shù)數(shù)量越少,模型就越簡單越好。因為我們是在瀏覽器上進行轉換后運行模型,并且希望模型能夠快速運行以便進行預測。下面模型包含了3個conv層和2個dense層。
#Definemodelmodel=keras.Sequential()model.add(layers.Convolution2D(16,(3,3),padding='same',input_shape=x_train.shape[1:],activation='relu'))model.add(layers.MaxPooling2D(pool_size=(2,2)))model.add(layers.Convolution2D(32,(3,3),padding='same',activation='relu'))model.add(layers.MaxPooling2D(pool_size=(2,2)))model.add(layers.Convolution2D(64,(3,3),padding='same',activation='relu'))model.add(layers.MaxPooling2D(pool_size=(2,2)))model.add(layers.Flatten())model.add(layers.Dense(128,activation='relu'))model.add(layers.Dense(100,activation='softmax'))#Trainmodeladam=tf.train.AdamOptimizer()model.compile(loss='categorical_crossentropy',optimizer=adam,metrics=['top_k_categorical_accuracy'])print(model.summary())
適配、驗證和測試
在此之后,我們對模型進行了5個輪數(shù)和256個批次的訓練,并進行了10%的驗證劃分:
#fitthemodelmodel.fit(x=x_train,y=y_train,validation_split=0.1,batch_size=256,verbose=2,epochs=5)#evaluateonunseendatascore=model.evaluate(x_test,y_test,verbose=0)print('Testaccuarcy:{:0.2f}%'.format(score[1]*100))viewraw
訓練的結果如下圖所示:
測試準確率中第5個準確率為92.20%。
為Web格式準備模型
在我們對模型的準確率感到滿意之后,我們將其保存并準備進行轉換:
model.save('keras.h5')
安裝tfjs包進行轉換:
!pipinstalltensorflowjs
然后轉換模型:
!mkdirmodel!tensorflowjs_converter--input_formatkeraskeras.h5model/
創(chuàng)建了一些權重文件和包含模型體系結構的json文件。
壓縮模型,準備將其下載到我們的本地計算機中:
!zip-rmodel.zipmodel
最后下載模型:
fromgoogle.colabimportfilesfiles.download('model.zip')
下面將展示如何加載模型并進行推理。假設我們有一個300x300大小的畫布。
加載模型
要使用TensorFlow.js,請首先運行以下腳本:
注意:需要在本地計算機上運行服務器,
然后,使用瀏覽器加載模型(await關鍵字用于等待瀏覽器加載模型)
model=awaittf.loadModel('model/model.json')viewraw
預處理
在做預測之前,我們需要先對數(shù)據(jù)進行預處理。首先從畫布中獲取圖像數(shù)據(jù)變量dpi用于根據(jù)屏幕像素的密度對畫布進行拉伸。
//theminimumboudningboxaroundthecurrentdrawingconstmbb=getMinBox()//cacluatethedpiofthecurrentwindowconstdpi=window.devicePixelRatio//extracttheimagedataconstimgData=canvas.contextContainer.getImageData(mbb.min.x*dpi,mbb.min.y*dpi,(mbb.max.x-mbb.min.x)*dpi,(mbb.max.y-mbb.min.y)*dpi);
我們將畫布當前的圖像數(shù)據(jù)轉換為一個張量,調整大小并進行規(guī)范化。
functionpreprocess(imgData){returntf.tidy(()=>{//converttheimagedatatoatensorlettensor=tf.fromPixels(imgData,numChannels=1)//resizeto28x28constresized=tf.image.resizeBilinear(tensor,[28,28]).toFloat()//Normalizetheimageconstoffset=tf.scalar(255.0);constnormalized=tf.scalar(1.0).sub(resized.div(offset));//Weaddadimensiontogetabatchshapeconstbatched=normalized.expandDims(0)returnbatched})}
對于預測,我們使用model.predict,這將返回形狀的概率[N, 100]:
constpred=model.predict(preprocess(imgData)).dataSync()
然后我們可以用簡單的函數(shù)來求前5個概率。
提高準確率
記住,我們的模型接受形狀[N, 28, 28,1]的張量,繪圖畫布大小為300x300,對于繪圖來說,可能需要兩個大的用于繪圖,或者可能需要用戶繪制小一些的圖。最好只裁剪包含當前圖畫的框。為了做到這一點,我們通過查找左上角和右下角來提取繪圖周圍的最小邊界框:
//recordthecurrentdrawingcoordinatesfunctionrecordCoor(event){//getcurrentmousecoordinatevarpointer=canvas.getPointer(event.e);varposX=pointer.x;varposY=pointer.y;//recordthepointifwithingthecanvasandthemouseispressedif(posX>=0&&posY>=0&&mousePressed){coords.push(pointer)}}//getthebestboundingboxbyfindingthetopleftandbottomrightcorndersfunctiongetMinBox(){varcoorX=coords.map(function(p){returnp.x});varcoorY=coords.map(function(p){returnp.y});//findtopleftcornervarmin_coords={x:Math.min.apply(null,coorX),y:Math.min.apply(null,coorY)}//findrightbottomcornervarmax_coords={x:Math.max.apply(null,coorX),y:Math.max.apply(null,coorY)}return{min:min_coords,max:max_coords}}
測試繪圖
下圖展示了一些第一次繪圖和最高百分比級別。所有的圖畫都是我用鼠標繪制的。如果用一支電腦繪圖筆可以獲得更好的準確率:
-
數(shù)據(jù)集
+關注
關注
4文章
1197瀏覽量
24532 -
tensorflow
+關注
關注
13文章
327瀏覽量
60413
原文標題:TensorFlow 發(fā)布新版本v1.9(附應用實踐教程)
文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論