構造G和D網路

2021-09-29 16:58:59 字數 4182 閱讀 3633

with tf.

variable_scope

('gen'):

# 偽造資料的生成

self.z = tf.

placeholder

(tf.float32, shape=

(self.batch_size,1)

) self.g =

generator

(self.z, self.mlp_hidden_size)

1、定義generator,用於生成資料,這裡使用兩層神經網路
def generator

(input, h_dim)

: h0 = tf.nn.

softplus

(linear

(input, h_dim,

'g0'))

h1 =

linear

(h0,1,

'g1'

)return h1

通過linear函式輸入為12x1的shape,然後這個12x1的shape初始化乙個w乙個b,然後得到h1

生成網路非常簡易只有2層,這次只生成了一維的點,不需要複雜網路

對於d網路,有些許不同,因為他不光要接收真實的資料當做輸入還要接收生成資料當做輸入,用d1,d2來表示

with tf.

variable_scope

('disc'

) as scope:

# 對真實值做**, d1為真實值的概率

self.x = tf.

placeholder

(tf.float32, shape=

(self.batch_size,1)

) self.d1 =

discriminator

(self.x, self.mlp_hidden_size)

# 變數重用

scope.

reuse_variables()

# 對生成資料做**, d2為**到造假值的概率

self.d2 =

discriminator

(self.g, self.mlp_hidden_size)

reuse意思是這兩個網路是一樣的只是把他們的變數重新使用了一下

不需要再重新定義

self.loss_d = tf.

reduce_mean

(-tf.

log(self.d1)

- tf.

log(

1- self.d2)

) self.loss_g = tf.

reduce_mean

(-tf.

log(self.d2)

)

1、對於self.loss_d:

左半邊為真實的輸入d1,希望log完的值越低越好,即希望self.d1是等於1的,那麼log就趨近於0。

右半邊為生成的輸入d2,希望self.d2是等於0的,1-self.d2等於1,則log(1-self.d2)趨近於0。

如果離1越遠,損失函式越大。

2、對於self.loss_g:

生成網路的損失函式,生成網路能夠騙過判別網路,判別為真就行,希望self.d2生成資料判別為1

loss_d希望self.d2趨近於0,loss_g希望self.d2趨近於1

先把剛剛初始化引數拿到手

拿到手之後定義optimizer,學習率不斷衰減的學習策略,通過這樣的求解器不斷的優化loss_d和loss_g

不斷的優化這兩個loss之後,就能得到兩組引數模型,一組引數為生成網路生成引數,另一組為判別網路引數

self.d_pre_params = tf.

get_collection

(tf.graphkeys.trainable_variables, scope=

'd_pre'

) self.d_params = tf.

get_collection

(tf.graphkeys.trainable_variables, scope=

'disc'

) self.g_params = tf.

get_collection

(tf.graphkeys.trainable_variables, scope=

'gen'

) # 獲得訓練以後的引數

self.opt_d =

optimizer

(self.loss_d, self.d_params, self.learning_rate)

self.opt_g =

optimizer

(self.loss_g, self.g_params, self.learning_rate)

def train

(self)

: with tf.

session

() as session:

tf.global_variables_initializer()

.run()

# pretraining discriminator

num_pretrain_steps =

1000 #訓練次數

for step in range

(num_pretrain_steps)

: #先訓練d_pre網路

d =(np.random.

random

(self.batch_size)

-0.5)*

10.0

# 生成隨機值的標籤

labels = norm.

pdf(d, loc=self.data.mu, scale=self.data.sigma)

pretrain_loss, _ = session.

run(

[self.pre_loss, self.pre_opt],)

# 獲得d_pre引數

self.weightsd = session.

run(self.d_pre_params)

# copy weights from pre-training over to new d network

# 將d_pre_params 引數拷貝給 d_params

for i, v in enumerate

(self.d_params)

: session.

run(v.

assign

(self.weightsd[i]

))#有了d_pre往d網路進行真正的初始化

# 進行兩個對抗函式的引數訓練

for step in range

(self.num_steps)

:# update discriminator

x = self.data.

sample

(self.batch_size)#真實資料,有均值、標準差

z = self.gen.

sample

(self.batch_size) #隨機的高斯初始化

loss_d, _ = session.

run(

[self.loss_d, self.opt_d],)

# update generator

z = self.gen.

sample

(self.batch_size)

loss_g, _ = session.

run(

[self.loss_g, self.opt_g],)

# 迭代一百次或者在最後一次進行畫圖

if step % self.log_every ==0:

print

('{}: {}\t{}'

.format

(step, loss_d, loss_g)

)if step %

100==

0 or step==

0 or step == self.num_steps -1:

self.

_plot_distributions

(session)

D 構造陣列

題意 構造乙個長度為n的陣列a,構造方式如下 依次進行n次操作,第i次操作在陣列a的index i 位置處插入整數number i 最後從左到右輸出陣列a的元素題解 這道題從前向後考慮是不行的,我們從後向前考慮,最後乙個插入的數字置肯定是index n 然後倒二插入的位置可能是index n 1 或...

d的複製建構函式

本文件提出了複製建構函式,它是後複製函式的替代方法.複製建構函式消除了對後複製的需求,並修復了其缺陷和固有限制.還討論了演進和向後相容性.本節重點介紹了後複製存在問題,並說明了為什麼複製建構函式比後複製好.無法有意義地過載或限定後複製函式.但,編譯器不會拒絕限定器應用,如下所示 構 a 構 b 構 ...

網路學習 2g 3g 4g 5g技術對比

射頻部分 一般是資訊傳送和接收的部分 基帶部分 一般是資訊處理的部分 電源管理 一般是節電的部分,由於手機是能源有限的裝置,所以電源管理十分重要 外設 一般包括lcd,鍵盤,機殼等 軟體 一般包括系統 驅動 中介軟體 應用。在手機終端中,最重要的核心就是射頻晶元和基帶晶元。射頻晶元負責射頻收發 頻率...