Keras深度學習模型Sequential和Model詳解
Keras模型
在Keras中有兩種深度學習的模型:序列模型(Sequential)和通用模型(Model)。
差異在于不同的拓撲結構。
Sequential序列模型
序列模型各層之間是依次順序的線性關系(多個網絡層的線性堆疊),模型結構通過一個列表來制定,或者逐層添加網絡結構。
通過將網絡層實例的列表傳遞給 Sequential 的構造器,來創(chuàng)建一個 Sequential 模型。
# 導入類 from keras.models import Sequential from keras.layers import Dense, Activation
# 構建Sequential模型
# Model是keras最核心的數據結構
model = Sequential([
Dense(32, input_shape=(784,)),
Activation('relu'),
Dense(10),
Activation('softmax'),
])也可以簡單地使用 .add() 方法將各層添加到模型中
model = Sequential()
model.add(Dense(32, input_dim=784))
model.add(Activation('relu'))
model.add(Dense(10))
model.add(Activation('softmax'))指定輸入數據的尺寸 在第一層,模型需要知道它所期望的輸入尺寸。
而在后面的層中,模型可以自動地推斷尺寸。
- 方式1:傳遞一個input_shape參數給第一層。它是一個表示尺寸的元組(一個由整數或None組成的元組,其中None表示可能為任何正整數)。在input_shape中不包含數據的batch大小。
- 方式2:某些2D層,如Dense,支持通過參數input_dim指定輸入尺寸;某些3D時序層支持input_dim和input_length參數。
- 方式3:如果你需要為你的輸入制定一個固定大小的batch(對stateful RNNs很有用),可以傳遞一個batch_size參數給一個層。如果你同時將batch_size=32和input_shape=(6,8)傳遞給一個層,那么每一批輸入的尺寸就為(32,6,8)。
因此,如下代碼是等價的:
model.add(Dense(32, input_shape=(784,))
model.add(Dense(32, input_dim=784))
模型編譯
在訓練模型之前,通過 compile 方法配置學習過程,接收的參數:
- 優(yōu)化器optimizer:可以是現(xiàn)有優(yōu)化器的字符串標識符(如
rmsprop或adagrad),也可以是Optimizer類的示例,見optimizers; - 損失函數loss:模型試圖最小化的目標函數。他可以使現(xiàn)有損失函數的字符串標識符(如
categorical_crossentropy或mse),也可以是一個目標函數,見losses; - 評估標準metrics:對于任何分類問題,都希望將其設置為
metrics = ['accuracy']。他可以使現(xiàn)有的字符串標識符,也可以是自定義的評估標準函數。
# 分類問題
model.compile(
optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy']
)
# 二分類問題
model.compile(
optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy']
)
# 均方誤差回歸問題
model.compile(
optimizer='rmsprop',
loss='mse'
)
# 自定義評估標準函數
import keras.backend as K
def mean_pred(y_true, y_pred):
return K.mean(y_pred)
model.compile(
optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy', mean_pred]
)模型訓練
在輸入數據和標簽的Numpy矩陣上進行訓練。為了訓練這一個模型,通常會使用 fit 函數,見文檔
# 對于具有2個類的單輸入模型(二進制分類)
model = Sequential()
model.add(Dense(32, activation='relu', input_dim=100))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
# 生成虛擬數據
import numpy as np
data = np.random.random((1000, 100))
labels = np.random.randint(2, size=(1000, 1))
# 訓練模型,以32個樣本為一個batch進行迭代
model.fit(data, labels, epochs=10, batch_size=32)Epoch 1/10 1000/1000 [==============================] - 0s 105us/step - loss: 0.7028 - accuracy: 0.4980 Epoch 2/10 1000/1000 [==============================] - 0s 32us/step - loss: 0.6932 - accuracy: 0.5380 Epoch 3/10 1000/1000 [==============================] - 0s 34us/step - loss: 0.6862 - accuracy: 0.5510 Epoch 4/10 1000/1000 [==============================] - 0s 34us/step - loss: 0.6842 - accuracy: 0.5580 Epoch 5/10 1000/1000 [==============================] - 0s 31us/step - loss: 0.6834 - accuracy: 0.5570 Epoch 6/10 1000/1000 [==============================] - 0s 34us/step - loss: 0.6799 - accuracy: 0.5720 Epoch 7/10 1000/1000 [==============================] - 0s 34us/step - loss: 0.6760 - accuracy: 0.5860 Epoch 8/10 1000/1000 [==============================] - 0s 37us/step - loss: 0.6742 - accuracy: 0.5920 Epoch 9/10 1000/1000 [==============================] - 0s 35us/step - loss: 0.6702 - accuracy: 0.5810 Epoch 10/10 1000/1000 [==============================] - 0s 36us/step - loss: 0.6686 - accuracy: 0.6050 <keras.callbacks.callbacks.History at 0x1e1c574b888>
Model通用模型
通用模型可以設計非常復雜、任意拓撲結構的神經網絡,例如有向無環(huán)網絡、共享層網絡等。
相比于序列模型只能依次線性逐層添加,通用模型能夠比較靈活地構造網絡結構,設定各層級的關系。
from keras.layers import Input, Dense from keras.models import Model # 定義輸入層,確定輸入維度 input = input(shape = (784, )) # 2個隱含層,每個都有64個神經元,使用relu激活函數,且由上一層作為參數 x = Dense(64, activation='relu')(input) x = Dense(64, activation='relu')(x) # 輸出層 y = Dense(10, activation='softmax')(x) # 定義模型,指定輸入輸出 model = Model(input=input, output=y) # 編譯模型,指定優(yōu)化器,損失函數,度量 model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) # 模型擬合,即訓練 model.fit(data, labels)
到此這篇關于Keras深度學習模型Sequential和Model詳解的文章就介紹到這了,更多相關Keras深度學習模型內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python使用fileinput模塊實現(xiàn)逐行讀取文件的方法
這篇文章主要介紹了python使用fileinput模塊實現(xiàn)逐行讀取文件的方法,涉及Python中fileinput模塊操作文件的相關技巧,非常具有實用價值,需要的朋友可以參考下2015-04-04

