自己開發了一**票智慧型分析軟體,功能很強大,需要的點選下面的鏈結獲取:
層:就是將輸入資料和變數之間進行計算的方法,可以理解為乙個個函式。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模...