1. 程式人生 > >TensorFlow學習(十七):高階API之tf.layers

TensorFlow學習(十七):高階API之tf.layers

之前寫的程式碼都是基於比較底層的API了,底層的API其實是有好處的,雖然還是調API,但是至少對於原理有小小的理解才能夠寫出程式碼。而且在實現一些新的論文或者要實現一個新的點子的時候,這時候是沒有API的,因此底層的API非常有存在的必要,且必須經過這一個過程。
但是對於一個非常熟悉底層原理和經過了寫底層程式碼這個過程的人,在有些很常見的任務上,就是用高階封裝好的API就行。tf.layers就是提供這個功能的。是用tf.layers封裝好的函式,能夠省去非常多自己寫的程式碼,而且更加簡單更加方便。

一.概覽

官方文件:Module: tf.layers
tf.layers中分為類和函式,我們這裡主要講函式,因為類和函式的用法大同小異。

Input(…): 用於例項化一個輸入 Tensor,作為神經網路的輸入。
average_pooling1d(…): 一維平均池化層
average_pooling2d(…): 二維平均池化層
average_pooling3d(…): 三維平均池化層
batch_normalization(…): 批量標準化層
conv1d(…): 一維卷積層
conv2d(…): 二維卷積層
conv2d_transpose(…): 二維反捲積層
conv3d(…): 三維卷積層
conv3d_transpose(…): 三維反捲積層
dense(…): 全連線層
dropout(…): Dropout層
flatten(…)

: Flatten層,即把一個 Tensor 展平
max_pooling1d(…): 一維最大池化層
max_pooling2d(…): 二維最大池化層
max_pooling3d(…): 三維最大池化層
separable_conv2d(…): 二維深度可分離卷積層

看上面這個函式,可以發現,這個模組主要覆蓋的區域是全連線和卷積等等的基本操作。但是這些操作已經非常足夠了。我們可以根據自己的需要,在可以使用這裡的API的時候使用,來簡化我們的程式碼。

二.常見函式說明

上面講了常見函式的概覽,下面來詳細講一下常用的函式,其他的函式可以根據自己的需要查閱文件。

tf.layers.batch_normalization

此方法是批量標準化的方法,經過處理之後可以加速訓練速度

tf.layers.batch_normalization(
    inputs,
    axis=-1,
    momentum=0.99,
    epsilon=0.001,
    center=True,
    scale=True,
    beta_initializer=tf.zeros_initializer(),
    gamma_initializer=tf.ones_initializer(),
    moving_mean_initializer=tf.zeros_initializer(),
    moving_variance_initializer=tf.ones_initializer(),
    beta_regularizer=None,
    gamma_regularizer=None,
    beta_constraint=None,
    gamma_constraint=None,
    training=False,
    trainable=True,
    name=None,
    reuse=None,
    renorm=False,
    renorm_clipping=None,
    renorm_momentum=0.99,
    fused=None,
    virtual_batch_size=None,
    adjustment=None
)

引數解釋:

  • inputs:必需,即輸入資料。
  • axis: 一個整形或者一個整形列表。表示將要使用BN的軸。舉個例子, 要是在一個數據格式為"channels_first" 2D卷積層的後面,那麼設定set axis=1,否則設定axis=3. 要是提供了一個列表,那麼列表中所有的維度都會被同時被BN。Note: when using multi-axis batch norm, the beta, gamma, moving_mean, and moving_variance variables are the same rank as the input Tensor, with dimension size 1 in all reduced (non-axis) dimensions).
  • momentum: 滑動平均的Momentum.
  • epsilon: 可選,預設 0.001,大於0的小浮點數,用於防止除0錯誤。
  • center: 可選,預設 True,若設為True,將會將 beta 作為偏置加上去,否則忽略引數 beta
  • scale: 可選,預設 True,若設為True,則會乘以gamma,否則不使用gamma。當下一層是線性的時,可以設False,因為scaling的操作將被下一層執行。
  • beta_initializer: 可選,預設 zeros_initializer,即 beta 權重的初始方法。
  • gamma_initializer: 可選,預設 ones_initializer,即 gamma 的初始化方法。
  • moving_mean_initializer: 可選,預設 zeros_initializer,即動態均值的初始化方法。
  • moving_variance_initializer: 可選,預設 ones_initializer,即動態方差的初始化方法。
  • beta_regularizer: 可選,預設None,beta 的正則化方法。
  • gamma_regularizer: 可選,預設None,gamma 的正則化方法。
  • beta_constraint:可選,預設None,加在 beta 上的約束項。
    -** gamma_constraint**: 可選,預設None,加在 gamma 上的約束項。
  • renorm_clipping: 可選,預設 None,是否要用 rmax、rmin、dmax 來 scalar Tensor。
  • renorm_momentum: 可選,預設 0.99,用來更新動態均值和標準差的 Momentum 值。
  • fused:可選,預設 None,是否使用一個更快的、融合的實現方法。
  • trainable: 可選,預設 False,返回結果是 training 模式。
  • virtual_batch_size:可選,預設 None,是一個 int 數字,指定一個虛擬 batch size。
  • adjustment: 可選,預設 None,對標準化後的結果進行適當調整的方法。
  • name: A string, the name of the layer.

tf.layers.dense

dense,即全連線網路,layers 模組提供了一個 dense() 方法來實現此操作

tf.layers.dense(
    inputs,
    units,
    activation=None,
    use_bias=True,
    kernel_initializer=None,
    bias_initializer=tf.zeros_initializer(),
    kernel_regularizer=None,
    bias_regularizer=None,
    activity_regularizer=None,
    kernel_constraint=None,
    bias_constraint=None,
    trainable=True,
    name=None,
    reuse=None
)

引數解釋

  • inputs:必需,即需要進行操作的輸入資料。
  • units:必須,即神經元的數量。
  • activation:可選,預設為 None,如果為 None 則是線性啟用。
  • use_bias:可選,預設為 True,是否使用偏置。
  • kernel_initializer:可選,預設為 None,即權重的初始化方法,如果為 None,則使用預設的 Xavier 初始化方法。
  • bias_initializer:可選,預設為零值初始化,即偏置的初始化方法。
  • kernel_regularizer:可選,預設為 None,施加在權重上的正則項。
  • bias_regularizer:可選,預設為 None,施加在偏置上的正則項。
  • activity_regularizer:可選,預設為 None,施加在輸出上的正則項。
  • kernel_constraint,可選,預設為 None,施加在權重上的約束項。
  • bias_constraint,可選,預設為 None,施加在偏置上的約束項。
  • trainable:可選,預設為 True,布林型別,如果為 True,則將變數新增到 GraphKeys.TRAINABLE_VARIABLES 中。
  • name:可選,預設為 None,卷積層的名稱。
  • reuse:可選,預設為 None,布林型別,如果為 True,那麼如果 name 相同時,會重複利用。

tf.layers.conv2d

tf.layers.conv2d(
    inputs,
    filters,
    kernel_size,
    strides=(1, 1),
    padding='valid',
    data_format='channels_last',
    dilation_rate=(1, 1),
    activation=None,
    use_bias=True,
    kernel_initializer=None,
    bias_initializer=tf.zeros_initializer(),
    kernel_regularizer=None,
    bias_regularizer=None,
    activity_regularizer=None,
    kernel_constraint=None,
    bias_constraint=None,
    trainable=True,
    name=None,
    reuse=None
)

引數說明如下:

  • inputs:必需,即需要進行操作的輸入資料。
  • filters:必需,是一個數字,代表了輸出通道的個數,即 output_channels。
  • kernel_size:必需,卷積核大小,必須是一個數字(高和寬都是此數字)或者長度為 2 的列表(分別代表高、寬)。
  • strides:可選,預設為 (1, 1),卷積步長,必須是一個數字(高和寬都是此數字)或者長度為 2 的列表(分別代表高、寬)。
  • padding:可選,預設為 valid,padding 的模式,有 valid 和 same 兩種,大小寫不區分。
  • data_format:可選,預設 channels_last,分為 channels_lastchannels_first 兩種模式,代表了輸入資料的維度型別,如果是 channels_last,那麼輸入資料的 shape 為 (batch, height, width, channels),如果是 channels_first,那麼輸入資料的 shape 為 (batch, channels, height, width)
  • dilation_rate:可選,預設為 (1, 1),卷積的擴張率,如當擴張率為 2 時,卷積核內部就會有邊距,3×3 的卷積核就會變成 5×5。
  • activation:可選,預設為 None,如果為 None 則是線性啟用。
  • use_bias:可選,預設為 True,是否使用偏置。
  • kernel_initializer:可選,預設為 None,即權重的初始化方法,如果為 None,則使用預設的 Xavier 初始化方法。
  • bias_initializer:可選,預設為零值初始化,即偏置的初始化方法。
  • kernel_regularizer:可選,預設為 None,施加在權重上的正則項。
  • bias_regularizer:可選,預設為 None,施加在偏置上的正則項。
  • activity_regularizer:可選,預設為 None,施加在輸出上的正則項。
  • kernel_constraint,可選,預設為 None,施加在權重上的約束項。
  • bias_constraint,可選,預設為 None,施加在偏置上的約束項。
    trainable:可選,預設為 True,布林型別,如果為 True,則將變數新增到 GraphKeys.TRAINABLE_VARIABLES 中。
  • name:可選,預設為 None,卷積層的名稱。
  • reuse:可選,預設為 None,布林型別,如果為 True,那麼如果 name 相同時,會重複利用。

tf.layers.dropout

tf.layers.dropout(
    inputs,
    rate=0.5,
    noise_shape=None,
    seed=None,
    training=False,
    name=None
)

引數解釋

  • inputs:必須,即輸入資料。
  • rate:可選,預設為 0.5,即 dropout rate,如設定為 0.1,則意味著會丟棄 10% 的神經元。
  • noise_shape:可選,預設為 None,int32 型別的一維 Tensor,它代表了 dropout mask 的 shape,dropout mask 會與 inputs 相乘對 inputs 做轉換,例如 inputs 的 shape 為 (batch_size, timesteps, features),但我們想要 droput - - mask 在所有 timesteps 都是相同的,我們可以設定 noise_shape=[batch_size, 1, features]。
  • seed:可選,預設為 None,即產生隨機熟的種子值。
  • training:可選,預設為 False,布林型別,即代表了是否標誌位 training 模式。
  • name:可選,預設為 None,dropout 層的名稱。
    返回: 經過 dropout 層之後的 Tensor。

三.例子

這裡我們使用tf.layers 提供的API來實現簡單的CNN分類MNIST任務。
例子的程式碼地址為:LearningTensorFlow/23.tf.layers/

一個專案分為單個部分