Web安全之深度學(xué)習(xí)實戰(zhàn)_第1頁
Web安全之深度學(xué)習(xí)實戰(zhàn)_第2頁
Web安全之深度學(xué)習(xí)實戰(zhàn)_第3頁
Web安全之深度學(xué)習(xí)實戰(zhàn)_第4頁
Web安全之深度學(xué)習(xí)實戰(zhàn)_第5頁
已閱讀5頁,還剩297頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

Web安全之深度學(xué)習(xí)實戰(zhàn)目錄\h第1章打造深度學(xué)習(xí)工具箱\h1.1TensorFlow\h1.1.1安裝\h1.1.2使用舉例\h1.2TFLearn\h1.3PaddlePaddle\h1.3.1安裝\h1.3.2使用舉例\h1.4Karas\h1.5本章小結(jié)\h第2章卷積神經(jīng)網(wǎng)絡(luò)\h2.1傳統(tǒng)的圖像分類算法\h2.2基于CNN的圖像分類算法\h2.2.1局部連接\h2.2.2參數(shù)共享\h2.2.3池化\h2.2.4典型的CNN結(jié)構(gòu)及實現(xiàn)\h2.2.5AlexNet的結(jié)構(gòu)及實現(xiàn)\h2.2.6VGG的結(jié)構(gòu)及實現(xiàn)\h2.3基于CNN的文本處理\h2.3.1典型的CNN結(jié)構(gòu)\h2.3.2典型的CNN代碼實現(xiàn)\h2.4本章小結(jié)\h第3章循環(huán)神經(jīng)網(wǎng)絡(luò)\h3.1循環(huán)神經(jīng)算法概述\h3.2單向循環(huán)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)與實現(xiàn)\h3.3雙向循環(huán)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)與實現(xiàn)\h3.4循環(huán)神經(jīng)網(wǎng)絡(luò)在序列分類的應(yīng)用\h3.5循環(huán)神經(jīng)網(wǎng)絡(luò)在序列生成的應(yīng)用\h3.6循環(huán)神經(jīng)網(wǎng)絡(luò)在序列標(biāo)記的應(yīng)用\h3.7循環(huán)神經(jīng)網(wǎng)絡(luò)在序列翻譯的應(yīng)用\h3.8本章小結(jié)\h第4章基于OpenSOC的機(jī)器學(xué)習(xí)框架\h4.1OpenSOC框架\h4.2數(shù)據(jù)源系統(tǒng)\h4.3數(shù)據(jù)收集層\h4.4消息系統(tǒng)層\h4.5實時處理層\h4.6存儲層\h4.6.1HDFS\h4.6.2HBase\h4.6.3Elasticsearch\h4.7分析處理層\h4.8計算系統(tǒng)\h4.9實戰(zhàn)演練\h4.10本章小結(jié)\h第5章驗證碼識別\h5.1數(shù)據(jù)集\h5.2特征提取\h5.3模型訓(xùn)練與驗證\h5.3.1K近鄰算法\h5.3.2支持向量機(jī)算法\h5.3.3深度學(xué)習(xí)算法之MLP\h5.3.4深度學(xué)習(xí)算法之CNN\h5.4本章小結(jié)\h第6章垃圾郵件識別\h6.1數(shù)據(jù)集\h6.2特征提取\h6.2.1詞袋模型\h6.2.2TF-IDF模型\h6.2.3詞匯表模型\h6.3模型訓(xùn)練與驗證\h6.3.1樸素貝葉斯算法\h6.3.2支持向量機(jī)算法\h6.3.3深度學(xué)習(xí)算法之MLP\h6.3.4深度學(xué)習(xí)算法之CNN\h6.3.5深度學(xué)習(xí)算法之RNN\h6.4本章小結(jié)\h第7章負(fù)面評論識別\h7.1數(shù)據(jù)集\h7.2特征提取\h7.2.1詞袋和TF-IDF模型\h7.2.2詞匯表模型\h7.2.3Word2Vec模型和Doc2Vec模型\h7.3模型訓(xùn)練與驗證\h7.3.1樸素貝葉斯算法\h7.3.2支持向量機(jī)算法\h7.3.3深度學(xué)習(xí)算法之MLP\h7.3.4深度學(xué)習(xí)算法之CNN\h7.4本章小結(jié)\h第8章騷擾短信識別\h8.1數(shù)據(jù)集\h8.2特征提取\h8.2.1詞袋和TF-IDF模型\h8.2.2詞匯表模型\h8.2.3Word2Vec模型和Doc2Vec模型\h8.3模型訓(xùn)練與驗證\h8.3.1樸素貝葉斯算法\h8.3.2支持向量機(jī)算法\h8.3.3XGBoost算法\h8.3.4深度學(xué)習(xí)算法之MLP\h8.4本章小結(jié)\h第9章Linux后門檢測\h9.1數(shù)據(jù)集\h9.2特征提取\h9.3模型訓(xùn)練與驗證\h9.3.1樸素貝葉斯算法\h9.3.2XGBoost算法\h9.3.3深度學(xué)習(xí)算法之多層感知機(jī)\h9.4本章小結(jié)\h第10章用戶行為分析與惡意行為檢測\h10.1數(shù)據(jù)集\h10.2特征提取\h10.2.1詞袋和TF-IDF模型\h10.2.2詞袋和N-Gram模型\h10.2.3詞匯表模型\h10.3模型訓(xùn)練與驗證\h10.3.1樸素貝葉斯算法\h10.3.2XGBoost算法\h10.3.3隱式馬爾可夫算法\h10.3.4深度學(xué)習(xí)算法之MLP\h10.4本章小結(jié)\h第11章WebShell檢測\h11.1數(shù)據(jù)集\h11.1.1WordPress\h11.1.2PHPCMS\h11.1.3phpMyAdmin\h11.1.4Smarty\h11.1.5Yii\h11.2特征提取\h11.2.1詞袋和TF-IDF模型\h11.2.2opcode和N-Gram模型\h11.2.3opcode調(diào)用序列模型\h11.3模型訓(xùn)練與驗證\h11.3.1樸素貝葉斯算法\h11.3.2深度學(xué)習(xí)算法之MLP\h11.3.3深度學(xué)習(xí)算法之CNN\h11.4本章小結(jié)\h第12章智能掃描器\h12.1自動生成XSS攻擊載荷\h12.1.1數(shù)據(jù)集\h12.1.2特征提取\h12.1.3模型訓(xùn)練與驗證\h12.2自動識別登錄界面\h12.2.1數(shù)據(jù)集\h12.2.2特征提取\h12.2.3模型訓(xùn)練與驗證\h12.3本章小結(jié)\h第13章DGA域名識別\h13.1數(shù)據(jù)集\h13.2特征提取\h13.2.1N-Gram模型\h13.2.2統(tǒng)計特征模型\h13.2.3字符序列模型\h13.3模型訓(xùn)練與驗證\h13.3.1樸素貝葉斯算法\h13.3.2XGBoost算法\h13.3.3深度學(xué)習(xí)算法之多層感知機(jī)\h13.3.4深度學(xué)習(xí)算法之RNN\h13.4本章小結(jié)\h第14章惡意程序分類識別\h14.1數(shù)據(jù)集\h14.2特征提取\h14.3模型訓(xùn)練與驗證\h14.3.1支持向量機(jī)算法\h14.3.2XGBoost算法\h14.3.3深度學(xué)習(xí)算法之多層感知機(jī)\h14.4本章小結(jié)\h第15章反信用卡欺詐\h15.1數(shù)據(jù)集\h15.2特征提取\h15.2.1標(biāo)準(zhǔn)化\h15.2.2標(biāo)準(zhǔn)化和降采樣\h15.2.3標(biāo)準(zhǔn)化和過采樣\h15.3模型訓(xùn)練與驗證\h15.3.1樸素貝葉斯算法\h15.3.2XGBoost算法\h15.3.3深度學(xué)習(xí)算法之多層感知機(jī)\h15.4本章小結(jié)第1章打造深度學(xué)習(xí)工具箱在本系列圖書的第一本《Web安全之機(jī)器學(xué)習(xí)入門》中,我們以常見安全問題為背景介紹了常見的機(jī)器學(xué)習(xí)算法,主要以KNN、SVM、樸素貝葉斯等淺層學(xué)習(xí)算法為主。以Scikit-Learn為代表的機(jī)器學(xué)習(xí)開發(fā)庫幫助我們可以很便捷地在單機(jī)環(huán)境下驗證我們的想法。近幾年深度學(xué)習(xí)發(fā)展迅速,以TensorFlow為代表的一批優(yōu)秀的深度學(xué)習(xí)開發(fā)庫大大降低了大家學(xué)習(xí)使用深度學(xué)習(xí)技術(shù)的門檻。作為本書的第1章,本章將幫助大家打造自己的深度學(xué)習(xí)工具箱,并結(jié)合實際例子介紹TensorFlow、TFLearn、PaddlePaddle以及Karas的使用方法。本章代碼請參考本書配套GitHub中的tools.py。1.1TensorFlowTensorFlow是谷歌的第二代人工智能學(xué)習(xí)系統(tǒng),其名稱來源于本身的運行原理。Tensor意味著N維數(shù)組,F(xiàn)low意味著基于數(shù)據(jù)流圖的計算,TensorFlow為Tensor從流圖的一端流動到另一端計算過程。所以也可以把TensorFlow當(dāng)做將復(fù)雜的數(shù)據(jù)結(jié)構(gòu)傳輸至人工智能神經(jīng)網(wǎng)中進(jìn)行分析和處理的系統(tǒng)。TensorFlow可用于語音識別或圖像識別等多項機(jī)器深度學(xué)習(xí)領(lǐng)域,是對2011年開發(fā)的深度學(xué)習(xí)基礎(chǔ)架構(gòu)DistBelief進(jìn)行了各方面的改進(jìn),它可在小到一部智能手機(jī)、大到數(shù)千臺數(shù)據(jù)中心服務(wù)器的各種設(shè)備上運行。1.1.1安裝TensorFlow支持非常豐富的安裝方式\h[1]。1.Ubuntu/Linux。#僅使用CPU的版本

$pipinstall/tensorflow/linux/cpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl

#開啟GPU支持的版本(安裝該版本的前提是已經(jīng)安裝了CUDAsdk)

$pipinstall/tensorflow/linux/gpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl2.MacOSX。在MacOSX系統(tǒng)上,我們推薦先安裝homebrew,然后執(zhí)行brewinstallpython,以便能夠使用homebrew中的Python安裝TensorFlow:#當(dāng)前版本只支持CPU

$pipinstall/tensorflow/mac/tensorflow-0.5.0-py2-none-any.whl3.基于Docker的安裝。$dockerrun-itb.gcr.io/tensorflow/tensorflow該命令將啟動一個已經(jīng)安裝好TensorFlow及相關(guān)依賴的容器:4.基于VirtualEnv的安裝。官方文檔推薦使用VirtualEnv創(chuàng)建一個隔離的容器來安裝TensorFlow,這是可選的,但是這樣做能使排查安裝問題變得更容易。VirtualEnv通過創(chuàng)建獨立Python開發(fā)環(huán)境的工具,來解決依賴、版本以及間接權(quán)限問題。比如,一個項目依賴Django1.3,而當(dāng)前全局開發(fā)環(huán)境為Django1.7,版本跨度過大,導(dǎo)致的不兼容使項目無法正常運行,使用VirtualEnv可以解決這些問題\h[2]。首先,安裝所有必備工具:#在Linux上:

$sudoapt-getinstallpython-pippython-devpython-virtualenv

#在Mac上:

#如果還沒有安裝pip

$sudoeasy_installpip

$sudopipinstall--upgradevirtualenv接下來,建立一個全新的VirtualEnv環(huán)境。為了將環(huán)境建在~/tensorflow目錄下,執(zhí)行如下代碼:$virtualenv--system-site-packages~/tensorflow

$cd~/tensorflow然后,激活VirtualEnv:$sourcebin/activate

#如果使用bash$sourcebin/activate.csh

#如果使用csh(tensorflow)$

#終端提示符應(yīng)該發(fā)生變化在VirtualEnv內(nèi),安裝TensorFlow:(tensorflow)$pipinstall--upgrade<$url_to_binary.whl>接下來,使用類似命令運行TensorFlow程序:(tensorflow)$cdtensorflow/models/image/mnist

(tensorflow)$pythonconvolutional.py

#當(dāng)使用完TensorFlow

(tensorflow)$deactivate\h[1]/tfdoc/get_started/os_setup.html\h[2]/p/08c657bd34f11.1.2使用舉例TensorFlow的API使用起來比較繁瑣,通常直接使用針對其API的高層封裝TFLearn即可,具體實現(xiàn)請參考下節(jié)TFLearn的使用舉例。1.2TFLearnTFLearn是一個模塊化和透明的深度學(xué)習(xí)庫,構(gòu)建在TensorFlow之上,它為TensorFlow提供高層次API,目的是快速搭建試驗環(huán)境,同時保持對TensorFlow的完全透明和兼容性。TFLearn具有以下特點\h[1]:·容易使用和易于理解的高層次API用于實現(xiàn)深度神經(jīng)網(wǎng)絡(luò),附帶教程和例子。·通過高度模塊化的內(nèi)置神經(jīng)網(wǎng)絡(luò)層、正則化器、優(yōu)化器等進(jìn)行快速原型設(shè)計?!?qiáng)大的輔助函數(shù),訓(xùn)練任意TensorFlow圖,支持多輸入、多輸出和優(yōu)化器?!ず唵味烙^的圖可視化,具有關(guān)于權(quán)值、梯度、特征圖等細(xì)節(jié)?!o需人工干預(yù),可使用多CPU、多GPU。本書的主要代碼都是基于TFLearn開發(fā)的。1.安裝。TFLearn的安裝推薦使用使用pip工具:pipinstalltflearn如果需要使用源碼安裝,可以直接從GitHub上下載對應(yīng)源碼:/tflearn然后進(jìn)入TFLearn目錄安裝即可:pythonsetup.pyinstall2.使用舉例。TFLearn自帶MNIST數(shù)據(jù),使用函數(shù)mnist.load_data接口,并且可以通過指定one_hot=True直接獲取使用獨熱編碼的標(biāo)簽:X,Y,testX,testY=mnist.load_data(one_hot=True)構(gòu)造一個隱藏層為2層,每層核數(shù)分別為64、64,輸出層核數(shù)為10的多層感知機(jī),使用fully_connected函數(shù)即可完成構(gòu)造全連接網(wǎng)絡(luò)的工作,使用tflearn.input_data定義輸入數(shù)據(jù)大小。為了避免過擬合,每層之間使用Dropout函數(shù)進(jìn)行部分丟失處理:#Buildingdeepneuralnetwork

input_layer=tflearn.input_data(shape=[None,784])

dense1=tflearn.fully_connected(input_layer,64,activation='tanh',

regularizer='L2',weight_decay=0.001)

dropout1=tflearn.dropout(dense1,0.8)

dense2=tflearn.fully_connected(dropout1,64,activation='tanh',

regularizer='L2',weight_decay=0.001)

dropout2=tflearn.dropout(dense2,0.8)

softmax=tflearn.fully_connected(dropout2,10,activation='softmax')使用多層感知機(jī)進(jìn)行訓(xùn)練,通過n_epoch設(shè)置訓(xùn)練的輪數(shù):#Training

model=tflearn.DNN(net,tensorboard_verbose=0)

model.fit(X,Y,n_epoch=20,validation_set=(testX,testY),

show_metric=True,run_id="dense_model")經(jīng)過20輪的訓(xùn)練后,準(zhǔn)確率達(dá)到了99.54%:TrainingStep:17200|totalloss:0.43454|time:5.444s

|SGD|epoch:020|loss:0.43454-top3:0.9685|val_loss:0.10618-val_acc:0.9954--iter:55000/55000\h[1]/p/253220661.3PaddlePaddlePaddlePaddle是百度開源的深度學(xué)習(xí)庫,2016年9月27日,百度宣布其全新的深度學(xué)習(xí)開源平臺PaddlePaddle在開源社區(qū)GitHub及百度大腦平臺開放,供廣大開發(fā)者下載使用。百度成為繼Google、Facebook、IBM后另一個將人工智能技術(shù)開源的科技巨頭,同時也是國內(nèi)首個開源深度學(xué)習(xí)平臺的科技公司。PaddlePaddle的前身是百度于2013年自主研發(fā)的深度學(xué)習(xí)平臺Paddle(ParallelDistributedDeepLearning,并行分布式深度學(xué)習(xí)),且一直為百度內(nèi)部工程師研發(fā)使用。全球各大科技巨頭開源的深度學(xué)習(xí)平臺都極具各自的技術(shù)特點。百度由于其自身在搜索、圖像識別、語音語義識別理解、情感分析、機(jī)器翻譯、用戶畫像推薦等多領(lǐng)域都有業(yè)務(wù)應(yīng)用,PaddlePaddle則表現(xiàn)得更加全面,是一個相對全功能的深度學(xué)習(xí)框架。目前,PaddlePaddle已實現(xiàn)CPU/GPU單機(jī)和分布式模式,同時支持海量數(shù)據(jù)訓(xùn)練、數(shù)百臺機(jī)器并行運算,以應(yīng)對大規(guī)模的數(shù)據(jù)訓(xùn)練。此外,PaddlePaddle具備高質(zhì)量GPU代碼,提供了機(jī)器翻譯、推薦、圖像分類、情感分析等功能。目前,PaddlePaddle已在百度30多項主要產(chǎn)品和服務(wù)之中發(fā)揮著作用,如外賣的預(yù)估出餐時間、預(yù)判網(wǎng)盤故障時間點、精準(zhǔn)推薦用戶所需信息、海量圖像識別分類、字符識別、病毒和垃圾信息檢測、機(jī)器翻譯和自動駕駛等領(lǐng)域。以外賣行業(yè)為例,外賣員等待商家出餐的時間耗時嚴(yán)重,百度將不同時段商家的客流量、菜品的制作時間和訂單量等數(shù)據(jù)交給了PaddlePaddle,經(jīng)過對海量數(shù)據(jù)的深度學(xué)習(xí)處理,如今,百度外賣的內(nèi)部系統(tǒng)可以預(yù)估每個商家菜品出餐時間,及時告知外賣員,提高了送餐效率,系統(tǒng)也可以更加合理地規(guī)劃取餐和送餐的路線\h[1]。\h[1]/i/2016-09-27/doc-ifxwevmc5593979.shtml1.3.1安裝PaddlePaddle提供數(shù)個預(yù)編譯的二進(jìn)制文件來進(jìn)行安裝,包括Docker鏡像和Ubuntu的deb安裝包等。1.基于Docker容器使用方式PaddlePaddle的編譯環(huán)境打包成了一個鏡像,稱為開發(fā)鏡像,里面涵蓋了PaddlePaddle需要的所有編譯工具。編譯出來的PaddlePaddle也打包成一個鏡像,稱為生產(chǎn)鏡像,里面涵蓋了運行所需的所有環(huán)境。每次發(fā)布新版本的時候都會發(fā)布對應(yīng)版本的生產(chǎn)鏡像以及開發(fā)鏡像。運行鏡像包括純CPU版本和GPU版本及其對應(yīng)的非AVX版本\h[1]。交互方式運行開發(fā)鏡像:dockerrun-it--rmpaddlepaddle/paddle:<version>-dev/bin/bash后臺進(jìn)程方式運行容器:dockerrun-d-p2202:22-p8888:8888paddledev/paddle:<version>-dev然后用密碼rootSSH進(jìn)入容器:ssh-p2202root@localhost2.Ubuntu部署PaddlePaddle安裝包的下載地址是:/PaddlePaddle/Paddle/releases它包含4個版本:·CPU版本:支持主流X86處理器平臺,使用了AVX指令集?!PU-NOAVX版本:支持主流X86處理器平臺,沒有使用AVX指令集?!PU版本:支持主流X86處理器平臺,支持NVIDIACUDA平臺,使用了AVX指令集?!PU-NOAVX版本:支持主流X86處理器平臺,支持NVIDIACUDA平臺,沒有使用AVX指令集。下載完相關(guān)安裝包后,執(zhí)行如下命令:sudoapt-getinstallgdebigdebipaddle-*-cpu.deb或者如下命令:dpkg-ipaddle-*-cpu.debapt-getinstall-f在用dpkg-i的時候如果報一些依賴未找到的錯誤是正常的,在apt-getinstall-f里會繼續(xù)安裝PaddlePaddle。安裝完成后,可以使用命令paddleversion查看安裝后的Paddle版本\h[2]:PaddlePaddle0.8.0b1,compiledwith

with_avx:ON

with_gpu:OFF

with_double:OFF

with_python:ON

with_rdma:OFF

with_timer:OFF

with_predict_sdk:\h[1]/doc_cn/getstarted/build_and_install/docker_install_cn.html\h[2]/doc_cn/getstarted/build_and_install/ubuntu_install_cn.html1.3.2使用舉例以識別MNIST數(shù)據(jù)集為例,關(guān)于MNIST數(shù)據(jù)集的詳細(xì)介紹請參考本書第5章。下面代碼實現(xiàn)了一個含有兩個隱藏層的多層感知器,其中兩個隱藏層的激活函數(shù)均采用ReLU,輸出層的激活函數(shù)用Softmax:defmultilayer_perceptron(img):

hidden1=paddle.layer.fc(input=img,size=128,

act=paddle.activation.Relu())

hidden2=paddle.layer.fc(input=hidden1,size=64,

act=paddle.activation.Relu())

predict=paddle.layer.fc(input=hidden2,

size=10,act=paddle.activation.Softmax())

returnpredict通過layer.data調(diào)用來獲取數(shù)據(jù),然后調(diào)用分類器得到分類結(jié)果。訓(xùn)練時,對該結(jié)果計算其損失函數(shù),分類問題常常選擇交叉熵?fù)p失函數(shù):paddle.init(use_gpu=False,trainer_count=1)

images=paddle.layer.data(name='pixel',type=paddle.data_type.dense_vector(784))

label=paddle.layer.data(name='label',type=paddle.data_eger_value(10))

predict=multilayer_perceptron(images)#多層感知器

cost=paddle.layer.classification_cost(input=predict,label=label)訓(xùn)練過程是完全自動的,event_handler里打印的日志如下所示,最后準(zhǔn)確率為97.66%:#Pass0,Batch0,Cost2.780790,{'classification_error_evaluator':0.9453125}#Pass0,Batch100,Cost0.635356,{'classification_error_evaluator':0.2109375}#Pass0,Batch200,Cost0.326094,{'classification_error_evaluator':0.1328125}#Pass0,Batch300,Cost0.361920,{'classification_error_evaluator':0.1015625}#Pass0,Batch400,Cost0.410101,{'classification_error_evaluator':0.125}#TestwithPass0,Cost0.326659,{'classification_error_evaluator':0.09470000118017197}1.4KarasKeras是一個高級別的Python神經(jīng)網(wǎng)絡(luò)框架,能在TensorFlow或者Theano上運行。Keras的作者、谷歌AI研究員FrancoisChollet宣布了一條激動人心的消息,Keras將會成為第一個被添加到TensorFlow核心中的高級別框架,這將會使Keras變成Tensorflow的默認(rèn)API。Keras的特點是:·可以快速簡單地設(shè)計出原型?!ね瑫r支持卷積網(wǎng)絡(luò)和循環(huán)網(wǎng)絡(luò),以及兩者的組合?!ぶС秩我獾倪B接方案(包括多輸入和多輸出)。Keras的在線文檔內(nèi)容非常豐富,地址為:https://keras.io/1.安裝Keras的安裝非常簡便,使用pip工具即可:pipinstallkeras如果需要使用源碼安裝,可以直接從GitHub上下載對應(yīng)源碼:/fchollet/keras然后進(jìn)入Keras目錄安裝即可:pythonsetup.pyinstall2.使用舉例以識別MNIST數(shù)據(jù)集為例,關(guān)于MNIST數(shù)據(jù)集的詳細(xì)介紹請參考本書第5章。本章主要是給大家概要介紹如何使用Keras。Keras自帶了MNIST數(shù)據(jù)集,使用mnist.load_data()加載即可:#thedata,shuffledandsplitbetweentrainandtestsets

(x_train,y_train),(x_test,y_test)=mnist.load_data()MNIST中的圖片大小為28×28的矩陣,為了處理方便,把28×28的矩陣轉(zhuǎn)換成長度為784的向量:x_train=x_train.reshape(60000,784)

x_test=x_test.reshape(10000,784)

x_train=x_train.astype('float32')

x_test=x_test.astype('float32')

x_train/=255

x_test/=255圖片識別的結(jié)果是0~9這10個數(shù)字。通常神經(jīng)網(wǎng)絡(luò)算法在處理時,習(xí)慣將輸出以獨熱編碼的形式展現(xiàn),即所謂One-Hot編碼,又稱“一位有效編碼”。其方法是使用N位狀態(tài)寄存器來對N個狀態(tài)進(jìn)行編碼,每個狀態(tài)都有它獨立的寄存器位,并且在任意時候,其中只有一位有效。比如以二分類問題為例,結(jié)果為真表示為1,反之為0;使用獨熱編碼,結(jié)果為真表示為10,反之為01。在Karas中可以使用keras.utils.to_categorical很方便地進(jìn)行轉(zhuǎn)換:#convertclassvectorstobinaryclassmatrices

y_train=keras.utils.to_categorical(y_train,num_classes)

y_test=keras.utils.to_categorical(y_test,num_classes)下面是整個環(huán)節(jié)的重點,構(gòu)造一個隱藏層為2層,每層節(jié)點數(shù)分別為512、512,輸出層節(jié)點數(shù)為10的多層感知機(jī),使用Dense函數(shù)即可完成構(gòu)造全連接網(wǎng)絡(luò)的工作,其中第一層需要定義輸入數(shù)據(jù)的形狀,具體定義方式在input_shape屬性指定。為了避免過擬合,每層之間使用Dropout函數(shù)進(jìn)行部分丟失處理,適度的丟失數(shù)據(jù)不會影響分類識別效果,就好比識別一張照片時適度遮住一部分,不會影響分類識別結(jié)果:model=Sequential()

model.add(Dense(512,activation='relu',input_shape=(784,)))

model.add(Dropout(0.2))

model.add(Dense(512,activation='relu'))

model.add(Dropout(0.2))

model.add(Dense(10,activation='softmax'))完成多層感知機(jī)的結(jié)構(gòu)定義后,就可以使用compile函數(shù)“編譯”整個網(wǎng)絡(luò),讓其工作:model.summary()

pile(loss='categorical_crossentropy',

optimizer=RMSprop(),

metrics=['accuracy'])整個訓(xùn)練過程需要定義訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集,同時定義訓(xùn)練的輪數(shù),通常認(rèn)為訓(xùn)練輪數(shù)為5~20比較合適,輪數(shù)太少訓(xùn)練不充分,輪數(shù)太多則訓(xùn)練時間過長:history=model.fit(x_train,y_train,

batch_size=batch_size,

epochs=epochs,

verbose=1,

validation_data=(x_test,y_test))最后評估整個訓(xùn)練的效果,經(jīng)過20輪訓(xùn)練,準(zhǔn)確率為98.12%:score=model.evaluate(x_test,y_test,verbose=0)

print('Testloss:',score[0])

print('Testaccuracy:',score[1])輸出結(jié)果為:Epoch20/20

60000/60000[==============================]-11s-loss:0.0201-acc:0.9950-val_loss:0.1224-val_acc:0.9812

('Testloss:',0.12236141463853964)

('Testaccuracy:',0.98119999999999996)1.5本章小結(jié)本章介紹了如何打造自己的深度學(xué)習(xí)工具箱,介紹了TensorFlow、TFLearn、Paddle-Paddle以及Karas的安裝方法,并結(jié)合常見的MNIST數(shù)據(jù)集介紹了以上工具箱的使用方式,各種工具箱識別準(zhǔn)確率不同,這不代表工具本身的優(yōu)劣。這里只是給大家一個基本的演示,初次接觸這些代碼可能會非常茫然,相信通過后面章節(jié)的介紹,大家最后會熟練掌握這些代碼。第2章卷積神經(jīng)網(wǎng)絡(luò)深度學(xué)習(xí)模型中的卷積神經(jīng)網(wǎng)絡(luò)(ConvolutionNeuralNetwork,CNN)近年來在圖像領(lǐng)域取得了驚人的成績,CNN直接利用圖像像素信息作為輸入,最大程度保留了輸入圖像的所有信息,通過卷積操作進(jìn)行特征的提取和高層抽象,模型輸出直接是圖像識別的結(jié)果。這種基于“輸入-輸出”直接端到端的學(xué)習(xí)方法取得了非常好的效果,得到了廣泛的應(yīng)用。本章重點介紹CNN的基本原理、常見的CNN結(jié)構(gòu)以及代碼實現(xiàn),還介紹了基于CNN的文本分類處理。本章涉及的代碼請參考本書GitHub的cnn.py文件。2.1傳統(tǒng)的圖像分類算法圖像分類是根據(jù)圖像的原始信息將不同類別圖像區(qū)分開來,是計算機(jī)視覺中重要的基本問題,也是圖像檢測、圖像分割、物體跟蹤、行為分析等其他高層視覺任務(wù)的基礎(chǔ)。圖像分類在很多領(lǐng)域有廣泛應(yīng)用,包括安防領(lǐng)域的人臉識別和智能視頻分析,交通領(lǐng)域的交通場景識別,互聯(lián)網(wǎng)領(lǐng)域基于內(nèi)容的圖像檢索和相冊自動歸類,醫(yī)學(xué)領(lǐng)域的圖像識別等\h[1],如圖2-1所示。在CNN出現(xiàn)之前,圖像分類算法依賴于復(fù)雜的特征工程。常用的特征提取方法包括SIFT(Scale-InvariantFeatureTransform,尺度不變特征轉(zhuǎn)換)、HOG(HistogramofOrientedGradient,方向梯度直方圖)、LBP(LocalBianrayPattern,局部二值模式)等,常用的分類算法為SVM。圖2-1圖像分類識別花的不同品種\h[1]/.html2.2基于CNN的圖像分類算法人們嘗試直接把原始圖像作為輸入,通過深度學(xué)習(xí)算法直接進(jìn)行圖像分類,從而繞過復(fù)雜的特征工程。下面介紹幾個重要技術(shù)點。2.2.1局部連接常見的深度學(xué)習(xí)算法都是全連接形式,所謂全連接,就是第n-1層的任意一個節(jié)點,都和第n層所有節(jié)點有連接,如圖2-2所示。圖2-2隱藏層內(nèi)部全連接形式同時,臨近輸入層的隱藏層的任意節(jié)點與輸入層的全部節(jié)點都有連接,如圖2-3所示。圖2-3輸入層與隱藏層全連接形式以一個大小為1000×1000的灰度圖像為例,輸入層節(jié)點數(shù)量為1000×1000=1000000,隱藏層節(jié)點數(shù)量也為1000×1000=1000000,僅輸入層與隱藏層的連接就需要1000000×1000000=1012,幾乎是個天文數(shù)字,如此巨大的計算量阻礙了深度學(xué)習(xí)在圖像分類方向的應(yīng)用。事情的轉(zhuǎn)機(jī)來自于生物學(xué)的一個發(fā)現(xiàn)。人們在研究貓的視覺神經(jīng)細(xì)胞時發(fā)現(xiàn),一個視覺神經(jīng)元只負(fù)責(zé)處理視覺圖像的一小塊,這一小塊稱為感受野(ReceptiveField),類比在圖像分類領(lǐng)域,識別一個圖像是何種物體時,一個點與距離近的點之間的關(guān)聯(lián)非常緊密,但是和距離遠(yuǎn)的點之間關(guān)系就不大了,甚至足夠遠(yuǎn)的時候就可以忽略不計\h[1],如圖2-4所示。圖2-4全連接與局部連接具體到深度學(xué)習(xí)算法上,隱藏層與輸入層之間,隱藏層的一個節(jié)點只處理一部分輸入層結(jié)點的數(shù)據(jù),形成局部連接。還是接上面的例子,假設(shè)每個隱藏層的節(jié)點只處理10×10大小的數(shù)據(jù),也就是說每個隱藏層的節(jié)點只與輸入層的100個節(jié)點連接,這樣在隱藏層節(jié)點數(shù)量和輸入層節(jié)點數(shù)量不變的情況下,輸入層與隱藏層的連接需要1000000×100=108,是全連接的萬分之一。雖然計算量下降不少,但是依然十分巨大。局部連接不會減少隱藏層的節(jié)點數(shù)量,減少的是隱藏層和輸入層之間的連接數(shù)。\h[1]/stdcoutzyx/article/details/415966632.2.2參數(shù)共享本質(zhì)上隱藏層的一個節(jié)點與輸入層一個節(jié)點的連接,對應(yīng)的就是一個連接參數(shù),大量的連接也就意味著大量的參數(shù)需要計算,僅依靠局部連接技術(shù)是無法進(jìn)一步減少計算量的,于是人們又提出了參數(shù)共享方法。所謂的參數(shù)共享是基于這樣一個假設(shè):一部分圖像的統(tǒng)計特性與完整圖像的特性相同?;氐缴厦娴睦樱總€隱藏層的節(jié)點只與輸入層的100個節(jié)點連接,這樣每個隱藏層節(jié)點就具有100個參數(shù),全部隱藏層就具有1000000×100=108個參數(shù),使用參數(shù)共享后,每個隱藏層的節(jié)點都具有完全相同的參數(shù),全部隱藏層就只有100個參數(shù)需要計算了,這大大減少了計算量,而且即使處理更大的圖像,只要單一隱藏層節(jié)點與輸入層連接的個數(shù)不變,全部隱藏層的參數(shù)個數(shù)也不變。這種共享參數(shù)的機(jī)制,可以理解為針對圖像的卷積操作。假設(shè)如圖2-5所示,具有一個4×4大小的圖像和一個2×2大小的卷積核。圖2-5原始圖像與卷積核大小為2×2的卷積核對原始圖像第1個2×2的圖像塊進(jìn)行卷積操作,得到卷積結(jié)果為2,如圖2-6所示。圖2-6卷積核對原始圖像第1個2×2的塊進(jìn)行處理大小為2×2的卷積核對原始圖像第2個2×2的圖像塊進(jìn)行卷積操作,得到卷積結(jié)果為1,如圖2-7所示。圖2-7卷積核對原始圖像第2個2×2的塊進(jìn)行處理如果大小為2×2的卷積核依次對原始圖像進(jìn)行卷積操作,移動的步長為2,最終獲得一個2×2的新圖像,如圖2-8所示。圖2-8卷積核對原始圖像處理后的結(jié)果可見卷積處理后圖像的大小與卷積核的大小無關(guān),僅與步長有關(guān),對應(yīng)的隱藏層的節(jié)點個數(shù)也僅與步長有關(guān)。另外需要說明的是,卷積核處理圖像邊際時會出現(xiàn)數(shù)據(jù)缺失,這時候需要將圖像補全,常見的補全方式有兩種,same模式和valid模式,same模式會使用0數(shù)據(jù)補全,而且保持生成圖像與原始圖像大小一致。如果使用same模式,大小為2×2的卷積核依次對原始圖像進(jìn)行卷積操作,移動的步長為1,最終獲得一個4×4的新圖像,如圖2-9所示。這里需要再次強(qiáng)調(diào),當(dāng)步長為1時,無論卷積核大小如何,處理前后圖像大小不變;只有當(dāng)步長大于1時,處理后的圖像才會變小。圖2-9卷積核使用same模式對原始圖像處理后的結(jié)果2.2.3池化通過局部連接和參數(shù)共享后,我們針對1000×1000的圖像,使用卷積核大小為10×10,卷積步長為1,處理后得到的隱藏層節(jié)點個數(shù)為1000×1000=106,計算量還是太大。為了解決這個問題,首先回憶一下,我們之所以決定使用卷積后的特征是因為圖像具有一種“靜態(tài)性”的屬性,這也就意味著在一個圖像區(qū)域有用的特征極有可能在另一個區(qū)域同樣適用。因此,為了描述大的圖像,一個很自然的想法就是對不同位置的特征進(jìn)行聚合統(tǒng)計,例如,人們可以計算圖像一個區(qū)域上的某個特定特征的平均值(或最大值)。這種聚合的操作就叫做池化。常見的池化大小為2×2、3×3等,假設(shè)隱藏層節(jié)點個數(shù)為4×4,使用2×2大小池化,取最大值,過程如圖2-10所示。圖2-10池化處理隱藏層節(jié)點個數(shù)為1000×1000的神經(jīng)網(wǎng)絡(luò),經(jīng)過2×2池化后,得到的隱藏層節(jié)點個數(shù)為500×500=25×104。2.2.4典型的CNN結(jié)構(gòu)及實現(xiàn)典型的CNN包含卷積層、全連接層等組件,并采用softmax多類別分類器和多類交叉熵?fù)p失函數(shù),一個典型的卷積神經(jīng)網(wǎng)絡(luò)如圖2-11所示。我們先介紹用來構(gòu)造CNN的常見組件。圖2-11典型的CNN結(jié)構(gòu)·卷積層,執(zhí)行卷積操作提取底層到高層的特征,發(fā)掘圖片局部關(guān)聯(lián)性質(zhì)和空間不變性質(zhì)?!こ鼗瘜?,通過抽取卷積輸出特征圖中局部區(qū)塊的最大值或者均值,執(zhí)行降采樣操作。降采樣也是圖像處理中常見的一種操作,可以過濾掉一些不重要的高頻信息。·全連接層,輸入層到隱藏層的神經(jīng)元是全部連接的?!し蔷€性變化,卷積層、全連接層后面一般都會接非線性變化層,例如Sigmoid、Tanh、ReLu等來增強(qiáng)網(wǎng)絡(luò)的表達(dá)能力,在CNN里最常使用的是ReLu激活函數(shù)?!ropout,在模型訓(xùn)練階段隨機(jī)讓一些隱層節(jié)點不工作,提高神經(jīng)網(wǎng)絡(luò)的泛化能力,一定程度上可防止過擬合。這一點就好比人眼在識別圖的時候,適當(dāng)遮住一部分圖像并不會影響識別結(jié)果一樣。相對于淺層學(xué)習(xí)的SVM、KNN和樸素貝葉斯等,深度學(xué)習(xí)由于參數(shù)眾多,更容易出現(xiàn)過擬合的現(xiàn)象,所以一般都需要使用Dropout的機(jī)制。以處理經(jīng)典的MNIST數(shù)據(jù)集為例,MNIST數(shù)據(jù)集作為一個簡單的計算機(jī)視覺數(shù)據(jù)集,包含一系列如圖2-12所示的手寫數(shù)字圖片和對應(yīng)的標(biāo)簽。圖片是28×28的像素矩陣,標(biāo)簽則對應(yīng)著0~9的10個數(shù)字。每張圖片都經(jīng)過了大小歸一化和居中處理。圖2-12MNIST圖片示例處理MNIST的CNN結(jié)構(gòu)如圖2-13所示,這是一個TensorFlow的結(jié)構(gòu)輸出圖。圖2-13典型的CNN結(jié)構(gòu)(TensorFlow)簡化表示的結(jié)構(gòu)圖如圖2-14所示,TensorFlow中將處理的數(shù)據(jù)統(tǒng)一抽象為張量,即所謂的Tensor,原始大小為28×28的圖像可以抽象成大小為28×28張量,張量依次經(jīng)過:1)卷積核大小為3×3數(shù)量為32的卷積處理。2)池化大小為2×2的池化處理。3)卷積核大小為3×3數(shù)量為64的卷積處理。4)池化大小為2×2的池化處理以及最后的全連接處理。5)最后得到長度為10的一維張量,對應(yīng)正好是圖像識別后的結(jié)果,即數(shù)字0~9。圖2-14簡化的典型CNN結(jié)構(gòu)完整的處理流程如圖2-15所示,其中Dropout合并到全連接處理中沒有畫出來。圖2-15典型的CNN結(jié)構(gòu)完整處理流程下面我們基于TensorFlow一步一步使用代碼實現(xiàn)上述過程。每張圖片大小為28×28,可以當(dāng)做一個28×28的矩陣,CNN輸入層的大小為28×28,由于圖像是灰度圖像,每個像素取值為0或者1,定義輸入為[None,28,28,1],這樣就獲得了大小為28×28的張量:network=input_data(shape=[None,28,28,1],name='input')使用卷積處理,卷積核大小為3×3,卷積核數(shù)量為32,可以理解為通過3×3大小的卷積操作,提取32種特征,處理后的張量大小為28×28×32,激活函數(shù)使用relu:network=conv_2d(network,32,3,activation='relu',regularizer="L2")使用池化處理,池化大小為2×2,處理后的張量大小為14×14×32:network=max_pool_2d(network,2)使用卷積處理,卷積核大小為3×3,卷積核數(shù)量為64,可以理解為通過3×3大小的卷積操作,提取64種特征,處理后的張量大小為14×14×64:network=conv_2d(network,64,3,activation='relu',regularizer="L2")使用池化處理,池化大小為2×2,處理后的張量大小為7×7×64:network=max_pool_2d(network,2)標(biāo)準(zhǔn)化處理張量,將大小為7×7×64的張量轉(zhuǎn)化為長度為3136的一維張量,并與節(jié)點數(shù)為128的隱藏層進(jìn)行全連接,為了避免過擬合,使用Dropout讓部分節(jié)點臨時失效。其中函數(shù)local_response_normalization即localresponsenormalization最早是由Krizhevsky和Hinton在關(guān)于ImageNet的論文里面使用的一種數(shù)據(jù)標(biāo)準(zhǔn)化方法:network=local_response_normalization(network)

network=fully_connected(network,128,activation='tanh')

network=dropout(network,0.8)再與節(jié)點數(shù)為256的隱藏層進(jìn)行全連接,為了避免過擬合,繼續(xù)使用Dropout讓部分節(jié)點臨時失效:network=fully_connected(network,256,activation='tanh')

network=dropout(network,0.8)最后再與節(jié)點數(shù)為10的輸出層進(jìn)行全連接,獲得長度為10的一維張量,至此我們使用CNN,完成了大小為28×28的張量到大小為1×10的張量的訓(xùn)練轉(zhuǎn)化:network=fully_connected(network,10,activation='softmax')

network=regression(network,optimizer='adam',learning_rate=0.01,

loss='categorical_crossentropy',name='target')值得一提的是,這里使用了多種激活函數(shù),常見的激活函數(shù)有:sigmoid函數(shù)、tanh函數(shù)、ReLU函數(shù),如圖2-16~圖2-18所示。圖2-16sigmoid函數(shù)圖2-17tanh函數(shù)圖2-18ReLU函數(shù)2.2.5AlexNet的結(jié)構(gòu)及實現(xiàn)AlexNet是在2012年發(fā)表的一個經(jīng)典之作,并在當(dāng)年取得了ImageNet最好成績,其官方提供的數(shù)據(jù)模型,準(zhǔn)確率達(dá)到57.1%,top1~5達(dá)到80.2%。與傳統(tǒng)的機(jī)器學(xué)習(xí)分類算法相比,這個結(jié)果已經(jīng)相當(dāng)出色。AlexNet一共有8層組成,其中3個卷積層5個全連接層,如圖2-19所示。圖2-19AlexNet結(jié)構(gòu)以處理經(jīng)典的Oxford's17CategoryFlower數(shù)據(jù)集為例,如圖2-20所示。Oxford’s17CategoryFlower數(shù)據(jù)集是一個不同種類鮮花的圖像數(shù)據(jù),包含17個不同種類的鮮花,每類80張該類鮮花的圖片,這些鮮花種類是英國地區(qū)常見的。圖2-20Oxford’s17CategoryFlower數(shù)據(jù)集每張圖片大小為227×224,通道數(shù)為3,所以對應(yīng)的張量大小為227×227×3。部分文獻(xiàn)記錄圖片大小為224,這不影響本文的描述與代碼實現(xiàn)。處理Oxford’s17CategoryFlower數(shù)據(jù)集的AlexNet結(jié)構(gòu)如圖2-21所示,這是一個TensorFlow的結(jié)構(gòu)輸出圖。圖2-21AlexNet結(jié)構(gòu)(TensorFlow)簡化后的處理流程如圖2-22所示,大小為227×227×3張量經(jīng)過如下處理:1)卷積核大小為11×11數(shù)量為96的卷積處理。2)池化大小為3×3的池化處理。3)卷積核大小為5×5數(shù)量為256的卷積處理。4)池化大小為3×3的池化處理。5)卷積核大小為3×3數(shù)量為384的卷積處理。6)卷積核大小為3×3數(shù)量為384的卷積處理。7)卷積核大小為3×3數(shù)量為256的卷積處理。8)池化大小為3×3的池化處理以及最后的全連接處理。9)最后得到長度為17的一維張量,對應(yīng)正好是圖像識別后的結(jié)果,即對應(yīng)到17種花卉中的某一種。圖2-22簡化的AlexNet結(jié)構(gòu)下面我們基于TensorFlow一步一步使用代碼實現(xiàn)上述過程。每張圖片大小為227×227可以當(dāng)做一個227×227的矩陣,CNN輸入層的大小為227×227,由于圖像通道數(shù)為3,定義輸入為[None,227,227,3],這樣我們就獲得了大小為227×227×3的張量:network=input_data(shape=[None,227,227,3])使用卷積處理,卷積核大小為11×11,卷積核數(shù)量為96,步長為4,可以理解為通過11×11大小的卷積操作,提取96種特征,處理后的張量大小為56×56×3×96,激活函數(shù)使用relu:network=conv_2d(network,96,11,strides=4,activation='relu')使用池化處理,池化大小為3×3,步長為2:network=max_pool_2d(network,3,strides=2)使用卷積處理,卷積核大小為5×5,卷積核數(shù)量為256:network=conv_2d(network,256,5,activation='relu')使用池化處理,池化大小為3×3,步長為2:network=max_pool_2d(network,3,strides=2)使用卷積處理,卷積核大小為3×3,卷積核數(shù)量為384:network=conv_2d(network,384,3,activation='relu')使用卷積處理,卷積核大小為3×3,卷積核數(shù)量為384:network=conv_2d(network,384,3,activation='relu')使用卷積處理,卷積核大小為3×3,卷積核數(shù)量為256:network=conv_2d(network,256,3,activation='relu')使用池化處理,池化大小為3×3,步長為2:network=max_pool_2d(network,3,strides=2)標(biāo)準(zhǔn)化處理張量,并與節(jié)點數(shù)為4096的隱藏層進(jìn)行全連接,為了避免過擬合,使用Dropout讓部分節(jié)點臨時失效:network=local_response_normalization(network)

network=fully_connected(network,4096,activation='tanh')

network=dropout(network,0.5)

etwork=fully_connected(network,4096,activation='tanh')

network=dropout(network,0.5)最后再與節(jié)點數(shù)為17的隱藏層進(jìn)行全連接,獲得長度為17的一維張量,至此,我們使用AlexNet,完成了大小為227×227×3的張量到大小為1×17的張量的訓(xùn)練轉(zhuǎn)化:network=fully_connected(network,17,activation='softmax')

network=regression(network,optimizer='adam',learning_rate=0.01,

loss='categorical_crossentropy',name='target')2.2.6VGG的結(jié)構(gòu)及實現(xiàn)牛津大學(xué)VGG(VisualGeometryGroup)組在2014年ILSVRC提出的模型被稱作VGG模型,跟以往模型相比,該模型進(jìn)一步加寬和加深了網(wǎng)絡(luò)結(jié)構(gòu),它的核心是5組卷積操作,每兩組之間做Max-Pooling空間降維。同一組內(nèi)采用多次連續(xù)的3×3卷積,卷積核的數(shù)目由較淺組的64增多到最深組的512,同一組內(nèi)的卷積核數(shù)目是一樣的。卷積之后接兩層全連接層,之后是分類層。由于每組內(nèi)卷積層的不同,有11、13、16、19層這幾種模型,圖2-23展示一個16層的網(wǎng)絡(luò)結(jié)構(gòu)。VGG模型結(jié)構(gòu)相對簡潔,提出之后也有很多文章基于此模型進(jìn)行研究,如在ImageNet上首次公開超過人眼識別的模型就是借鑒VGG模型的結(jié)構(gòu)。圖2-23VGG結(jié)構(gòu)依然使用經(jīng)典的Oxford’s17CategoryFlower數(shù)據(jù)集為例。每張圖片大小為227×224,通道數(shù)為3,所以對應(yīng)的張量大小為227×227×3。部分文獻(xiàn)記錄圖片大小為224,這不影響本文的描述與代碼實現(xiàn)。處理Oxford’s17CategoryFlower數(shù)據(jù)集的VGG結(jié)構(gòu)如圖2-24所示,這是一個TensorFlow的結(jié)構(gòu)輸出圖。簡化后的處理流程如下所示,大小為227×227×3張量經(jīng)過如下處理:1)卷積核大小為3×3數(shù)量為64的卷積處理,激活函數(shù)為relu。2)卷積核大小為3×3數(shù)量為64的卷積處理,激活函數(shù)為relu。3)池化大小為2×2的池化處理。4)卷積核大小為3×3數(shù)量為128的卷積處理,激活函數(shù)為relu。5)卷積核大小為3×3數(shù)量為128的卷積處理,激活函數(shù)為relu。6)池化大小為2×2的池化處理。7)卷積核大小為3×3數(shù)量為256的卷積處理,激活函數(shù)為relu。8)卷積核大小為3×3數(shù)量為256的卷積處理,激活函數(shù)為relu。9)卷積核大小為3×3數(shù)量為256的卷積處理,激活函數(shù)為relu。10)池化大小為2×2的池化處理。11)卷積核大小為3×3數(shù)量為512的卷積處理,激活函數(shù)為relu。12)卷積核大小為3×3數(shù)量為512的卷積處理,激活函數(shù)為relu。13)卷積核大小為3×3數(shù)量為512的卷積處理,激活函數(shù)為relu。14)池化大小為2×2的池化處理。15)卷積核大小為3×3數(shù)量為512的卷積處理,激活函數(shù)為relu。16)卷積核大小為3×3數(shù)量為512的卷積處理,激活函數(shù)為relu。圖2-24VGG結(jié)構(gòu)(TensorFlow)圖2-24(續(xù))17)卷積核大小為3×3數(shù)量為512的卷積處理,激活函數(shù)為relu。18)池化大小為2×2的池化處理以及與節(jié)點數(shù)為4096的隱藏層全連接。19)最后得到長度為17的一維張量,對應(yīng)正好是圖像識別后的結(jié)果,即對應(yīng)到17種花卉中的某一種。簡化后的VGG結(jié)構(gòu)如圖2-25所示。下面我們基于TensorFlow一步一步使用代碼實現(xiàn)上述過程。每張圖片大小為227×227可以當(dāng)做一個227×227的矩陣,VGG輸入層的大小為227×227,由于圖像通道數(shù)為3,定義輸入為[None,227,227,3],這樣我們就獲得了大小為227×227×3的張量:network=input_data(shape=[None,227,227,3])使用連續(xù)兩個卷積層處理,每層都是卷積核大小為3×3,卷積核數(shù)量為64,可以理解為通過3×3大小的卷積操作,提取64種特征,激活函數(shù)使用relu:network=conv_2d(network,64,3,activation='relu')

network=conv_2d(network,64,3,activation='relu')使用池化處理,池化大小為2×2,步長為2:network=max_pool_2d(network,2,strides=2)圖2-25簡化的VGG結(jié)構(gòu)使用連續(xù)兩個卷積層處理,每層都是卷積核大小為3×3,卷積核數(shù)量為128,可以理解為通過3×3大小的卷積操作,提取128種特征,激活函數(shù)使用relu:network=conv_2d(network,128,3,activation='relu')

network=conv_2d(network,128,3,activation='relu')使用池化處理,池化大小為2×2,步長為2:network=max_pool_2d(network,2,strides=2)使用連續(xù)3個卷積層處理,每層都是卷積核大小為3×3,卷積核數(shù)量為256,可以理解為通過3×3大小的卷積操作,提取256種特征,激活函數(shù)使用relu:network=conv_2d(network,256,3,activation='relu')

network=conv_2d(network,256,3,activation='relu')

network=conv_2d(network,256,3,activation='relu')使用池化處理,池化大小為2×2,步長為2:network=max_pool_2d(network,2,strides=2)使用連續(xù)3個卷積層處理,每層都是卷積核大小為3×3,卷積核數(shù)量為512,可以理解為通過3×3大小的卷積操作,提取512種特征,激活函數(shù)使用relu:network=conv_2d(network,512,3,activation='relu')

network=conv_2d(network,512,3,activation='relu')

network=conv_2d(network,512,3,activation='relu')使用池化處理,池化大小為2×2,步長為2:network=max_pool_2d(network,2,strides=2)使用連續(xù)3個卷積層處理,每層都是卷積核大小為3×3,卷積核數(shù)量為512,可以理解為通過3×3大小的卷積操作,提取512種特征,激活函數(shù)使用relu:network=conv_2d(network,512,3,activation='relu')

network=conv_2d(network,512,3,activation='relu')

network=conv_2d(network,512,3,activation='relu')使用池化處理,池化大小為2×2,步長為2:network=max_pool_2d(network,2,strides=2)與節(jié)點數(shù)為4096的隱藏層進(jìn)行全連接,為了避免過擬合,使用Dropout讓部分節(jié)點臨時失效:network=local_response_normalization(network)

network=fully_connected(network,4096,activation='tanh')

network=dropout(network,0.5)

etwork=fully_connected(network,4096,activation='tanh')

network=dropout(network,0.5)最后再與節(jié)點數(shù)為17的隱藏層進(jìn)行全連接,獲得長度為17的一維張量,至此我們使用VGG,完成了大小為227×227×3的張量到大小為1×17的張量的訓(xùn)練轉(zhuǎn)化:network=fully_connected(network,17,activation='softmax')

network=regression(network,optimizer='rmsprop',

loss='categorical_crossentropy',

learning_rate=0.0001)2.3基于CNN的文本處理CNN的誕生是為了解決圖像處理領(lǐng)域計算量巨大而無法進(jìn)行深度學(xué)習(xí)的問題,CNN通過卷積計算、池化等大大降低了計算量,同時識別效果滿足需求。圖像通常是二維數(shù)組,文字通常都是一維數(shù)據(jù),是否可以通過某種轉(zhuǎn)換后,也使用CNN對文字進(jìn)行處理呢?答案是肯定的。2.3.1典型的CNN結(jié)構(gòu)我們回顧一下在圖像處理時CNN是如何處理二維數(shù)據(jù)的。如圖2-26所示,CNN使用二維卷積函數(shù)處理小塊圖像,提煉高級特征進(jìn)行進(jìn)一步分析。典型的二維卷積函數(shù)處理圖片的大小為3×3、4×4等。圖2-26CNN處理圖像數(shù)據(jù)的過程同樣原理,我們可以使用一維的卷積函數(shù)處理文字片段,提煉高級特征進(jìn)行進(jìn)一步分析,如圖2-27所示。典型的一維卷積函數(shù)處理文字片段的大小為3、4、5等。圖2-27CNN處理文本數(shù)據(jù)的過程這要感謝YoonKim的經(jīng)典論文《ConvolutionalNeuralNetworksforSentenceClassification》?;赥ensorFlow的處理文本的CNN的結(jié)構(gòu)如圖2-28所示。圖2-28處理文本的CNN結(jié)構(gòu)(TensorFlow)2.3.2典型的CNN代碼實現(xiàn)定義CNN模型,其使用數(shù)量為128核,長度分別為3、4、5的3個一維卷積函數(shù)處理數(shù)據(jù)。使用卷積處理,卷積核長度為3,卷積核數(shù)量為128,可以理解為通過長度為3的卷積操作,提取128種特征,激活函數(shù)使用relu:branch1=conv_1d(network,128,3,padding='valid',activation='relu',regularizer="L2")使用卷積處理,卷積核長度為4,卷積核數(shù)量為128,可以理解為通過長度為4的卷積操作,提取128種特征,激活函數(shù)使用relu:branch2=conv_1d(network,128,4,padding='valid',activation='relu',regularizer="L2")使用卷積處理,卷積核長度為5,卷積核數(shù)量為128,可以理解為通過長度為5的卷積操作,提取128種特征,激活函數(shù)使用relu:branch3=conv_1d(network,128,5,padding='valid',activation='relu',regularizer="L2")合并以上3個卷積的處理后的結(jié)果,并使用一個全連接處理,輸出結(jié)果為一個節(jié)點為2的輸出層:network=merge([branch1,branch2,branch3],mode='concat',axis=1)

network=tf.expand_dims(network,2)

network=global_max_pool(network)

network=dropout(network,0.8)

network=fully_connected(network,2,activation='softmax')

network=regression(network,optimizer='adam',learning_rate=0.001,

loss='categorical_crossentropy',name='target')2.4本章小結(jié)本章重點介紹了CNN的基本原理、典型的CNN結(jié)構(gòu)和基于TensorFlow代碼實現(xiàn),結(jié)合MNIST數(shù)據(jù)集,詳細(xì)介紹了整個數(shù)據(jù)處理過程以及張量的大小變化,介紹了CNN的高級形式AlexNet和VGG的結(jié)構(gòu)和基于TensorFlow的代碼實現(xiàn),并結(jié)合Oxford’s17CategoryFlower數(shù)據(jù)集,詳細(xì)介紹了整個數(shù)據(jù)處理過程。第3章循環(huán)神經(jīng)網(wǎng)絡(luò)在《Web安全之機(jī)器學(xué)習(xí)入門》中,我們介紹了大量的機(jī)器學(xué)習(xí)算法,比如SVM、KNN、樸素貝葉斯等,它們經(jīng)常用于解決分類問題。但是在生活中還有一類問題,比如提供一套視頻,讓你根據(jù)視頻判斷發(fā)生了什么,這類問題本質(zhì)上是需要處理序列化的數(shù)據(jù)。假如讓機(jī)器分析漫畫《火影忍者》中的一集,機(jī)器分析鳴人微笑的這張視頻截圖(見圖3-1),機(jī)器只能判斷大概50%的概率是鳴人剛吃完泡面很開心,30%的概率是鳴人被火影或者師傅表揚,剩下20%的概率是可能打架打贏了,如果沒有上下文,只能判斷到這種地步了。圖3-1鳴人微笑的圖片但是如果機(jī)器記住了視頻開始的時候,鳴人正和佐助格斗(見圖3-2),那么就可以80%以上的概率判斷鳴人微笑是因為打贏了。圖3-2鳴人和佐助格斗的圖片這個例子給我們的啟發(fā)是,處理序列化的數(shù)據(jù),比如視頻或者Linux下一段命令行操作記錄等,準(zhǔn)確的識別與判斷需要依賴上下文,或者說需要能夠保存一段時間的記憶來輔助判斷,這就引入了循環(huán)神經(jīng)網(wǎng)絡(luò)。本章重點介紹循環(huán)神經(jīng)網(wǎng)絡(luò)的基本概念及其主要實現(xiàn)形式和應(yīng)用場景,包括序列分類、序列生成、序列標(biāo)記以及序列轉(zhuǎn)換(也稱為序列翻譯),并介紹了在TensorFlow環(huán)境下的代碼實現(xiàn)。本章演示代碼請參考本書GitHub上的rnn.py文件。3.1循環(huán)神經(jīng)算法概述RNN(RecurrentNeuralNetworks,循環(huán)神經(jīng)網(wǎng)絡(luò))是深度學(xué)習(xí)算法中非常有名的一種算法。RNN之所以稱為循環(huán)神經(jīng)網(wǎng)絡(luò),是因為一個序列當(dāng)前的輸出與前面的輸出也有關(guān)。具體的表現(xiàn)形式為,網(wǎng)絡(luò)會對前面的信息進(jìn)行記憶并應(yīng)用于當(dāng)前輸出的計算中,即隱藏層之間的節(jié)點不再無連接而是有連接的,并且隱藏層的輸入不僅包括輸入層的輸出還包括上一時刻隱藏層的輸出。理論上,RNN能夠?qū)θ魏伍L度的序列數(shù)據(jù)進(jìn)行處理。但是在實踐中,為了降低復(fù)雜性往往假設(shè)當(dāng)前的狀態(tài)只與前面的幾個狀態(tài)相關(guān)\h[1]。RNN的獨特能力來自于它的特殊結(jié)構(gòu),如圖3-3所示,x代表輸入,h代表輸出,輸出的一部分會作為輸入的一部分重新輸入,于是RNN具有了一定的記憶性。把RNN神經(jīng)元展開來分析,圖3-3中的RNN等效于一連串共享系數(shù)的神經(jīng)元串聯(lián)在一起(如圖3-4所示),這也就解釋了RNN特別適合處理時序數(shù)據(jù)的原因。圖3-3RNN結(jié)構(gòu)示例(一)圖3-4RNN結(jié)構(gòu)示例(二)但是生活的經(jīng)驗告訴我們,對于比較復(fù)雜的情況,只分析時序數(shù)據(jù)的最近幾個數(shù)據(jù)難以得到合理的結(jié)果,需要更長的記憶來追根溯源,于是就有了LSTM(LongShortTermMemory,長短程記憶),LSTM可以在更長的時間范圍來分析時序數(shù)據(jù),如圖3-5所示。圖3-5RNN之LSTM示例LSTM的關(guān)鍵就是神經(jīng)細(xì)胞狀態(tài),水平線在圖上方貫穿運行,細(xì)胞狀態(tài)類似于傳送帶,狀態(tài)通過水平線在細(xì)胞之間傳遞(見圖3-6),從而保證長期記憶能保存。LSTM有通過精心設(shè)計的稱作“門”的結(jié)構(gòu)來去除或者增加信息到細(xì)胞狀態(tài)的能力。門是一種讓信息選擇式通過的方法,包含一個Sigmoid神經(jīng)網(wǎng)絡(luò)層和一個乘法操作,如圖3-7所示。Sigmoid層輸出0到1之間的數(shù)值,描述每個部分有多少量可以通過。0代表“不許任何量通過”,1代表“允許任意量通過”\h[2]。圖3-6RNN之LSTM神經(jīng)細(xì)胞狀態(tài)傳遞圖3-7RNN之門結(jié)構(gòu)由于LSTM的優(yōu)異表現(xiàn),它成為了RNN的事實標(biāo)準(zhǔn),后面的例子如果沒有特別聲明,RNN的實現(xiàn)都是基于LSTM。\h[1]/p/9dc9f41f0b29\h[2]/a/110602675_1576273.2單向循環(huán)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)與實現(xiàn)在TensorFlow中,LSTM被封裝成一個組件,使用時只需指定節(jié)點數(shù)即可。以處理序列長度為100的二分類問題為例,處理流程如圖3-8所示。圖3-8基于TensorFlow實現(xiàn)的單向RNN流程對應(yīng)的具體流程依次為:1)輸入張量為長度100的序列,經(jīng)過Embedding,即嵌入處理后,轉(zhuǎn)換成128維張量。2)節(jié)點數(shù)為128的循環(huán)神經(jīng)網(wǎng)絡(luò)組件處理。3)輸入節(jié)點數(shù)為128,隱藏節(jié)點數(shù)為128,輸出節(jié)點數(shù)為2的全連接處理。4)產(chǎn)生維度為2的張量,即分類結(jié)果?;赥ensorFlow實現(xiàn)的單向RNN的結(jié)構(gòu)如圖3-9所示。代碼實現(xiàn)過程如下所示。首先將訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集轉(zhuǎn)換成長度為100的序列,不足100的使用0填充:trainX=pad_sequences(trainX,maxlen=100,value=0.)

testX=pad_sequences(testX,maxlen=100,value=0.)為了處理方便,達(dá)到端到端的訓(xùn)練效果,需要將二分類問題的結(jié)果轉(zhuǎn)換成二維張量:trainY=to_categorical(trainY,nb_classes=2)

testY=to_categorical(testY,nb_classes=2)定義RNN的輸入端,每一個處理的序列長度為100,通常認(rèn)為要處理的序列個數(shù)為無限或者不確定,所以定義input_data的第一個參數(shù)為None,每個序列的長度都是固定的100,所以第二個參數(shù)為100:net=tflearn.input_data([None,100])圖3

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論