(三)深度學習計算 1 模型構造

2021-10-06 10:32:29 字數 4121 閱讀 3824

相比於先前**示例中的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)

輸出:

fancymlpsequential類都是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...