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,鍵盤,機殼等 軟體 一般包括系統 驅動 中介軟體 應用。在手機終端中,最重要的核心就是射頻晶元和基帶晶元。射頻晶元負責射頻收發 頻率...