1. 程式人生 > >GAN的Loss的比較研究(1)——傳統GAN的Loss的理解1

GAN的Loss的比較研究(1)——傳統GAN的Loss的理解1

GAN(Generative Adversarial Network)由兩個網路組成:Generator網路(生成網路,簡稱G)、Discriminator網路(判別網路,簡稱D),如圖:
這裡寫圖片描述
圖1 GAN概念圖
因而有兩個Loss:Loss_D(判別網路損失函式)、Loss_G(生成網路損失函式)。
Loss_D只有兩個分類,Real image判為1,Fake image(由G生成)判為0,因而可以用二進位制交叉熵(BCELoss)來實現Loss_D。
熵(Entropy),是描述一個隨機訊號源的資訊量的指標,為敘述方便,採用離散訊號源。設訊號源(S)可以傳送N個符號{S1,S2,...,SN

}\{ S_1,S_2,...,S_N\},符號SiS_i出現的概率為PiP_i,則該訊號源所傳送一個符號的平均資訊量,即熵為:
H(S)=iNPilogPi(1) H(S) = -\sum_i^N P_i\log P_i\qquad(1)
於是,熵就可以看成是一個概率的資訊度量,於是從資訊理論過渡到概率度量上。對於連續概率分佈,使用概率密度p(x)p(x)代替(1)式中的概率PiP_i,有:
H(S)=xp(x)logp(x)dx(2) H(S)=-\int_x p(x)\log p(x)dx\qquad(2)

交叉熵(Cross Entropy)是描述兩個隨機分佈(P、Q)差異的一個指標,其定義如下:
H(PQ)=iNPilogQi(3)H(PQ)=xp(x)logq(x)dx(4) 離散:H(P\vert Q) = -\sum_i^N P_i\log Q_i\qquad(3)\\ 連續:H(P\vert Q)=-\int_x p(x)\log q(x)dx\qquad(4)
P、Q的順序不能互換。當P與Q相同時,交叉熵取最小值,此時計算的是P(或Q)的熵。
所謂二進位制交叉熵(Binary Cross Entropy)是指隨機分佈P、Q是一個二進位制分佈,即P和Q只有兩個狀態0-1。令p為P的狀態1的概率,則1-p是P的狀態0的概率,同理,令q為Q的狀態1的概率,1-q為Q的狀態0的概率,則P、Q的交叉熵為(只列離散方程,連續情況也一樣):
H
(PQ)=(plogq+(1p)log(1q))(5) H(P|Q)=-( p\log q + (1-p)\log(1- q))\qquad(5)

在GAN中,判別器(Discriminator)的輸出與ground-truth(它的取值只有0-1)被看作是概率。交叉熵就是用來衡量這兩個概率之間差異的指標:p反映的是ground-truth認為來自real的概率,用L表示(ground truth label)此分佈,它只取兩個值100%和0%,即1和0;q反映的是Discriminator認為的來自real的概率,用D(Discriminator prediction)表示此分佈,它的取值是[0,1][0,1]
一個樣本(1幅圖片)x,假如來自real,p則為1,q為D(xr)D(x_r),其交叉熵輸出是:
1logD(xr)+11)log(1D(xr))=logD(xr)-(1*\log D(x_r)+(1-1)*\log( 1-D(x_r))=-\log D(x_r)
假如來自fake,p則為0,q為D(xf)D(x_f),其交叉熵為:
(0logD(xf)+10)log(1D(xf))=log(1D(xf))-(0*\log D(x_f)+(1-0)*\log( 1-D(x_f))=-\log (1-D(x_f))
於是,對於一個樣本集,一半來自真實(real),一半來生成器(fake),其交叉熵的平均是:
H(LD)=1M(xrMlog(D(xr))+xfMlog(1D(xf)))(6) H(L|D)=-\frac{1}{M}(\sum_{x_r}^M\log (D(x_r))+\sum_{x_f}^M log(1-D(x_f)))\qquad(6)
D的目標是讓PdP_d接近理想概率分佈PiP_iPiP_i分佈是:real sample輸入時,概率輸出為1;fake sample輸入時,概率輸出為0)。因此交叉熵越小越好,即:
Loss_D(L,D)=(1MxrMlog(D(xr))1MxfMlog(1D(xf))(7) Loss\_D(L, D)=-(\frac{1}{M}\sum_{x_r}^M \log (D(x_r))-\frac{1}{M}\sum_{x_f}^M log(1-D(x_f))\qquad(7)

(這裡解釋一下:傳統的GAN的object function是:
minGmaxDExq(x)[logD(x)]+Ezp(z)[log(1D(G(z)))]\min_G \max_D E_{x\sim q(x)}[\log D(x)]+E_{z\sim p(z)}[\log (1-D(G(z)))]
因此,在GAN第一階段——求Discriminator最大化時是:
maxDExq(x)[logD(x)]+Ezp(z)[log(1D(G(z)))]\max_D E_{x\sim q(x)}[\log D(x)]+E_{z\sim p(z)}[\log (1-D(G(z)))]
在當前的DeepLearning平臺上,統計梯度是對最小值進行尋優的,因此實際操作上是對目標函式做最小化處理:
minD(Exq(x)[logD(x)]Ezp(z)[log(1D(G(z)))])\min_D (-E_{x\sim q(x)}[\log D(x)]-E_{z\sim p(z)}[\log (1-D(G(z)))])。據此,公式(7)中Loss_D等於目標函式取負號。

為求最優判別器DD^*,(7)的等價形式如下,即求兩類別各自的期望:
Loss_D(L,D)=Exr(log(D(xr)))+Exf(log(1D(xf)))(8) Loss\_D(L, D)= E_{x_r}(-\log (D(x_r)))+ E_{x_f}(-log(1-D(x_f)))\qquad(8)
以下是一段來自https://github.com/znxlwm/pytorch-MNIST-CelebA-GAN-DCGAN/blob/master/pytorch_MNIST_DCGAN.py的程式碼:

y_real_ = torch.ones(mini_batch)    # ground-truth 全為1
y_fake_ = torch.zeros(mini_batch)   # 全為0

x_, y_real_, y_fake_ = Variable(x_.cuda()), Variable(y_real_.cuda()), Variable(y_fake_.cuda())
D_result = D(x_).squeeze()
D_real_loss = BCE_loss(D_result, y_real_)  # 應用BCELoss

z_ = torch.randn((mini_batch, 100)).view(-1, 100, 1, 1)
z_ = Variable(z_.cuda())
G_result = G(z_)

D_result = D(G_result
            
           

相關推薦

GAN的Loss的比較研究1——傳統GAN的Loss的理解1

GAN(Generative Adversarial Network)由兩個網路組成:Generator網路(生成網路,簡稱G)、Discriminator網路(判別網路,簡稱D),如圖: 圖1 GAN概念圖 因而有兩個Loss:Loss_D(判別網路損失函式

RPC框架研究Hadoop源代碼-1

trac 挑戰 b2c ott 技術分享 style dsm mod spa 報名了阿裏中間件性能大賽,我來說是一個全新的挑戰。一切從空白學起,比賽的過程也是學習的過程 是的。想讓自己學好。給自己報一個比賽吧~ 就像當初學圍棋,也是報了圍棋比賽,為

多執行緒1傳統執行緒回顧

本文介紹的傳統執行緒的回顧 是Java1.5之前回顧,你可以選擇跳過。 Thread類即執行緒類 一執行緒的建立   1.1通過new Thread寫出子類重寫run方法 Thread thread = new Thread(){ public void r

《編程導論Java·2.1.2 啊,我看到了多態》-什麽是多態(polymorphism)

img page ria 使用方法 ride idt void one 標題 1.不明覺厲 很多人學習多態時,會認為。 之所以不明覺厲,由於多態的定義:事物存在的多種表現形態;而後,有人將重載(overload)、改寫(override)、多態變量和泛型歸結於同一個

Android中apk動態載入技術研究2android插件化及實現

name creat package path iss fontsize 調用 dex con 了解了android中類載入的前期知識點後,來看看android中DexClassLoader詳細的實現 詳細載入流程例如以下: 宿主程序會到文件系統比

Redis研究—簡介

創始人 存儲結構 隊列 cached tar 寫入 關系 退出 使用 http://blog.csdn.net/wtyvhreal/article/details/41855327 Redis是一個開源的高性能鍵值對數據庫。它通過提供多種鍵值數據類型來適應不同場景下的

Android多線程研究3——線程同步和相互排斥及死鎖

getname read fix 輸出 ace obj ron tracking stack 為什麽會有線程同步的概念呢?為什麽要同步?什麽是線程同步?先看一段代碼:package com.maso.test; public class ThreadTest2 imp

[數學建模]使用MATLAB繪圖1

基本 barh 分享 com 自定義 subplot mes 1.2 img 目錄 1..二維圖 1.1 基本畫圖功能 1.2 plot參數說明 :線條類型,點類型,顏色 1.3 坐標軸定標和圖形說明 1.4 子圖 :subplot 1.5 其他類型的二維圖

服務1=====lamp的理解

服務lamp 理論 博客我是一個學生我不知道我寫的是不是完全正確有問題加我qqqq 1473149468驗證碼[email protected]我做實驗的時候經常遇到一個問題就是每次我照書可以做出來但做完實驗不知道自己做了什麽不知道是做什麽用的所以我覺的這樣特別的悲哀。我也學了很多的服務我們學

Java IO編程全解——傳統的BIO編程

sys .net 由於 啟動 code esp 溢出 無限循環 .html 前面講到:Java IO編程全解(一)——Java的I/O演進之路   網絡編程的基本模型是Client/Server模型,也就是兩個進程之間進行相互通信,其中服務端提供位置信息(綁定的IP地址和監

git學習整理1git clone 理解

mail app font 文件 mas .cn gin xxxxx clone 1、git clone 的理解 git clone默認會把遠程倉庫整個給clone下來 ,只能clone遠程庫的master分支並在本地默認創建一個master分支 ,無法clone所

linux 配置文件.conf 非打印字符出錯的研究

highlight 運行錯誤 配置文件 檢查 bsp 換行符 span 字符 future linux 大量使用 .conf配置文件,經常從網上復制的配置信息,保存後,會出現運行錯誤。原因就是復制到了一個不可見的,無效的非打印字符。如何檢查並清除這些無效字符,今天探討一下。

HTML5 Video P2P技術研究

spa 音視頻 vid 視頻聊天 視頻網站 -html extern 缺點 服務 說明:之前在Flash時代,可以基於其實現P2P的技術,也就是現在主流的視頻網站用的視頻技術,不過要實現P2P技術,在Flash時代有點難,且要服務器支持等等;但是現在基於HTML5技術的P2

C#多線程編程5--線程安全1

拆分 將不 編譯器 pre orm amd frame tile 有效 當你需要2個線程讀寫同一個數據時,就需要數據同步。線程同步的辦法有:(1)原子操作;(2)鎖。原子操作能夠保證該操作在CPU內核中不會被“拆分”,鎖能夠保證只有一個線程訪問該數據,其他線程在嘗試獲得有

[轉] webpack3最新版本配置研究 devtool,webpack-dev-server,CommonsChunkPlugin

war () 最新版本 獲取 報錯 key num clas 容易 devtool devtool是webpack中config自帶的屬性只要使用就可以了不用安裝 webpack官網的解釋如下 當 webpack 打包源代碼時,可能會很難追蹤到錯誤和警告在源代碼中的原始位

構建NetCore應用框架之實戰篇:BitAdminCore框架1.0登錄功能細化及技術選型

1.0 dmi 也會 繼承 blank bit 技術選型 cor 我會 本篇承接上篇內容,如果你不小心點擊進來,建議從第一篇開始完整閱讀,文章內容繼承性連貫性。 構建NetCore應用框架之實戰篇系列 一、BitAdminCore框架1.0版本 1、1.0版本是指

Spring配置中的"classpath:"與"classpath*:"的區別研究

onf 文件夾 spa 作用 XML ner ron style 多個 概念解釋及使用場景: classpath是指WEB-INF文件夾下的classes目錄。 通常我們一般使用這種寫法實在web.xml中,比如spring加載bean的上下文時,如下: <!--系

文件list的基本操作 1.1

文件(list)的基本操作1.文件的讀操作 基本格式: f=open(‘文件名‘,‘r‘,encoding=‘utf-8‘)以這種形式打開的文件只能進行 讀 操作 f=open(‘believe‘,‘r‘,encoding=‘utf-8‘) # 只讀 date=f.read() print(date)

Kafka:ZK+Kafka+Spark Streaming集群環境搭建安裝spark2.2.1

node word clas 執行 選擇 dir clust 用戶名 uil 如何配置centos虛擬機請參考《Kafka:ZK+Kafka+Spark Streaming集群環境搭建(一)VMW安裝四臺CentOS,並實現本機與它們能交互,虛擬機內部實現可以上網。》 如

Kafka:ZK+Kafka+Spark Streaming集群環境搭建安裝kafka_2.11-1.1.0

itl CA blog tor line cat pre PE atan 如何搭建配置centos虛擬機請參考《Kafka:ZK+Kafka+Spark Streaming集群環境搭建(一)VMW安裝四臺CentOS,並實現本機與它們能交互,虛擬機內部實現可以上網。》 如