相比於先前**示例中的tf.keras.sequential
類,tf.keras.model
的模型構造方法更加靈活。
tf.keras.model
類是tf.keras
模組裡提供的乙個模型構造類,可以繼承它來定義需要的模型。
構造多層感知機,**示例如下:
import tensorflow as tf
class
mlp(tf.keras.model)
:def
__init__
(self)
:# initialize self
super()
.__init__(
)
self.flatten = tf.keras.layers.flatten(
) self.dense1 = tf.keras.layers.dense(units=
256, activation=tf.nn.relu)
self.dense2 = tf.keras.layers.dense(units=10)
defcall
(self, inputs)
: x = self.flatten(inputs)
x = self.dense1(x)
output = self.dense2(x)
return output
以上的mlp
類中無須定義反向傳播函式,系統將通過自動求梯度而自動生成反向傳播所需的backward
函式。
例項化mlp
類得到模型變數net
,**示例如下:
# outputs random values from a uniform distribution.
x = tf.random.uniform((2
,20))
net = mlp(
)net(x)
**初始化net
並傳入輸入資料x
做一次前向計算。
其中,net(x)
呼叫mlp
類定義的call
函式完成前向計算。
輸出:
事實上,sequential
類繼承自tf.keras.model
類。當模型的前向計算為串聯各層的簡單計算時,可以通過這種更加簡便的方式來定義模型。
sequential
類的目的:提供add
函式來逐一新增串聯的block
子類例項,而模型的前向計算就是將這些例項按新增的順序逐一計算。
用sequential
類來實現1.1小節的mlp
類,並用隨機初始化的模型做一次前向計算,**示例如下:
model = tf.keras.models.sequential(
[ tf.keras.layers.flatten(),
tf.keras.layers.dense(units=
256, activation=tf.nn.relu)
, tf.keras.layers.dense(units=10)
])
model(x)
輸出:
雖然sequential
類使模型構造更簡單,但繼承tf.keras.model
類可以極大拓展模型構造的靈活性。
構造乙個略複雜的網路fancymlp
,**示例如下:
class
fancymlp
(tf.keras.model)
:def
__init__
(self)
:super()
.__init__(
) self.flatten = tf.keras.layers.flatten(
) self.rand_weight = tf.constant(tf.random.normal((20
,20))
) self.dense = tf.keras.layers.dense(units=
20, activation=tf.nn.relu)
defcall
(self, inputs)
: x = self.flatten(inputs)
# hidden layer
x = tf.nn.relu(tf.matmul(x, self.rand_weight)+1
) x = self.dense(x)
# control l2 norm
""" signature: tf.norm(tensor, ord='euclidean', axis=none, keepdims=none, name=none)
docstring: computes the norm of vectors, matrices, and tensors.
"""while tf.norm(x)
>1:
x /=
2if tf.norm(x)
<
0.8:
x *=
10return tf.reduce_sum(x)
在該網路中,通過constant
函式建立訓練中不被迭代的引數,即常數引數。
使用了常數權重rand_weight
(並非模型引數)、做了矩陣乘法操作(tf.matmul
),並重複使用了相同的dense
層。
該模型進行隨機初始化和前向計算:
net = fancymlp(
)net(x)
輸出:
fancymlp
和sequential
類都是tf.keras.model
類的子類,巢狀呼叫示例如下:
class
nestmlp
(tf.keras.model)
:def
__init__
(self)
:super()
.__init__(
) self.net = tf.keras.models.sequential(
) self.net.add(tf.keras.layers.flatten())
self.net.add(tf.keras.layers.dense(units=
64, activation=tf.nn.relu)
) self.net.add(tf.keras.layers.dense(units=
32, activation=tf.nn.relu)
) self.dense = tf.keras.layers.dense(units=
16, activation=tf.nn.relu)
defcall
(self, inputs)
:return self.dense(self.net(inputs)
)
net = tf.keras.models.sequential(
)net.add(nestmlp())
net.add(tf.keras.layers.dense(20)
)net.add(fancymlp(
))
net(x)
輸出:
參考《動手學深度學習》(tf2.0版)
深度學習baseline模型 深度學習模型訓練流程
工作中訓練了很多的深度學習模型,目前到了上公升到方 的角度來看了。日常工作中有的人可能已經在遵循方 做事,可能自己沒有注意,有的人可能沒有遵循方 在做事,雖然可能最後的結果差不多,但花費的時間和精力應該會差別很大,當然這是我自己的感受。我們不必完全按照方 來做,但基本流程跟方 應該一致。下面的具體步...
深度學習模型
深度學習常用方法 深度置信網路 dbn 概率生成模型,生成資料 卷積神經網路 cnn 判別模型,處理二維圖 卷積深度置信網路 cdbn 兩者的結合 迴圈神經網路 rnn 與時間序列有關的 對抗神經網路 gan 兩個網路的零和遊戲,乙個網路用來判別,乙個網路用來生成 自動編碼器 vae 生成模型 深度...
深度學習計算模型中 門函式 的作用
上面是lstm的計算公式,那三個sigmoid作為非線性函式的就是三個門。lstm是rnn模型,決定t時刻節點的除了當前x t 外,還有t 1時刻的隱層節點輸出h t 1 這代表了歷史資訊對當前的影響,所以決定門開關程度的除了當前輸入x t 外,還有h t 1 含義很清楚,輸入門是用來控制輸入i t...