gan (生成對抗網路)是近幾年深度學習中乙個比較熱門的研究方向,它的變種有上千種。
1.什麼是gan
gan的英文全稱是generative adversarial network,中文名是生成對抗網路。它由兩個部分組成,生成器和鑑別器(又稱判別器),它們之間的關係可以用競爭或敵對關係來描述。
我們可以拿捕食者與**食者之間的例子來類似說明兩者之間的關係。在生物進化的過程中,**食者會慢慢演化自己的特徵,使自己越來越不容易**食者識別捕捉到,從而達到欺騙捕食者的目的;與此同時,捕食者也會隨著**食者的演化來演化自己對**食者的識別,使自己越來越容易識別捕捉到捕食者。這樣就可以達到兩者共同進化的目的。生成器代表的是**食者,鑑別器代表的是捕食者。
2.gan的原理
gan的工作原理與上述例子還有略微的不同,gan是已經知道最終鑑別的目標是什麼,但不知道假目標是什麼,它會對生成器所產生的假目標做懲罰並對真目標進行獎勵,這樣鑑別器就知道了不好的假目標與好的真目標具體是什麼。生成器則是希望通過進化,產生比上一次更好的假目標,使鑑別器對自己的懲罰更小。以上是乙個迴圈,在下乙個迴圈中鑑別器通過學習上乙個迴圈進化出的假目標和真目標,再次進化對假目標的懲罰,同時生成器再次進化,直到與真目標一致,結束進化。
gan簡單**實現
#是乙個卷積神經網路,變數名是d,其中一層構造方式如下。
w = tf.get_variable('w', [4, 4, c_dim, num_filter],
initializer=tf.truncated_normal_initializer(stddev=stddev))
dconv = tf.nn.conv2d(ddata, w, strides=[1, 2, 2, 1], padding='same')
biases = tf.get_variable('biases', [num_filter],
initializer=tf.constant_initializer(0.0))
bias = tf.nn.bias_add(dconv, biases)
dconv1 = tf.maximum(bias, leak*bias)
#是乙個逆卷積神經網路,變數名是g,其中一層構造方式如下。
w = tf.get_variable('w', [4, 4, num_filter, num_filter*2],
initializer=tf.random_normal_initializer(stddev=stddev))
deconv = tf.nn.conv2d_transpose(gconv2, w,
output_shape=[batch_size, s2, s2, num_filter],
strides=[1, 2, 2, 1])
biases = tf.get_variable('biases', [num_filter],
initializer=tf.constant_initializer(0.0))
bias = tf.nn.bias_add(deconv, biases)
deconv1 = tf.nn.relu(bias, name=scope.name)
#的網路輸入為乙個維服從-1~1均勻分布的隨機變數,這裡取的是100.
batch_z = np.random.uniform(-1, 1, [config.batch_size, self.z_dim])
.astype(np.float32)
#的網路輸入是乙個batch的64*64的,
#既可以是手寫體資料也可以是的乙個batch的輸出。
#這個過程可以參考上圖的a狀態,判別曲線處於不夠穩定的狀態,
#兩個網路都還沒訓練好。
#訓練判別網路
#判別網路的損失函式由兩部分組成,一部分是真實資料判別為1的損失,一部分是的輸出self.g#判別為0的損失,需要優化的損失函式定義如下。
self.g = self.generator(self.z)
self.d, self.d_logits = self.discriminator(self.images)
self.d_, self.d_logits_ = self.discriminator(self.g, reuse=true)
self.d_loss_real = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(
self.d_logits, tf.ones_like(self.d)))
self.d_loss_fake = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(
self.d_logits_, tf.zeros_like(self.d_)))
self.d_loss = self.d_loss_real + self.d_loss_fake
#然後將乙個batch的真實資料batch_images,和隨機變數batch_z當做輸入,執行session更新的引數。
##### update discriminator on real
d_optim = tf.train.adamoptimizer(flags.learning_rate,
beta1=flags.beta1).minimize(d_loss, var_list=d_vars)
...out1 = sess.run([d_optim], feed_dict=)
#這一步可以對比圖b,判別曲線漸漸趨於平穩。
#訓練生成網路
#並且是在設定偽造的label是1的情況下,保持判別網路不變,
#那麼判別網路對偽造的梯度就是向著真實變化的方向。
self.g_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(
self.d_logits_, tf.ones_like(self.d_)))
#然後用同樣的隨機變數batch_z當做輸入更新
g_optim = tf.train.adamoptimizer(config.learning_rate, beta1=config.beta1)
.minimize(self.g_loss, var_list=self.g_vars)
out2 = sess.run([g_optim], feed_dict=)
GAN 生成對抗網路
原理 假設我們有兩個網路 乙個生g generator 乙個判別d discriminator g是乙個生成的的網路,它接受乙個隨機的雜訊z,通過這個雜訊生成,記做g z d是乙個判別網路,判斷一張是不是 真實的 它的輸入引數是x,x代表一張的。輸出d x 代表x為真實的概率,如果為1,就代表100...
生成對抗網路 GAN
原文 generative adversarial networks 模型組成 核心公式 演算法圖示化描述 全域性最優點 pg pdata 效果與對比展望 ming maxdv d,g exp data x logd x exp x x log 1 d g z 分析 上方為 gan 網路的核心演算法...
GAN(生成對抗網路)
gan,generative adversarial network.起源於2014年,nips的一篇文章,generative adversarial net.gan,是一種二人博弈的思想,雙方利益之和是乙個常數,是固定的。你的利益多點,對方利益就少點。gan裡面,博弈雙方是 乙個叫g 生成模型 ...