Tensorflow2 0的Kreas高層介面介紹

2022-02-25 12:06:33 字數 3597 閱讀 3271

keras 是乙個主要由 python 語言開發的開源神經網路計算庫,它被設計為高度模組化和易擴充套件的高層神經網路介面,使得使用者可以不需要過多的 專業知識就可以簡潔、快速地完成模型的搭建與訓練。在tensorflow2.x版本中,keras被正式確定為tensorflow的高層api唯一介面,取代了tensorflow1.x版本中自帶的tf.layers等高層介面。也就是說,現在只能使用keras的介面來完成tensorflow層方式的模型搭建與訓練。 容器:通過keras 提供的網路容器 sequential 將多個網路層封裝成乙個大網路模型,只需要呼叫網路模型的例項一次即可完成資料從第一層到最末層的順序運算。**或參考:[tensorflow2.0]kreas高層介面--簡介及常用功能模組介紹

​ keras 是乙個主要由 python 語言開發的開源神經網路計算庫,它被設計為高度模組化和易擴充套件的高層神經網路介面,使得使用者可以不需要過多的 專業知識就可以簡潔、快速地完成模型的搭建與訓練。

​ keras 庫分為前端和後端,其中後端可以基於現有的深度學習框架實現,如 theano,cntk,tensorflow,前端介面即keras 抽象過的統一介面api。使用者通過keras 編寫的**可以輕鬆的切換不同的後端執行,靈活性較大。

​ 在tensorflow2.x版本中,keras被正式確定為tensorflow的高層api唯一介面,取代了tensorflow1.x版本中自帶的tf.layers等高層介面。也就是說,現在只能使用keras的介面來完成tensorflow層方式的模型搭建與訓練。 在 tensorflow中,keras被實現在 tf.keras子模組中

那麼keras 與tf.keras有什麼區別與聯絡呢?其實keras 可以理解為一套搭建與訓練神經網路的高層api協議,keras本身已經實現了此協議,可以方便的呼叫tensorflow,cntk等後端完成加速計算;在tensorflow中,也實現了一套keras 協議,即 tf.keras,但只能基於 tensorflow後端計算,並對tensorflow的支援更好。對於使用 tensorflow的開發者來說,tf.keras可以理解為乙個普通的子模組,與其他子模組,如tf.math,tf.data 等並沒有什麼差別。

常見功能模組

1 常見網路層類

​ 對於常見的神經網路層,可以使用張量方式的底層介面函式來實現,這些介面函式一般在 tf.nn 模組中。更常用地,對於常見的網路層,我們一般直接使用層方式來完成模型的搭建,在tf.keras.layers命名空間(下文使用 layers 指代tf.keras.layers)中提供了大量常見網路層的類介面,如全連線層,啟用含水層,池化層,卷積層,迴圈神經網路層等等。對於這些網路層類,只需要在建立時指定網路層的相關引數,並呼叫__call__方法即可完成前向計算。在呼叫__call__方法時,keras會自動呼叫每個層的前向傳播邏輯,這些邏輯一般實現 在類的 call 函式中。

以 softmax 層為例,它既可以使用tf.nn.softmax函式在前向傳播邏輯中完成softmax 運算,也可以通layers.softmax(axis)類搭建 softmax 網路層,其中 axis 引數指定 進行 softmax 運算的維度。

import tensorflow as tf # 匯入 keras 模型,不能使用 

import keras,它匯入的是標準的 keras 庫

from tensorflow import keras

from tensorflow.keras import layers # 匯入常見網路層類

x = tf.constant([2.,1.,0.1])

layer = layers.softmax(axis=-1) # 建立 softmax 層

layer(x) # 呼叫 softmax 前向計算

2 網路容器

通過keras 提供的網路容器 sequential 將多個網路層封裝成乙個大網路模型,只需要呼叫網路模型的例項一次即可完成資料從第一層到最末層的順序運算。

# 匯入 sequential 容器 

from tensorflow.keras import layers, sequential

network = sequential([ # 封裝為乙個網路

layers.dense(3, activation=none), # 全連線層

layers.relu(),#啟用函式層

layers.dense(2, activation=none), # 全連線層

layers.relu() #啟用函式層

])x = tf.random.normal([4,3]) network(x) # 輸入從第一層開始,逐層傳播至最末層

sequential 容器也可以通過 add()方法繼續追加新的網路層,實現動態建立網路的功能:

layers_num = 2 # 堆疊 2 次 

network = sequential() # 先建立空的網路

for _ in range(layers_num):

network.add(layers.dense(3)) # 新增全連線層

network.add(layers.relu())# 新增啟用函式層

network.build(input_shape=(none, 4)) # 建立網路引數

network.summary()

上述**通過指定任意的layers_num引數即可建立對應層數的網路結構,在完成網路建立時,很多類並沒有建立內部權值張量等成員變數,此時通過呼叫類的 build 方法並指定輸入大小,即可自動建立所有層的內部張量。通過summary()函式可以方便列印出網路結構和參數量:

可以看到 layer 列為每層的名字,這個名字由 tensorflow內部維護,與 python 的物件名不 一樣,param#列為層的引數個數,total params 統計出了總的參數量,trainable params 為 待優化的參數量,non-trainable params 為不需要優化的參數量。

當我們通過 sequential 容量封裝多層網路層時,所有層的引數列表將會自動併入

sequential 容器的引數列表中,不需要人為合併網路引數列表。sequential 物件的 trainable_variables 和 variables 包含了所有層的待優化張量列表和全部張量列表:

in [3]: # 列印網路的待優化引數名與 

shape for p in network.trainable_variables:

print(p.name, p.shape)

out[3]:

dense_2/kernel:0 (4, 3)

dense_2/bias:0 (3,)

dense_3/kernel:0 (3, 3)

dense_3/bias:0 (3,)

tensorflow2 0視訊記憶體設定

遇到乙個問題 新買顯示卡視訊記憶體8g但是tensorflow執行的時候介面顯示只有約6.3g的視訊記憶體可用,如下圖 即限制了我的視訊記憶體,具體原因為什麼我也不知道,但原來的視訊記憶體小一些的顯示卡就沒有這個問題。目前的解決辦法是 官方文件解決 然後對應的中文部落格 總結一下,就是下面的兩個辦法...

Tensorflow2 0 啟用函式

常用啟用函式及對應特點 神經網路結構的輸出為所有輸入的加權和,這導致整個神經網路是乙個線性模型。而線性模型不能解決異或問題,且面對多分類問題,也顯得束手無策。所以為了解決非線性的分類或回歸問題,啟用函式必須是非線性函式。神經網路中啟用函式的主要作用是提供網路的非線性建模能力。這是因為反向傳播演算法就...

初步了解TensorFlow2 0

為什麼要學習tensorflow?深度學習能夠更好地抽取資料中的規律,從而給公司帶來更大的價值 tensorflow是強大且靈活的開源框架 使用廣泛 2.0更加強大 易用 成熟 tensorflow是什麼?是google的開源軟體庫 採用資料流圖,用於數值計算 支援多平台 gpu cpu 移動裝置 ...