一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

對比學(xué)習(xí)用 Keras 搭建 CNN RNN 等常用神經(jīng)網(wǎng)絡(luò)

 imelee 2017-04-01

參考:
各模型完整代碼
周莫煩的教學(xué)網(wǎng)站
這個(gè)網(wǎng)站上有很多機(jī)器學(xué)習(xí)相關(guān)的教學(xué)視頻,推薦上去學(xué)習(xí)學(xué)習(xí)。

Keras 是一個(gè)兼容 Theano 和 Tensorflow 的神經(jīng)網(wǎng)絡(luò)高級包, 用他來組件一個(gè)神經(jīng)網(wǎng)絡(luò)更加快速, 幾條語句就搞定了. 而且廣泛的兼容性能使 Keras 在 Windows 和 MacOS 或者 Linux 上運(yùn)行無阻礙.

今天來對比學(xué)習(xí)一下用 Keras 搭建下面幾個(gè)常用神經(jīng)網(wǎng)絡(luò):

  1. 回歸
  2. RNN回歸
  3. 分類
  4. CNN分類
  5. RNN分類
  6. 自編碼分類

它們的步驟差不多是一樣的:

  1. [導(dǎo)入模塊并創(chuàng)建數(shù)據(jù)]
  2. [建立模型]
  3. [定義優(yōu)化器]
  4. [激活模型]
  5. [訓(xùn)練模型]
  6. [檢驗(yàn)?zāi)P蚞
  7. [可視化結(jié)果]

為了對比學(xué)習(xí),用到的數(shù)據(jù)也差不多是一樣的,
所以本文只把注意力放在 2. [建立模型] 上面,其它步驟大同小異,可以去參考里提到的教學(xué)網(wǎng)站觀看或者直接看源代碼。


1. 回歸

目的是對一組數(shù)據(jù)進(jìn)行擬合。


1. 用 Sequential 建立 model
2. 再用 model.add 添加神經(jīng)層,添加的是 Dense 全連接神經(jīng)層。

參數(shù)有兩個(gè),一個(gè)是輸入數(shù)據(jù)和輸出數(shù)據(jù)的維度,本代碼的例子中 x 和 y 是一維的。

如果需要添加下一個(gè)神經(jīng)層的時(shí)候,不用再定義輸入的緯度,因?yàn)樗J(rèn)就把前一層的輸出作為當(dāng)前層的輸入。在這個(gè)例子里,只需要一層就夠了。

# build a neural network from the 1st layer to the last layer
model = Sequential()
model.add(Dense(output_dim=1, input_dim=1))

2. RNN回歸

我們要用 sin 函數(shù)預(yù)測 cos 數(shù)據(jù),會用到 LSTM 這個(gè)網(wǎng)絡(luò)。


RNN vs LSTM

1. 搭建模型,仍然用 Sequential。
2. 然后加入 LSTM 神經(jīng)層。

  • batch_input_shape 就是在后面處理批量的訓(xùn)練數(shù)據(jù)時(shí)它的大小是多少,有多少個(gè)時(shí)間點(diǎn),每個(gè)時(shí)間點(diǎn)有多少個(gè)數(shù)據(jù)。
  • output_dim 意思是 LSTM 里面有二十個(gè) unit。
  • return_sequences 意思是在每個(gè)時(shí)間點(diǎn),要不要輸出output,默認(rèn)的是 false,現(xiàn)在我們把它定義為 true。如果等于 false,就是只在最后一個(gè)時(shí)間點(diǎn)輸出一個(gè)值。
  • stateful,默認(rèn)的也是 false,意義是批和批之間是否有聯(lián)系。直觀的理解就是我們在讀完二十步,第21步開始是接著前面二十步的。也就是第一個(gè) batch中的最后一步與第二個(gè) batch 中的第一步之間是有聯(lián)系的。

3. 有個(gè)不同點(diǎn)是 TimeDistributed。

在上一個(gè)回歸問題中,我們是直接加 Dense 層,因?yàn)橹辉谧詈笠粋€(gè)輸出層把它變成一個(gè)全連接層。
今天這個(gè)問題是每個(gè)時(shí)間點(diǎn)都有一個(gè) output,那需要 dense 對每一個(gè) output 都進(jìn)行一次全連接的計(jì)算。

model = Sequential()
# build a LSTM RNN
model.add(LSTM(
    batch_input_shape=(BATCH_SIZE, TIME_STEPS, INPUT_SIZE),       # Or: input_dim=INPUT_SIZE, input_length=TIME_STEPS,
    output_dim=CELL_SIZE,
    return_sequences=True,      # True: output at all steps. False: output as last step.
    stateful=True,              # True: the final state of batch1 is feed into the initial state of batch2
))
# add output layer
model.add(TimeDistributed(Dense(OUTPUT_SIZE)))
adam = Adam(LR)
model.compile(optimizer=adam,
              loss='mse',)


3. 分類

數(shù)據(jù)用的是 Keras 自帶 MNIST 這個(gè)數(shù)據(jù)包,再分成訓(xùn)練集和測試集。x 是一張張圖片,y 是每張圖片對應(yīng)的標(biāo)簽,即它是哪個(gè)數(shù)字。

簡單介紹一下相關(guān)模塊:

  • models.Sequential,用來一層一層一層的去建立神經(jīng)層;
  • layers.Dense 意思是這個(gè)神經(jīng)層是全連接層。
  • layers.Activation 激活函數(shù)。
  • optimizers.RMSprop 優(yōu)化器采用 RMSprop,加速神經(jīng)網(wǎng)絡(luò)訓(xùn)練方法。
import numpy as np
np.random.seed(1337)  # for reproducibility
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import RMSprop

在回歸網(wǎng)絡(luò)中用到的是 model.add 一層一層添加神經(jīng)層,今天的方法是直接在模型的里面加多個(gè)神經(jīng)層。好比一個(gè)水管,一段一段的,數(shù)據(jù)是從上面一段掉到下面一段,再掉到下面一段。

  • 第一段就是加入 Dense 神經(jīng)層。32 是輸出的維度,784 是輸入的維度。
    第一層傳出的數(shù)據(jù)有 32 個(gè)feature,傳給激活單元.
  • 激活函數(shù)用到的是 relu 函數(shù)。
    經(jīng)過激活函數(shù)之后,就變成了非線性的數(shù)據(jù)。
  • 然后再把這個(gè)數(shù)據(jù)傳給下一個(gè)神經(jīng)層,這個(gè) Dense 我們定義它有 10 個(gè)輸出的 feature。同樣的,此處不需要再定義輸入的維度,因?yàn)樗邮盏氖巧弦粚拥妮敵觥?/li>
  • 接下來再輸入給下面的 softmax 函數(shù),用來分類。
# Another way to build your neural net
model = Sequential([
    Dense(32, input_dim=784),
    Activation('relu'),
    Dense(10),
    Activation('softmax'),
])

4. CNN分類


CNN

數(shù)據(jù)仍然是用 mnist。

1. 建立網(wǎng)絡(luò)第一層,建立一個(gè) Convolution2D,參數(shù)有 filter 的數(shù)量。

  • filter 就是濾波器,用32個(gè)濾波器掃描同一張圖片,每個(gè)濾波器會總結(jié)出一個(gè) feature。每個(gè)濾波器會生成一整張圖片,有32個(gè)濾波器就會生成32張代表不同特征的圖片,
  • nb_row nb_col 代表這個(gè)濾波器有多少行多少列。
  • border_mode 代表這個(gè)濾波器在過濾時(shí)候用什么方式,這里我們用 same。
    因?yàn)槭堑谝粚?,所以需要定義輸入數(shù)據(jù)的維度,1, 28, 28 就是圖片圖片的維度。
    濾波器完成之后,會生成32層的數(shù)據(jù),但是圖片的長和寬是不變的,仍然是28×28。
  • 之后再加一個(gè) relu 激活函數(shù)。
# Another way to build your CNN
model = Sequential()

# Conv layer 1 output shape (32, 28, 28)
model.add(Convolution2D(
    nb_filter=32,
    nb_row=5,
    nb_col=5,
    border_mode='same',     # Padding method
    dim_ordering='th',      # if use tensorflow, to set the input dimension order to theano ("th") style, but you can change it.
    input_shape=(1,         # channels
                 28, 28,)    # height & width
))
model.add(Activation('relu'))

2. Pooling 是一個(gè)向下取樣的過程.
它可以縮小生成出來的長和寬,高度不需要被壓縮。

  • pool_size 是向下取樣的時(shí)候,考慮多長多寬的圖片。
  • strides 步長,是取完一個(gè)樣之后要跳幾步再取樣,再跳幾步再取樣。
# Pooling layer 1 (max pooling) output shape (32, 14, 14)
model.add(MaxPooling2D(
    pool_size=(2, 2),
    strides=(2, 2),
    border_mode='same',    # Padding method
))

3. 接下來建立第二個(gè)神經(jīng)層

  • 有 64 個(gè) filter,5, 5 的長寬,再跟著一個(gè)激活函數(shù)。
  • 再跟著一個(gè) MaxPooling2D 取樣。
# Conv layer 2 output shape (64, 14, 14)
model.add(Convolution2D(64, 5, 5, border_mode='same'))
model.add(Activation('relu'))

# Pooling layer 2 (max pooling) output shape (64, 7, 7)
model.add(MaxPooling2D(pool_size=(2, 2), border_mode='same'))

4. 接下來進(jìn)入全聯(lián)接層

  • 用 Flatten 把卷出來的三維的層,抹平成二維的。
  • 接下來就加一個(gè) Dense 全聯(lián)接層,抹平就是為了可以把這一個(gè)一個(gè)點(diǎn)全連接成一個(gè)層.
  • 接著再加一個(gè)激活函數(shù)。
# Fully connected layer 1 input shape (64 * 7 * 7) = (3136), output shape (1024)
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('relu'))

5. 在第二個(gè)全連接層,輸出 10 個(gè) unit, 用 softmax 作為分類。

# Fully connected layer 2 to shape (10) for 10 classes
model.add(Dense(10))
model.add(Activation('softmax'))

5. RNN分類


RNN分類

RNN 是一個(gè)序列化的神經(jīng)網(wǎng),我們處理圖片數(shù)據(jù)的時(shí)候,也要以序列化的方式去考慮。
圖片是由一行一行的像素組成,我們就一行一行地去序列化地讀取數(shù)據(jù)。最后再進(jìn)行一個(gè)總結(jié),來決定它到底是被分辨成哪一類。

用到的參數(shù)含義:

  • TIME_STEPS 是要讀取多少個(gè)時(shí)間點(diǎn)的數(shù)據(jù),如果一次讀一行需要讀28次。
  • INPUT_SIZE 每次每一行讀取多少個(gè)像素。
  • BATCH_SIZE 每一批訓(xùn)練多少張。
  • BATCH_INDEX 用來生成數(shù)據(jù)。
  • OUTPUT_SIZE 分類結(jié)果的長度,0到9,所以長度為 10。
  • CELL_SIZE 網(wǎng)絡(luò)中隱藏層要放多少個(gè) unit。
    LR 是學(xué)習(xí)率。

1. 用 Sequential 建立模型,就是一層一層地加上神經(jīng)層。

# build RNN model
model = Sequential()

2. 加上 SimpleRNN。
batch_input_shape 就是在后面處理批量的訓(xùn)練數(shù)據(jù)時(shí)它的大小是多少,有多少個(gè)時(shí)間點(diǎn),每個(gè)時(shí)間點(diǎn)有多少個(gè)像素。

# RNN cell
model.add(SimpleRNN(
    # for batch_input_shape, if using tensorflow as the backend, we have to put None for the batch_size.
    # Otherwise, model.evaluate() will get error.
    batch_input_shape=(None, TIME_STEPS, INPUT_SIZE),       # Or: input_dim=INPUT_SIZE, input_length=TIME_STEPS,
    output_dim=CELL_SIZE,
    unroll=True,
))

3. 加 Dense 輸出層。
輸出 output 長度為 10,接著用 softmax 激活函數(shù)用于分類。

# output layer
model.add(Dense(OUTPUT_SIZE))
model.add(Activation('softmax'))

4. 在訓(xùn)練的時(shí)候有一個(gè)小技巧,就是怎么去處理批量。
輸出結(jié)果時(shí)每 500 步輸出一下測試集的準(zhǔn)確率和損失。

需要用到 BATCH_INDEX,一批批地截取數(shù)據(jù),下一批的時(shí)候,這個(gè) BATCH_INDEX 就需要累加,后面的時(shí)間點(diǎn)和步長沒有變化都是28。
y 的批量和 x 的處理是一樣的,只不過 y 只有二維,所以它只有兩個(gè)參數(shù)。

后面有一個(gè)判斷語句,如果這個(gè) index 大于訓(xùn)練數(shù)據(jù)的總數(shù),index 就變?yōu)?0,再從頭開始一批批處理。

# training
for step in range(4001):
    # data shape = (batch_num, steps, inputs/outputs)
    X_batch = X_train[BATCH_INDEX: BATCH_INDEX+BATCH_SIZE, :, :]
    Y_batch = y_train[BATCH_INDEX: BATCH_INDEX+BATCH_SIZE, :]
    cost = model.train_on_batch(X_batch, Y_batch)
    BATCH_INDEX += BATCH_SIZE
    BATCH_INDEX = 0 if BATCH_INDEX >= X_train.shape[0] else BATCH_INDEX

    if step % 500 == 0:
        cost, accuracy = model.evaluate(X_test, y_test, batch_size=y_test.shape[0], verbose=False)
        print('test cost: ', cost, 'test accuracy: ', accuracy)

6. 自編碼分類


自編碼

自編碼,簡單來說就是把輸入數(shù)據(jù)進(jìn)行一個(gè)壓縮和解壓縮的過程。
原來有很多 Feature,壓縮成幾個(gè)來代表原來的數(shù)據(jù),解壓之后恢復(fù)成原來的維度,再和原數(shù)據(jù)進(jìn)行比較。

做的事情是把 datasets.mnist 數(shù)據(jù)的 28×28=784 維的數(shù)據(jù),壓縮成 2 維的數(shù)據(jù),然后在一個(gè)二維空間中可視化出分類的效果。

模型結(jié)構(gòu):

encoding_dim,要壓縮成的維度。

# in order to plot in a 2D figure
encoding_dim = 2

# this is our input placeholder
input_img = Input(shape=(784,))

建立 encoded 層和 decoded 層,再用 autoencoder 把二者組建在一起。訓(xùn)練時(shí)用 autoencoder 層。

1. encoded 用4層 Dense 全聯(lián)接層
激活函數(shù)用 relu,輸入的維度就是前一步定義的 input_img。
接下來定義下一層,它的輸出維度是64,輸入是上一層的輸出結(jié)果。
在最后一層,我們定義它的輸出維度就是想要的 encoding_dim=2。

2. 解壓的環(huán)節(jié),它的過程和壓縮的過程是正好相反的。
相對應(yīng)層的激活函數(shù)也是一樣的,不過在解壓的最后一層用到的激活函數(shù)是 tanh。因?yàn)檩斎胫凳怯?-0.5 到 0.5 這個(gè)范圍,在最后一層用這個(gè)激活函數(shù)的時(shí)候,它的輸出是 -1 到 1,可以是作為一個(gè)很好的對應(yīng)。

# encoder layers
encoded = Dense(128, activation='relu')(input_img)
encoded = Dense(64, activation='relu')(encoded)
encoded = Dense(10, activation='relu')(encoded)
encoder_output = Dense(encoding_dim)(encoded)

# decoder layers
decoded = Dense(10, activation='relu')(encoder_output)
decoded = Dense(64, activation='relu')(decoded)
decoded = Dense(128, activation='relu')(decoded)
decoded = Dense(784, activation='tanh')(decoded)

# construct the autoencoder model
autoencoder = Model(input=input_img, output=decoded)

接下來直接用 Model 這個(gè)模塊來組建模型
輸入就是圖片,輸出是解壓的最后的結(jié)果。

# construct the encoder model for plotting
encoder = Model(input=input_img, output=encoder_output)

當(dāng)我們想要看由 784 壓縮到 2維后,這個(gè)結(jié)果是什么樣的時(shí)候,也可以只單獨(dú)組建壓縮的板塊,此時(shí)它的輸入是圖片,輸出是壓縮環(huán)節(jié)的最后結(jié)果。

最后分類的可視化結(jié)果:



歷史技術(shù)博文鏈接匯總

我是 不會停的蝸牛 Alice
85后全職主婦
喜歡人工智能,行動派
創(chuàng)造力,思考力,學(xué)習(xí)力提升修煉進(jìn)行中
歡迎您的喜歡,關(guān)注和評論!

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产成人精品综合久久久看| 日本免费一区二区三女| 色无极东京热男人的天堂| 国产精品白丝久久av| 国产精品人妻熟女毛片av久久| 亚洲精品成人综合色在线| 日韩女优视频国产一区| 国产成人午夜av一区二区| 91精品欧美综合在ⅹ| 熟女白浆精品一区二区| 国产精品日韩欧美一区二区| 日本人妻的诱惑在线观看| 国产午夜精品亚洲精品国产| 91日韩欧美在线视频| 69老司机精品视频在线观看| 精品欧美日韩一区二区三区| 欧美美女视频在线免费看| 亚洲国产91精品视频| 中文字幕人妻综合一区二区| 国产极品粉嫩尤物一区二区| 国产成人在线一区二区三区| 成人精品亚洲欧美日韩| 日本女优一区二区三区免费| 欧美一区二区三区在线播放| 欧美精品亚洲精品日韩精品| 亚洲欧美日韩另类第一页| 国产级别精品一区二区视频| 天堂网中文字幕在线观看| 日本在线高清精品人妻| 亚洲永久一区二区三区在线| 偷拍偷窥女厕一区二区视频| 激情五月天免费在线观看| 日本av在线不卡一区| 在线免费视频你懂的观看| 国产成人国产精品国产三级| 亚洲人午夜精品射精日韩| 色婷婷在线精品国自产拍| 亚洲永久一区二区三区在线| 麻豆看片麻豆免费视频| 日韩精品视频高清在线观看| 国产一区欧美午夜福利|