3 2tensorflow自定義模型步驟方法

2022-09-14 13:12:08 字數 2970 閱讀 6067

自己開發了一**票智慧型分析軟體,功能很強大,需要的點選下面的鏈結獲取:

:就是將輸入資料和變數之間進行計算的方法,可以理解為乙個個函式。tf.keras.layers中包含了大量的深度學習中常用的預定義層,也可以自定義層。

模型:則是將各種層進行組織和連線,封裝成乙個流程,描述了如何將輸入的資料通過各種層組織連線計算得到輸出。對於線性模型,不是用公式計算

y=ax+b,而是直接呼叫y_pred=model(x),得出值。線性模型model中包含了引數a,b,線性計算關係y=ax+b.

可以簡單的理解為層是類的函式,model是類的封裝,不僅包含層,還包含變數a,b,同時包含運算關係和流程。

自定義模型只要繼承tf.keras.model基類,然後重寫模型的_init_函式和call函式,_init_函式中定義了keras層或者自定義層,也就是各種方法,call函式中定義層之間的連線,也就是將輸入資料呼叫init中建立的方法,組織方法呼叫的流程,得出最後的結果輸出。例如對線性函式y=ax+b的自定義模型。

全連線層的引數說明

def

__init__

(self,

units,

#輸出張量的維度,

activation=none,#啟用函式

use_bias=true,#是否加入偏置向量,即f(ax+b)中的b

kernel_initializer='

glorot_uniform

',#權值a的初始化

bias_initializer='

zeros

',#偏置向量的初始化

kernel_regularizer=none,

bias_regularizer=none,

activity_regularizer=none,

kernel_constraint=none,

bias_constraint=none,

**kwargs):

自定義模型步驟

(1)   自定義類繼承tf.keras.model

(2)   重寫init函式,在函式內部定義層;

(3)   重寫call函式,在call函式中連線各個層輸出結果;

(4)   用自定義類建立模型物件

(5)   for迴圈內建立梯度、損失函式,演算法迭代更新引數

(6)   得出引數矩陣輸出結果

例項**:

import tensorflow astf

#繼承model,自定義線性類

classlinemodel(tf.keras.model):#繼承model類

#重寫init函式,在init函式中實現自定義層

def __init__(self):

super().__init__()

#定義層

#dense是全連線層,內部是線性函式+啟用函式實現,不指定啟用函式時,只是線性變換y=ax+b

self.line=tf.keras.layers.dense(units=1,activation=none,#自定義執行緒層line

kernel_initializer=tf.zeros_initializer(),

bias_initializer=tf.zeros_initializer())

#重寫call函式,連線各個層

def call(self, inputs):#重寫call函式

output=self.line(inputs)#將層進行連線輸出結果

returnoutput#返回結果

#使用模型

x=tf.constant([[1.0,2.0,3.0],[4.0,5.0,6.0]])#定義常量矩陣2行3列

y=tf.constant([[10.0],[20.0]])#定義目標結果矩陣,2行1列

model=linemodel()#定義模型變數

y1=model(x)

print(y1)

optimizer=tf.keras.optimizers.sgd(learning_rate=0.01)

for i in range(100):

with tf.gradienttape() astape:

y_pred=model(x)#定義**模型

loss =tf.reduce_mean(tf.square(y_pred-y))#定義損失函式

grad=tape.gradient(loss,model.variables)#計算梯度

#更新引數

print(model.variables)#顯示模型的引數

y2=model(x)#檢測模型

print(y2)

輸出結果:

tf.tensor(

[[0.]

[0.]], shape=(2, 1), dtype=float32)

[array([[0.40784496],

[1.191065  ],

[1.9742855 ]],dtype=float32)>, ]

tf.tensor(

[[ 9.496052]

[20.215637]], shape=(2, 1), dtype=float32)

上面的輸出結果中kernel是模型中的引數矩陣a,bias是模型中的引數矩陣b。最後是用訓練好的模型計算的結果和真實的結果[10,20]之間很接近。這就自定義模型,並訓練使用模型引數的例子。

為什麼不是過載_call_函式而是過載call函式?

karas模型內部定義的_call_函式,_call_函式內部除了會呼叫call函式,還需要做一些自己的內部操作。所以會暴露call介面用於過載。

TensorFlow2 0 自定義層與自定義網路

自定義層函式需要繼承layers.layer,自定義網路需要繼承keras.model。其內部需要定義兩個函式 1 init 初始化函式,內部需要定義構造形式 2 call函式,內部需要定義計算形式及返回值。self def layer class mydense layers.layer inhe...

tensorflow2 0 自定義層

無引數的自定義層可以使用 keras.layers.lambda函式 customized spftplus keras.layers.lambda lambda x tf.nn.softplus x print customized spftplus 1.0 1.0 1.0 0.0 0.1 0.2...

tensorflow 2 1 自定義訓練

常常會遇到自定義網路結構的情況,自定結構後往往會有多個輸入,或者還需要自定義loss或者accuracy函式,那麼keras的fit就無法使用了,因此需要自定義訓練步驟 下面則自定義一次batch的訓練步驟,包含了計算loss,accuracy和梯度下降。tensorflow2.0 主推eager模...