Keras 速成 構建卷積神經網路
文章目錄
- Keras 速成 構建卷積神經網路
- 一、介紹
- 二、30秒入門Keras
- Sequential 模型
- .add() 來堆疊模型
- .compile() 來配置學習程序
- 訓練資料
- 三、安裝并且配置環境
- 四、Keras的模型
- Model 類模型
- Sequential 順序模型
- 五、Keras的網路層
- Keras 核心網路層
- 激活
- Dropout
- Flatten
- 卷積層
- Conv1D
- Conv2D
- SeparableConv1D
- SeparableConv2D
- Conv3D
- 池化層
- MaxPooling1D
- MaxPooling2D
- MaxPooling3D
一、介紹
Keras是TensorFlow下面的一個十分好用的構建卷積神經網路的模塊,
Keras 是一個用 Python 撰寫的高級神經網路 API,它能夠以 TensorFlow, CNTK, 或者 Theano 作為后端運行,Keras 的開發重點是支持快速的實驗,能夠以最小的時延把你的想法轉換為實驗結果,是做好研究的關鍵,
Keras 兼容的 Python 版本: Python 2.7-3.6,
Keras廣受人們的歡迎:
二、30秒入門Keras
Keras 的核心資料結構是 model,一種組織網路層的方式,最簡單的模型是 Sequential 順序模型,它由多個網路層線性堆疊,對于更復雜的結構,你應該使用 Keras 函式式 API,它允許構建任意的神經網路圖,
Sequential 模型
from keras.models import Sequential
# 匯入模塊
model = Sequential()
# 創建物件 Sequential Object
.add() 來堆疊模型
from keras.layers import Dense
model.add(Dense(units=64, activation='relu', input_dim=100))
# 添加卷積層
model.add(Dense(units=10, activation='softmax'))
# 進行分類輸出
.compile() 來配置學習程序
model.compile(loss='categorical_crossentropy',
optimizer='sgd',
metrics=['accuracy'])
訓練資料
這是一個簡單的訓練資料的方法,
model.fit(x_train, y_train, epochs=5, batch_size=32)
三、安裝并且配置環境
Python環境是不用說的,這個必須要有,而且很好配置,
主要是需要安裝keras模塊
pip install keras
四、Keras的模型
在 Keras 中有兩類主要的模型:
Sequential 順序模型
和
使用函式式 API 的 Model 類模型,
Model 類模型
方法 | 功能 |
---|---|
model.layers | 是包含模型網路層的展平串列, |
model.inputs | 是模型輸入張量的串列, |
model.outputs | 是模型輸出張量的串列, |
model.summary() | 列印出模型概述資訊, 它是 utils.print_summary 的簡捷呼叫, |
model.get_config() | 回傳包含模型配置資訊的字典, |
model.get_weights() | 回傳模型中所有權重張量的串列,型別為 Numpy 陣列, |
model.set_weights(weights) | 從 Numpy 陣列中為模型設定權重,串列中的陣列必須與 get_weights() 回傳的權重具有相同的尺寸, |
model.to_json() | 以 JSON 字串的形式回傳模型的表示,請注意,該表示不包括權重,僅包含結構, |
model.to_yaml() | 以 YAML 字串的形式回傳模型的表示, |
model.save_weights(filepath) 將模型權重存盤為 HDF5 檔案, | |
model.load_weights(filepath, by_name=False) | : 從 HDF5 檔案(由 save_weights 創建)中加載權重, |
Sequential 順序模型
compile(optimizer,
loss=None,
metrics=None,
loss_weights=None,
sample_weight_mode=None,
weighted_metrics=None,
target_tensors=None)
引數的含義:
引數 | 功能 |
---|---|
optimizer | :字串(優化器名)或者優化器物件, |
loss | 字串(目標函式名)或目標函式或 Loss 實體, 如果模型具有多個輸出,則可以通過傳遞損失函式的字典或串列,在每個輸出上使用不同的損失,模型將最小化的損失值將是所有單個損失的總和, |
metrics | 在訓練和測驗期間的模型評估標準, 通常你會使用 metrics = [‘accuracy’],要為多輸出模型的不同輸出指定不同的評估標準, 還可以傳遞一個字典,如 metrics={‘output_a’: ‘accuracy’, ‘output_b’: [‘accuracy’, ‘mse’]}, 你也可以傳遞一個評估指標序列的序列 (len = len(outputs)) 例如 metrics=[[‘accuracy’], [‘accuracy’, ‘mse’]] 或 metrics=[‘accuracy’, [‘accuracy’, ‘mse’]], |
loss_weights | 指定標量系數(Python浮點數)的可選串列或字典,用于加權不同模型輸出的損失貢獻, 模型將要最小化的損失值將是所有單個損失的加權和,由 loss_weights 系數加權, 如果是串列,則期望與模型的輸出具有 1:1 映射, 如果是字典,則期望將輸出名稱(字串)映射到標量系數, |
sample_weight_mode | 如果你需要執行按時間步采樣權重(2D 權重),請將其設定為 temporal, 默認為 None,為采樣權重(1D),如果模型有多個輸出,則可以通過傳遞 mode 的字典或串列,以在每個輸出上使用不同的 sample_weight_mode, |
weighted_metrics | 在訓練和測驗期間,由 sample_weight 或 class_weight 評估和加權的度量標準串列, |
target_tensors | 默認情況下,Keras 將為模型的目標創建一個占位符,在訓練程序中將使用目標資料, 相反,如果你想使用自己的目標張量(反過來說,Keras 在訓練期間不會載入這些目標張量的外部 Numpy 資料), 您可以通過 target_tensors 引數指定它們,它應該是單個張量(對于單輸出 Sequential 模型), |
**kwargs | 當使用 Theano/CNTK 后端時,這些引數被傳入 K.function,當使用 TensorFlow 后端時,這些引數被傳遞到 tf.Session.run, |
fit(x=None,
y=None,
batch_size=None,
epochs=1,
verbose=1,
callbacks=None,
validation_split=0.0,
validation_data=None,
shuffle=True,
class_weight=None,
sample_weight=None,
initial_epoch=0,
steps_per_epoch=None,
validation_steps=None,
validation_freq=1,
max_queue_size=10,
workers=1,
use_multiprocessing=False)
引數的含義
引數 | 功能 |
---|---|
x | 輸入資料,可以是:一個 Numpy 陣列(或類陣列),或者陣列的序列(如果模型有多個輸入),一個將名稱匹配到對應陣列/張量的字典,如果模型具有命名輸入,一個回傳 (inputs, targets) 或 (inputs, targets, sample weights) 的生成器或 keras.utils.Sequence,None(默認),如果從本地框架張量饋送(例如 TensorFlow 資料張量), |
y | 目標資料,與輸入資料 x 類似,它可以是 Numpy 陣列(序列)、 本地框架張量(序列)、Numpy陣列序列(如果模型有多個輸出) 或 None(默認)如果從本地框架張量饋送(例如 TensorFlow 資料張量), 如果模型輸出層已命名,你也可以傳遞一個名稱匹配 Numpy 陣列的字典, 如果 x 是一個生成器,或 keras.utils.Sequence 實體,則不應該 指定 y(因為目標可以從 x 獲得), |
batch_size | 整數或 None,每次梯度更新的樣本數,如果未指定,默認為 32, 如果你的資料是符號張量、生成器或 Sequence 實體形式,不要指定 batch_size, 因為它們會生成批次, |
epochs | 整數,訓練模型迭代輪次,一個輪次是在整個 x 或 y 上的一輪迭代, 請注意,與 initial_epoch 一起,epochs 被理解為「最終輪次」, 模型并不是訓練了 epochs 輪,而是到第 epochs 輪停止訓練, |
verbose | 整數,0, 1 或 2,日志顯示模式, 0 = 安靜模式, 1 = 進度條, 2 = 每輪一行, |
callbacks | 一系列的 keras.callbacks.Callback 實體,一系列可以在訓練和驗證(如果有)時使用的回呼函式, 詳見 callbacks, |
validation_split | 0 和 1 之間的浮點數,用作驗證集的訓練資料的比例, 模型將分出一部分不會被訓練的驗證資料,并將在每一輪結束時評估這些驗證資料的誤差和任何其他模型指標, 驗證資料是混洗之前 x 和y 資料的最后一部分樣本中, 這個引數在 x 是生成器或 Sequence 實體時不支持, |
validation_data | 用于在每個輪次結束后評估損失和任意指標的資料, 模型不會在這個資料上訓練,validation_data 會覆寫 validation_split, validation_data 可以是:元組 (x_val, y_val) 或 Numpy 陣列或張量;元組 (x_val, y_val, val_sample_weights) 或 Numpy 陣列,資料集或資料集迭代器,對于前兩種情況,必須提供 batch_size, 對于最后一種情況,必須提供 validation_steps, |
shuffle | 布林值(是否在每輪迭代之前混洗資料)或者字串 (batch), batch 是處理 HDF5 資料限制的特殊選項,它對一個 batch 內部的資料進行混洗, 當 steps_per_epoch 非 None 時,這個引數無效, |
class_weight | 可選的字典,用來映射類索引(整數)到權重(浮點)值,用于加權損失函式(僅在訓練期間), 這可能有助于告訴模型「更多關注」來自代表性不足的類的樣本, |
sample_weight | 訓練樣本的可選 Numpy 權重陣列,用于對損失函式進行加權(僅在訓練期間), 你可以傳遞與輸入樣本長度相同的平坦(1D)Numpy 陣列(權重和樣本之間的 1:1 映射), 或者在時序資料的情況下,可以傳遞尺寸為 (samples, sequence_length) 的 2D 陣列,以對每個樣本的每個時間步施加不同的權重, 在這種情況下,你應該確保在 compile() 中指定 sample_weight_mode=“temporal”, 這個引數在 x 是生成器或 Sequence 實體時不支持,應該提供 sample_weights 作為 x 的第 3 元素, |
initial_epoch | 整數,開始訓練的輪次(有助于恢復之前的訓練), |
steps_per_epoch | 整數或 None, 在宣告一個輪次完成并開始下一個輪次之前的總步數(樣品批次), 使用 TensorFlow 資料張量等輸入張量進行訓練時,默認值 None 等于資料集中樣本的數量除以 batch 的大小,如果無法確定,則為 1, |
validation_steps | 只有在提供了 validation_data 并且時一個生成器時才有用, 表示在每個輪次結束時執行驗證時,在停止之前要執行的步驟總數(樣本批次), |
validation_freq | 只有在提供了驗證資料時才有用,整數或串列/元組/集合, 如果是整數,指定在新的驗證執行之前要執行多少次訓練,例如,validation_freq=2 在每 2 輪訓練后執行驗證, 如果是串列、元組或集合,指定執行驗證的輪次,例如,validation_freq=[1, 2, 10] 表示在第 1、2、10 輪訓練后執行驗證, |
max_queue_size | 整數,僅用于生成器或 keras.utils.Sequence 輸入, 生成器佇列的最大尺寸,若未指定,max_queue_size 將默認為 10, |
workers | 整數,僅用于生成器或 keras.utils.Sequence 輸入, 當使用基于行程的多執行緒時的最大行程數,若未指定,workers 將默認為 1,若為 0,將在主執行緒執行生成器, |
use_multiprocessing | 布林值,僅用于生成器或 keras.utils.Sequence 輸入, 如果是 True,使用基于行程的多執行緒,若未指定,use_multiprocessing 將默認為 False, 注意由于這個實作依賴于 multiprocessing,你不應該像生成器傳遞不可選的引數,因為它們不能輕松地傳遞給子行程, |
**kwargs | 用于向后兼容, |
以上的fit函式會回傳History物件,
五、Keras的網路層
Keras 核心網路層
這是全連接網路層
keras.layers.Dense(units,
activation=None,
use_bias=True,
kernel_initializer='glorot_uniform',
bias_initializer='zeros',
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None)
激活
這是進行激活的層
keras.layers.Activation(activation)
Dropout
這是Dropout層
keras.layers.Dropout(rate,
noise_shape=None,
seed=None)
Flatten
這是展平層
keras.layers.Flatten(data_format=None)
卷積層
這里展示一部分比較常用的卷積層,
Conv1D
1D 卷積層 (例如時序卷積),
keras.layers.Conv1D(filters,
kernel_size,
strides=1,
padding='valid',
data_format='channels_last',
dilation_rate=1,
activation=None,
use_bias=True,
kernel_initializer='glorot_uniform',
bias_initializer='zeros',
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None)
Conv2D
2D 卷積層 (例如對影像的空間卷積),
(這個可以用于影像的處理了啦)
keras.layers.Conv2D(filters,
kernel_size,
strides=(1, 1),
padding='valid',
data_format=None,
dilation_rate=(1, 1),
activation=None,
use_bias=True,
kernel_initializer='glorot_uniform',
bias_initializer='zeros',
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None)
SeparableConv1D
深度方向的可分離 1D 卷積,
keras.layers.SeparableConv1D(filters,
kernel_size,
strides=1,
padding='valid',
data_format='channels_last',
dilation_rate=1,
depth_multiplier=1,
activation=None,
use_bias=True,
depthwise_initializer='glorot_uniform',
pointwise_initializer='glorot_uniform',
bias_initializer='zeros',
depthwise_regularizer=None,
pointwise_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
depthwise_constraint=None,
pointwise_constraint=None,
bias_constraint=None)
SeparableConv2D
深度方向的可分離 2D 卷積,
keras.layers.SeparableConv2D(filters,
kernel_size,
strides=(1, 1),
padding='valid',
data_format=None,
dilation_rate=(1, 1),
depth_multiplier=1,
activation=None,
use_bias=True,
depthwise_initializer='glorot_uniform',
pointwise_initializer='glorot_uniform',
bias_initializer='zeros',
depthwise_regularizer=None,
pointwise_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
depthwise_constraint=None,
pointwise_constraint=None,
bias_constraint=None)
Conv3D
3D 卷積層 (例如立體空間卷積),
keras.layers.Conv3D(filters,
kernel_size,
strides=(1, 1, 1),
padding='valid',
data_format=None,
dilation_rate=(1, 1, 1),
activation=None,
use_bias=True,
kernel_initializer='glorot_uniform',
bias_initializer='zeros',
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None)
池化層
這里展示一部分比較常用的池化層,
MaxPooling1D
對于時序資料的最大池化,
keras.layers.MaxPooling1D(pool_size=2, strides=None, padding='valid', data_format='channels_last')
MaxPooling2D
對于空間資料的最大池化,
keras.layers.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)
MaxPooling3D
對于 3D(空間,或時空間)資料的最大池化,
keras.layers.MaxPooling3D(pool_size=(2, 2, 2), strides=None, padding='valid', data_format=None)
如果需要參考案例,可以參見下面的文章:
聽說越來越卷,那我們就用卷積神經網路CNN來識別狗狗吧!!
https://blog.csdn.net/m0_54218263/article/details/119811416?spm=1001.2014.3001.5501
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/295558.html
標籤:AI