1. 程式人生 > >【Tensorflow keras】Keras:基於Theano和TensorFlow的深度學習庫

【Tensorflow keras】Keras:基於Theano和TensorFlow的深度學習庫

catalogue

複製程式碼
1. 引言
2. 一些基本概念
3. Sequential模型
4. 泛型模型
5. 常用層
6. 卷積層
7. 池化層
8. 遞迴層Recurrent
9. 嵌入層 Embedding
複製程式碼

1. 引言

Keras是一個高層神經網路庫,Keras由純Python編寫而成並基Tensorflow或Theano

簡易和快速的原型設計(keras具有高度模組化,極簡,和可擴充特性)
支援CNN和RNN,或二者的結合
支援任意的連結方案(包括多輸入和多輸出訓練)
無縫CPU和GPU切換

0x1: Keras設計原則

複製程式碼
1. 模組性: 模型可理解為一個獨立的序列或圖,完全可配置的模組以最少的代價自由組合在一起。具體而言,網路層、損失函式、優化器、初始化策略、啟用函式、正則化方法都是獨立的模組,我們可以使用它們來構建自己的模型
2. 極簡主義: 每個模組都應該儘量的簡潔。每一段程式碼都應該在初次閱讀時都顯得直觀易懂。沒有黑魔法,因為它將給迭代和創新帶來麻煩 3. 易擴充套件性: 新增新模組超級簡單的容易,只需要仿照現有的模組編寫新的類或函式即可。建立新模組的便利性使得Keras更適合於先進的研究工作 4. 與Python協作: Keras沒有單獨的模型配置檔案型別,模型由python程式碼描述,使其更緊湊和更易debug,並提供了擴充套件的便利性
複製程式碼

0x2: 快速開始

sudo apt-get install libblas-dev liblapack-dev libatlas-base-dev gfortran
pip install scipy

Keras的核心資料結構是“模型”,模型是一種組織網路層的方式。Keras中主要的模型是Sequential模型,Sequential是一系列網路層按順序構成的棧

from keras.models import Sequential

model = Sequential()

將一些網路層通過.add()堆疊起來,就構成了一個模型:

from keras.layers import Dense, Activation

model.add(Dense(output_dim=64, input_dim=100))
model.add(Activation("relu
")) model.add(Dense(output_dim=10)) model.add(Activation("softmax"))

完成模型的搭建後,我們需要使用.compile()方法來編譯模型:

model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])

編譯模型時必須指明損失函式和優化器,如果你需要的話,也可以自己定製損失函式。Keras的一個核心理念就是簡明易用同時,保證使用者對Keras的絕對控制力度,使用者可以根據自己的需要定製自己的模型、網路層,甚至修改原始碼

from keras.optimizers import SGD
model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.01, momentum=0.9, nesterov=True))

完成模型編譯後,我們在訓練資料上按batch進行一定次數的迭代訓練,以擬合網路

model.fit(X_train, Y_train, nb_epoch=5, batch_size=32)

當然,我們也可以手動將一個個batch的資料送入網路中訓練,這時候需要使用

model.train_on_batch(X_batch, Y_batch)

隨後,我們可以使用一行程式碼對我們的模型進行評估,看看模型的指標是否滿足我們的要求

loss_and_metrics = model.evaluate(X_test, Y_test, batch_size=32)

或者,我們可以使用我們的模型,對新的資料進行預測

classes = model.predict_classes(X_test, batch_size=32)
proba = model.predict_proba(X_test, batch_size=32)

Relevant Link:

複製程式碼
https://github.com/fchollet/keras
http://playground.tensorflow.org/#activation=tanh&regularization=L1&batchSize=10&dataset=circle&regDataset=reg-plane&learningRate=0.03&regularizationRate=0.001&noise=45&networkShape=4,5&seed=0.75320&showTestData=true&discretize=true&percTrainData=50&x=true&y=true&xTimesY=true&xSquared=true&ySquared=true&cosX=false&sinX=true&cosY=false&sinY=true&collectStats=false&problem=classification&initZero=false&hideText=false
複製程式碼

2. 一些基本概念

0x1: 符號計算

Keras的底層庫使用Theano或TensorFlow,這兩個庫也稱為Keras的後端。無論是Theano還是TensorFlow,都是一個"符號主義"的庫。
因此,這也使得Keras的程式設計與傳統的Python程式碼有所差別。籠統的說,符號主義的計算首先定義各種變數,然後建立一個“計算圖”,計算圖規定了各個變數之間的計算關係。建立好的計算圖需要編譯已確定其內部細節,然而,此時的計算圖還是一個"空殼子",裡面沒有任何實際的資料,只有當你把需要運算的輸入放進去後,才能在整個模型中形成資料流,從而形成輸出值。
Keras的模型搭建形式就是這種方法,在你搭建Keras模型完畢後,你的模型就是一個空殼子,只有實際生成可呼叫的函式後(K.function),輸入資料,才會形成真正的資料流

0x2: 張量

使用這個詞彙的目的是為了表述統一,張量可以看作是向量、矩陣的自然推廣,我們用張量來表示廣泛的資料型別 
規模最小的張量是0階張量,即標量,也就是一個數 
當我們把一些數有序的排列起來,就形成了1階張量,也就是一個向量 
如果我們繼續把一組向量有序的排列起來,就形成了2階張量,也就是一個矩陣 
把矩陣摞起來,就是3階張量,我們可以稱為一個立方體,具有3個顏色通道的彩色圖片就是一個這樣的立方體
張量的階數有時候也稱為維度,或者軸,軸這個詞翻譯自英文axis。譬如一個矩陣[[1,2],[3,4]],是一個2階張量,有兩個維度或軸,沿著第0個軸(為了與python的計數方式一致,本文件維度和軸從0算起)你看到的是[1,2],[3,4]兩個向量,沿著第1個軸你看到的是[1,3],[2,4]兩個向量。

複製程式碼
import numpy as np

a = np.array([[1,2],[3,4]])
sum0 = np.sum(a, axis=0)
sum1 = np.sum(a, axis=1)

print sum0
print sum1
複製程式碼

0x3: 泛型模型

在原本的Keras版本中,模型其實有兩種

1. 一種叫Sequential,稱為序貫模型,也就是單輸入單輸出,一條路通到底,層與層之間只有相鄰關係,跨層連線統統沒有。這種模型編譯速度快,操作上也比較簡單
2. 第二種模型稱為Graph,即圖模型,這個模型支援多輸入多輸出,層與層之間想怎麼連怎麼連,但是編譯速度慢。可以看到,Sequential其實是Graph的一個特殊情況 

在現在這版Keras中,圖模型被移除,而增加了了“functional model API”,這個東西,更加強調了Sequential是特殊情況這一點。一般的模型就稱為Model,然後如果你要用簡單的Sequential,OK,那還有一個快捷方式Sequential。

Relevant Link:

http://keras-cn.readthedocs.io/en/latest/getting_started/concepts/

3. Sequential模型

Sequential是多個網路層的線性堆疊
可以通過向Sequential模型傳遞一個layer的list來構造該模型

複製程式碼
from keras.models import Sequential
from keras.layers import Dense, Activation

model = Sequential([
Dense(32, input_dim=784),
Activation('relu'),
Dense(10),
Activation('softmax'),
])
複製程式碼

也可以通過.add()方法一個個的將layer加入模型中:

model = Sequential()
model.add(Dense(32, input_dim=784))
model.add(Activation('relu'))

0x1: 指定輸入資料的shape

模型需要知道輸入資料的shape,因此,Sequential的第一層需要接受一個關於輸入資料shape的引數,後面的各個層則可以自動的推匯出中間資料的shape,因此不需要為每個層都指定這個引數。有幾種方法來為第一層指定輸入資料的shape

1. 傳遞一個input_shape的關鍵字引數給第一層,input_shape是一個tuple型別的資料,其中也可以填入None,如果填入None則表示此位置可能是任何正整數。資料的batch大小不應包含在其中。
2. 傳遞一個batch_input_shape的關鍵字引數給第一層,該引數包含資料的batch大小。該引數在指定固定大小batch時比較有用,例如在stateful RNNs中。事實上,Keras在內部會通過新增一個None將input_shape轉化為batch_input_shape
3. 有些2D層,如Dense,支援通過指定其輸入維度input_dim來隱含的指定輸入資料shape。一些3D的時域層支援通過引數input_dim和input_length來指定輸入shape

下面的三個指定輸入資料shape的方法是嚴格等價的

複製程式碼
model = Sequential()
model.add(Dense(32, input_shape=(784,)))

model = Sequential()
model.add(Dense(32, batch_input_shape=(None, 784)))
# note that batch dimension is "None" here,
# so the model will be able to process batches of any size.</pre>

model = Sequential()
model.add(Dense(32, input_dim=784))
複製程式碼

下面三種方法也是嚴格等價的:

複製程式碼
model = Sequential()
model.add(LSTM(32, input_shape=(10, 64)))

model = Sequential()
model.add(LSTM(32, batch_input_shape=(None, 10, 64)))

model = Sequential()
model.add(LSTM(32, input_length=10, input_dim=64))
複製程式碼

0x2: Merge層

多個Sequential可經由一個Merge層合併到一個輸出。Merge層的輸出是一個可以被新增到新  Sequential的層物件。下面這個例子將兩個Sequential合併到一起(activation得到最終結果矩陣)

複製程式碼
from keras.layers import Merge

left_branch = Sequential()
left_branch.add(Dense(32, input_dim=784))

right_branch = Sequential()
right_branch.add(Dense(32, input_dim=784))

merged = Merge([left_branch, right_branch], mode='concat')

final_model = Sequential()
final_model.add(merged)
final_model.add(Dense(10, activation='softmax'))
複製程式碼

Merge層支援一些預定義的合併模式,包括

sum(defualt):逐元素相加
concat:張量串聯,可以通過提供concat_axis的關鍵字引數指定按照哪個軸進行串聯
mul:逐元素相乘
ave:張量平均
dot:張量相乘,可以通過dot_axis關鍵字引數來指定要消去的軸
cos:計算2D張量(即矩陣)中各個向量的餘弦距離

這個兩個分支的模型可以通過下面的程式碼訓練:

final_model.compile(optimizer='rmsprop', loss='categorical_crossentropy')
final_model.fit([input_data_1, input_data_2], targets)  # we pass one data array per model input

也可以為Merge層提供關鍵字引數mode,以實現任意的變換,例如

merged = Merge([left_branch, right_branch], mode=lambda x: x[0] - x[1])

對於不能通過Sequential和Merge組合生成的複雜模型,可以參考泛型模型API

0x3: 編譯

在訓練模型之前,我們需要通過compile來對學習過程進行配置。compile接收三個引數

1. 優化器optimizer:該引數可指定為已預定義的優化器名,如rmsprop、adagrad,或一個Optimizer類的物件 
2. 損失函式loss:該引數為模型試圖最小化的目標函式,它可為預定義的損失函式名,如categorical_crossentropy、mse,也可以為一個損失函式 
3. 指標列表metrics:對分類問題,我們一般將該列表設定為metrics=['accuracy']。指標可以是一個預定義指標的名字,也可以是一個使用者定製的函式.指標函式應該返回單個張量,或一個完成metric_name - > metric_value對映的字典

指標列表就是用來生成最後的判斷結果的

複製程式碼
# for a multi-class classification problem
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])

# for a binary classification problem
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])

# for a mean squared error regression problem
model.compile(optimizer='rmsprop',
loss='mse')

# for custom metrices


# for custom metrics
import keras.backend as K

def mean_pred(y_true, y_pred):
    return K.mean(y_pred)

def false_rates(y_true, y_pred):
    false_neg = ...
    false_pos = ...
    return {
        'false_neg': false_neg,
        'false_pos': false_pos,
    }

model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy', mean_pred, false_rates])
複製程式碼

0x4: 訓練

Keras以Numpy陣列作為輸入資料和標籤的資料型別。訓練模型一般使用fit函式

複製程式碼
# for a single-input model with 2 classes (binary):
model = Sequential()
model.add(Dense(1, input_dim=784, activation='sigmoid'))
model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy
            
           

相關推薦

Tensorflow kerasKeras:基於TheanoTensorFlow深度學習

catalogue 1. 引言 2. 一些基本概念 3. Sequential模型 4. 泛型模型 5. 常用層 6. 卷積層 7. 池化層 8. 遞迴層Recurrent 9. 嵌入層 Embedding 1. 引言 Keras是一

Keras:基於TheanoTensorFlow深度學習之中文文件

  本部落格主要給出某些必備的部分(一直更新中),詳細內容請移步至Github以及MoyanZitto的主頁。 第一部分:快速開始Keras   Keras的核心資料結構是“模型”,模型是一種組織網路層的方式。Keras中主要的模型是Sequ

Keras: 基於TheanoTensorFlow的快速深度學習

徐海蛟教學 Keras是一個極簡和高度模組化的神經網路庫,Keras由純Python編寫而成並基Tensorflow或Theano。Keras 為支援快速實驗而生,能夠把你的idea迅速轉換為結果,學習門檻較低。 Windows的版本選擇,可採用Windows 7 / 1

Deeplearning4j 實戰(8) : Keras為媒介匯入Tensorflow/Theano等其他深度學習的模型

在之前的幾篇部落格中,我直接通過Deeplearning4j進行建模、訓練以及評估預測。但在實際使用中,各個團隊未必都會將Deeplearning4j作為首選的開源庫。這樣一來,模型的複用就變得非常困難,無形中增加了重複勞動的成本。雖然我們可以自己開發一套不同庫之間模型轉換的工具,但是這需要對轉換雙

線上直播揭祕機器視覺中的深度學習

講師:曲曉峰   講師簡介: 曲曉峰,清華大學深圳研究生在站博士後。香港理工大學-電子計算學系-人體生物特徵識別研究中心哲學博士。碩士畢業於瀋陽工業大學-視覺檢測技術研究所(德州儀器TIDSP聯合實驗室)、檢測技術與自動化裝置專業。 研究方向:人體生物特徵識別、深度學習、機器視覺。從事影

電腦科學2018.02含原始碼一種目標分類的深度學習預測模型

本文為荷蘭代爾夫特理工大學(作者:N.E. Sahla)的碩士論文,共58頁。 在過去的十年,全球倉儲自動化市場迅速而顯著地增長。最大的挑戰在於識別和處理不同的物件。本研究旨在探討物件特徵,例如大小或形狀與條形碼位置之間是否存在可用的關係,從而穩健地辨識儲存箱中的物件。在MATLA

備忘python神經網路演算法與深度學習視訊

先準備好一個大硬碟,照著這個學習路線學習!站長也在學習這個教程,沿著數學->演算法->機器學習->資料探勘(分析)->人工智慧的學習路線學習。 第00_安裝包、開發工具、註冊(贈品) 第01階段-基礎必備篇    python3.6視訊零基礎2周快速

Keras切換後端(TheanoTensorFlow

原文見:http://blog.csdn.net/tangwenbo124/article/details/52627774?locationNum=7 實驗室新裝了keras,發現keras預設後端是tensorflow,想換回theano,看了官方文件也沒搞懂,最終

Keras 切換後端(TheanoTensorFlow

實驗室新裝了keras,發現keras預設後端是tensorflow,想換回theano,看了官方文件也沒搞懂,最終搞定,很簡單。 中文文件的描述:keras中文文件,切換後端 其實就是在C:\Us

keraskeras使用方法集合(持續更新中)

本文內容如下: 1. keras中,shape如何定義? 2. 關於model.compile 的引數傳遞,傳遞字串呢?還是傳遞物件? 3. 如何獲取模型中的每個layer資訊?如input_shape,output_shape,layer的引數配置等 4. 如何將預訓練好的詞向量載

23個深度學習大排名:TensorFlow最活躍、Keras最受歡迎,Theano 屌絲逆襲

開源最前線(ID:OpenSourceTop) 猿妹 編譯 來源:https://github.com/thedataincubator/data-science-blogs/blob/master/deep-learning-libraries.md The Data Incubator 最近

爬蟲筆記1改進——基於selenium影象識別的百度指數爬蟲

最近在和小夥伴一同做一個有關投資者情緒分析的專案,除了實現一些文字挖掘的演算法外,其實這個專案絕大部分的任務量是在文字資料的獲取上,也就是網路爬蟲。以前雖學了些H5+CSS網路開發的技術,但網路爬蟲接觸很少,索性花了點時間把爬蟲技術從頭到尾學了一遍。這不到一個月來,利用閒餘時

設計模式簡單工廠模式工廠方法模式

產生 for plm nbsp osc rbm play stp mage > 簡單工廠模式 顧名思義,此模式的設計結構是簡單的,核心是生產對象。 一般來說,運用工廠模式生產的對象應該是構建對象的過程比較復雜的,獲取構建對象的過程在日後可能發生變更的。 簡單工廠

Cocos2d-x坐標系圖層

pac 多說 pan art world 地圖 分辨 play instance 在Cocos2D-X中,存在四種坐標系: 1、OpenGL坐標系:該坐標系原點在屏幕左下角。x軸向右,y軸向上。這也就是cocos2dx中用到的坐標系所以沒啥好說的。 2、屏幕坐標系(UI

轉載:Java基礎InputStream 、 InputStreamReaderBufferedReader

gen 結果 取字符 sys try eight string font buffer 來源:http://blog.csdn.net/zgljl2012/article/details/47267609 在Java中,上述三個類經常用於處理數據流,下面介紹一下三個類的

Python自學之路第一篇:Python簡介入門

youtube 通用 too 互聯網公司 python腳本 bar strong 重裝 排行 Python前世今生 python的創始人為吉多·範羅蘇姆(Guido van Rossum)。1989年的聖誕節期間,吉多·範羅蘇姆為了在阿姆斯特丹打發時間,決心開發一個新的腳本

linux基礎rpm安裝程序管理

rpm使用1.了解應用程序應用程序(app):安裝在os上完成特定功能的軟件。應用程序的類型:*.rpm(redhat分支默認軟件格式),*.deb(debian分支默認軟件格式),源代碼(通用的軟件格式,也是生成rpm和deb的基礎),其他自帶安裝程序及免安裝的軟件。用戶程序常用的目錄:/etc,/var/

spring BootSpring中@Controller@RestController之間的區別

處理 public 不同 esp 舉例 rest control tro adding spring Boot入手的第一天,看到例子中的@RestController ............. 相同點:都是用來表示Spring某個類的是否可以接收HTTP請求 不同點:@C

Django 第二篇render、redirect方向生產URL

規則 app nbsp 場景 http 設計 配置 建立 get 一、知識點回顧 1、MTV模型   model:模型,和數據庫相關的   template:模板,存放html文件,模板語法(目的是將變量如何巧妙的嵌入到HTML頁面中)。   views:視圖函數 另加u

轉摘TFS上分支標簽的用法

項目發布 運行 任務並發 系統 gui 特定 恢復 程序員 div 引用路徑:http://blog.csdn.net/cxzhq2002/article/details/8518250 什麽時候用分支: 例如為某個客戶定制的專用版本,和主幹的特性有很大差別.不具通用