使用keras實現MLP的三種簡單方式

本章是利用keras實現MLP三種方式(序列模型、函數模型、子類模型),分別搭建回歸神經網絡,分類神經網絡,以及寬深神經網絡

Tensorflow2.2的安裝教程可參考 http://www.lxweimin.com/p/293ba064d1cb

1、使用順序模型創建分類神經網絡

1.1準備數據

import tensorflow as tf
from  sklearn.model_selection import train_test_split
from tensorflow import keras
import pandas as pd
import matplotlib.pyplot as plt

(X_train_full, y_train_full),(X_test,y_test) = keras.datasets.fashion_mnist.load_data()
X_train, X_valid, y_train, y_valid = train_test_split(X_train_full, y_train_full, random_state=42, stratify=y_train_full)
X_train = X_train/255
X_valid = X_valid/255
X_test = X_test/255
#創建一個列表表示每類要處理的對象
class_names = ["T-shirt/top", "Trouser", "Pullover", "Dress", "Coat","Sandal", "Shirt", "Sneaker", "Bag", "Ankle boot"]

查看數據表示

plt.figure(figsize=(10,5))
for index in range(10):
    plt.subplot(2,5,index+1)
    plt.imshow(X_train_full[index], cmap='binary')
    plt.title(class_names[y_train_full[index]])

1.2構建模型

#第一行創建了一個Sequential,這是神經網絡中最簡單的keras模型,他僅有順序單層堆疊而成
model = keras.models.Sequential()
#這一層作為輸入層,也可以使用keras.layers.InputLayer
model.add(keras.layers.Flatten(input_shape = X_train.shape[1:]))
model.add(keras.layers.Dense(300, activation='relu'))
#層與層之間應該越來越小,因為越往上面層提取的有效信息越大
model.add(keras.layers.Dense(100, activation='relu'))
#輸出層
model.add(keras.layers.Dense(10,activation='softmax'))

同樣也可以使用這種方式:

model = keras.models.Sequential([
  keras.layers.Flatten(input_shape = X_train.shape[1:]),
  keras.layers.Dense(300, activation='relu'),
  keras.layers.Dense(100, activation='relu'),
  keras.layers.Dense(10,activation='softmax')
])

1.3了解 Dense參數

需要注意Dense中activation激活函數可以用以下幾種

import numpy as np
def sigmoid(z):
    return 1 / (1 + np.exp(-z))

def relu(z):
    return np.maximum(0, z)


plt.figure(figsize=(10,5))
z= np.linspace(-5,5,1000)
plt.plot(z, sigmoid(z), 'r-', label='sigmoid')
plt.plot(z, np.sign(z), 'g--', label ='step')
plt.plot(z, np.tanh(z), 'b-.', label='tanh')
plt.plot(z, relu(z), 'm-', label='relu')
plt.legend()
plt.gca()
plt.grid(True)
plt.axis([-5, 5, -1.2, 1.2])

最常用的是relu

1.4 設置compile參數()指定優化器,計算損失函數的方法

創建模型后調用compile

model.compile(loss=keras.losses.sparse_categorical_crossentropy, optimizer = 'sgd', metrics = 'accuracy')

此代碼需要一些解釋。首先,我們使用"sparse_categorical_crossentropy"損失,因為我們具有稀疏標簽(即對于每個實例,只有一個目標類索引,在這種情況下為0到9),并且這些類是互斥的。相反,如果每個實例的每個類都有一個目標概率(例如獨熱向量,[0.,0.,0.,1.,0.,0.,0.,0.,0.,0]代表類3),則我們需要使用"categorical_crossentropy"損失。如果我們正在執行二進制分類(帶有一個或多個二進制標簽),則在輸出層中使用"sigmoid"(即邏輯)激活函數,而不是"softmax"激活函數,并且使用"binary_crossentropy"損失。
如果要將稀疏標簽(即類索引)轉換為獨熱向量標簽,使用keras.utils.to_categorical()函數。反之則使用np.argmax()函數和axis=1。關于優化器,"sgd"表示我們使用簡單的隨機梯度下降來訓練模型。換句話說,Keras將執行先前所述的反向傳播算法(即反向模式自動微分加梯度下降)。我們將在第11章中討論更有效的優化器(它們改進梯度下降部分,而不是自動微分)。
使用SGD優化器時,調整學習率很重要。因此通常需要使用optimizer=keras.optimizers.SGD(lr=浮點數)來設置學習率,而不是使用optimizer="sgd"(默認值為lr=0.01)來設置學習率。最后,由于這是一個分類器,因此在訓練和評估過程中測量其"accuracy"很有用。

1.5 訓練模型

現在該模型已準備好進行訓練。為此我們只需要調用其fit()方法即可:

history = model.fit(X_train, y_train, epochs=20, validation_split=.2)

1.6評估泛化能力

model.evaluate(X_test, y_test)

第一個分類模型

2、使用順序模型創建回歸神經網絡

2.1數據準備

from sklearn.datasets import fetch_california_housing
from sklearn.preprocessing import StandardScaler
housing = fetch_california_housing()
X_train,X_test, y_train,y_test = train_test_split(housing.data, housing.target)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

2.2模型構建

model = keras.models.Sequential([
    keras.layers.Dense(30,activation='relu', input_shape=X_train.shape[1:]),
    keras.layers.Dense(1)
])

2.3 設置優化器,損失函數

model.compile(loss=keras.losses.mean_squared_error, optimizer = 'sgd')

2.4訓練

history = model.fit(X_train,y_train, epochs=10, validation_split=.2)

3、使用函數模型創建寬深神經網絡(一個輸入,一個輸出)

我們要創建的寬深神經網絡圖如下


3.1 構建模型

input_ = keras.layers.Input(shape=X_train.shape[1:])
hidden1 = keras.layers.Dense(30, activation='relu')(input_)
hidden2 = keras.layers.Dense(30, activation='relu')(hidden1)
concat = keras.layers.Concatenate()([input_, hidden2])
output = keras.layers.Dense(1)(concat)
model = keras.Model(inputs = [input_],outputs=[output])

3.2設置損失函數和優化器

model.compile(loss=keras.losses.mean_squared_error, optimizer = 'sgd')

3.3訓練模型

history = model.fit(X_train,y_train, epochs=10, validation_split=.2)

4、使用函數模型創建寬深神經網絡(二個輸入,一個輸出)

創建的寬深神經網絡如下圖:


4.1 構建模型

input_A = keras.layers.Input(shape=[5])
input_B = keras.layers.Input(shape=[6])
hidden1 = keras.layers.Dense(30, activation='relu')(input_B)
hidden2 = keras.layers.Dense(30, activation='relu')(hidden1)
concat = keras.layers.Concatenate()([input_A, hidden2])
output = keras.layers.Dense(1)(concat)
model = keras.Model(inputs =[input_A, input_B], outputs= [output])

4.2設置損失后漢書和優化器

model.compile(loss=keras.losses.mean_squared_error, optimizer = 'sgd')

4.3訓練模型

history = model.fit((X_train[:,:5],X_train[:,2:]),y_train, epochs=10, validation_split=.2)

5、使用函數模型創建寬深神經網絡(二個輸入,二個輸出)

創建的寬深神經網絡如下圖:


5.1 構建模型

input_A = keras.layers.Input(shape=[5])
input_B = keras.layers.Input(shape=[6])
hidden1 = keras.layers.Dense(30, activation='relu')(input_B)
hidden2 = keras.layers.Dense(30, activation='relu')(hidden1)
aux_output = keras.layers.Dense(1, name='aux')(hidden2)
concat = keras.layers.Concatenate()([input_A, hidden2])
main_output = keras.layers.Dense(1, name='main')(concat)
model = keras.Model(inputs =[input_A, input_B], outputs= [main_output,aux_output])

5.2設置損失后漢書和優化器

model.compile(loss=[keras.losses.mean_squared_error, keras.losses.mean_squared_error], loss_weights=[.9,.1] ,optimizer = 'sgd')

5.3訓練模型

history = model.fit((X_train[:,:5],X_train[:,2:]),[y_train, y_train], epochs=10, validation_split=.2)

6、子類模型創建寬深神經網絡

創建的神經網絡如下圖:


6.1、創建子類

class WideAndDeepModel(keras.Model):
    def __init__(self, units=30, activation="relu", **kwargs):
        super().__init__(**kwargs)
        self.hidden1 = keras.layers.Dense(units, activation=activation)
        self.hidden2 = keras.layers.Dense(units, activation=activation)
        self.main_output = keras.layers.Dense(1)
        self.aux_output = keras.layers.Dense(1)
        
    def call(self, inputs):
        input_A , input_B = inputs
        hidden1 = self.hidden1(input_B)
        hidden2 = self.hidden2(hidden1)
        concat = keras.layers.concatenate([input_A, hidden2])
        main_output = self.main_output()(concat)
        aux_output = self.aux_output()(hidden2)
        return main_outputi, aux_output

6.2 創建子類模型

model = WideAnDeepModel(30, activation='relu')
model.compile(loss=['mse'], loss_weights=[.9,.1] ,optimizer = 'sgd')

6.3 訓練模型

history = model.fit([X_train[:,:5],X_train[:,2:]],[y_train, y_train], epochs=10, validation_split=.2)
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容