參考:
各模型完整代碼
周莫煩的教學(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ò)高級(jí)包, 用他來組件一個(gè)神經(jīng)網(wǎng)絡(luò)更加快速, 幾條語句就搞定了. 而且廣泛的兼容性能使 Keras 在 Windows 和 MacOS 或者 Linux 上運(yùn)行無阻礙.
今天來對(duì)比學(xué)習(xí)一下用 Keras 搭建下面幾個(gè)常用神經(jīng)網(wǎng)絡(luò):
它們的步驟差不多是一樣的:
為了對(duì)比學(xué)習(xí),用到的數(shù)據(jù)也差不多是一樣的,
所以本文只把注意力放在 2. [建立模型] 上面,其它步驟大同小異,可以去參考里提到的教學(xué)網(wǎng)站觀看或者直接看源代碼。
目的是對(duì)一組數(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 layermodel = Sequential()model.add(Dense(output_dim=1, input_dim=1))
我們要用 sin 函數(shù)預(yù)測(cè) cos 數(shù)據(jù),會(huì)用到 LSTM 這個(gè)網(wǎng)絡(luò)。
1. 搭建模型,仍然用 Sequential。
2. 然后加入 LSTM 神經(jīng)層。
3. 有個(gè)不同點(diǎn)是 TimeDistributed。
在上一個(gè)回歸問題中,我們是直接加 Dense 層,因?yàn)橹辉谧詈笠粋€(gè)輸出層把它變成一個(gè)全連接層。
今天這個(gè)問題是每個(gè)時(shí)間點(diǎn)都有一個(gè) output,那需要 dense 對(duì)每一個(gè) output 都進(jìn)行一次全連接的計(jì)算。
model = Sequential()# build a LSTM RNNmodel.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 layermodel.add(TimeDistributed(Dense(OUTPUT_SIZE)))adam = Adam(LR)model.compile(optimizer=adam, loss='mse',)
數(shù)據(jù)用的是 Keras 自帶 MNIST 這個(gè)數(shù)據(jù)包,再分成訓(xùn)練集和測(cè)試集。x 是一張張圖片,y 是每張圖片對(duì)應(yīng)的標(biāo)簽,即它是哪個(gè)數(shù)字。
簡(jiǎn)單介紹一下相關(guān)模塊:
import numpy as npnp.random.seed(1337) # for reproducibilityfrom keras.datasets import mnistfrom keras.utils import np_utilsfrom keras.models import Sequentialfrom keras.layers import Dense, Activationfrom keras.optimizers import RMSprop
在回歸網(wǎng)絡(luò)中用到的是 model.add 一層一層添加神經(jīng)層,今天的方法是直接在模型的里面加多個(gè)神經(jīng)層。好比一個(gè)水管,一段一段的,數(shù)據(jù)是從上面一段掉到下面一段,再掉到下面一段。
# Another way to build your neural netmodel = Sequential([ Dense(32, input_dim=784), Activation('relu'), Dense(10), Activation('softmax'),])
數(shù)據(jù)仍然是用 mnist。
1. 建立網(wǎng)絡(luò)第一層,建立一個(gè) Convolution2D,參數(shù)有 filter 的數(shù)量。
# Another way to build your CNNmodel = 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è)向下取樣的過程.
它可以縮小生成出來的長(zhǎng)和寬,高度不需要被壓縮。
# 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)層
# 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)接層
# 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 classesmodel.add(Dense(10))model.add(Activation('softmax'))
RNN 是一個(gè)序列化的神經(jīng)網(wǎng),我們處理圖片數(shù)據(jù)的時(shí)候,也要以序列化的方式去考慮。
圖片是由一行一行的像素組成,我們就一行一行地去序列化地讀取數(shù)據(jù)。最后再進(jìn)行一個(gè)總結(jié),來決定它到底是被分辨成哪一類。
用到的參數(shù)含義:
1. 用 Sequential 建立模型,就是一層一層地加上神經(jīng)層。
# build RNN modelmodel = Sequential()
2. 加上 SimpleRNN。
batch_input_shape 就是在后面處理批量的訓(xùn)練數(shù)據(jù)時(shí)它的大小是多少,有多少個(gè)時(shí)間點(diǎn),每個(gè)時(shí)間點(diǎn)有多少個(gè)像素。
# RNN cellmodel.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 長(zhǎng)度為 10,接著用 softmax 激活函數(shù)用于分類。
# output layermodel.add(Dense(OUTPUT_SIZE))model.add(Activation('softmax'))
4. 在訓(xùn)練的時(shí)候有一個(gè)小技巧,就是怎么去處理批量。
輸出結(jié)果時(shí)每 500 步輸出一下測(cè)試集的準(zhǔn)確率和損失。
需要用到 BATCH_INDEX,一批批地截取數(shù)據(jù),下一批的時(shí)候,這個(gè) BATCH_INDEX 就需要累加,后面的時(shí)間點(diǎn)和步長(zhǎng)沒有變化都是28。
y 的批量和 x 的處理是一樣的,只不過 y 只有二維,所以它只有兩個(gè)參數(shù)。
后面有一個(gè)判斷語句,如果這個(gè) index 大于訓(xùn)練數(shù)據(jù)的總數(shù),index 就變?yōu)?0,再?gòu)念^開始一批批處理。
# trainingfor 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)
自編碼,簡(jiǎn)單來說就是把輸入數(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 figureencoding_dim = 2# this is our input placeholderinput_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é),它的過程和壓縮的過程是正好相反的。
相對(duì)應(yīng)層的激活函數(shù)也是一樣的,不過在解壓的最后一層用到的激活函數(shù)是 tanh
。因?yàn)檩斎胫凳怯?-0.5 到 0.5 這個(gè)范圍,在最后一層用這個(gè)激活函數(shù)的時(shí)候,它的輸出是 -1 到 1,可以是作為一個(gè)很好的對(duì)應(yīng)。
# encoder layersencoded = 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 layersdecoded = 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 modelautoencoder = Model(input=input_img, output=decoded)
接下來直接用 Model
這個(gè)模塊來組建模型
輸入就是圖片,輸出是解壓的最后的結(jié)果。
# construct the encoder model for plottingencoder = Model(input=input_img, output=encoder_output)
當(dāng)我們想要看由 784 壓縮到 2維后,這個(gè)結(jié)果是什么樣的時(shí)候,也可以只單獨(dú)組建壓縮的板塊,此時(shí)它的輸入是圖片,輸出是壓縮環(huán)節(jié)的最后結(jié)果。
最后分類的可視化結(jié)果:
我是 不會(huì)停的蝸牛 Alice
85后全職主婦
喜歡人工智能,行動(dòng)派
創(chuàng)造力,思考力,學(xué)習(xí)力提升修煉進(jìn)行中
歡迎您的喜歡,關(guān)注和評(píng)論!
聯(lián)系客服