回覆列表
  • 1 # ACG喵醬

    首先定兩頭或三頭身,不用多說了。其次你得想想,你要畫什麼,要表達一件什麼事情,比如Q版人物在幹什麼,比如寫字、唱歌。這樣的話動作就出來了。然後是表情。表情嘛、哭啊、笑啊、都可以。只不過要先看Q版人物在幹什麼,千萬不要Q版人物明明在看笑話結果表現出另一種表情,很不協調。接下來是髮型。您可以多看一些日本漫畫或動畫,最常見的髮型就是馬尾辮、蘑菇頭、姬髮式頭型、披肩發等,您可以按照Q版人物或您自己的需要來畫。服飾也是同樣的,如果沒有時間看漫畫或動畫,建議您到書店去買一些關於怎樣畫漫畫的書。服飾最好要合身,不要一個九歲的孩子穿二十幾歲人的衣服或者打扮得很成熟,這樣也會顯得怪怪的。服裝對於女生常見的有連衣裙,超短裙,運動服,女僕裝和貓耳是Q版人物的萌點,可以按照您的喜好畫上去哦!

  • 2 # 機器之心Pro

    機器之心曾介紹過一篇教程《使用變分自編碼器VAE生成動漫人物形象》,可作為參考。

    在影象生成領域,人們總是喜歡試著將變分自編碼器(VAE)和對抗生成網路(GAN)相比較。人們的共識是,VAE 更容易被訓練,並且具有顯式的分佈假設(高斯分佈)用於顯式的表示和觀察,而 GAN 則能夠更好地捕獲觀測值的分佈並且對觀測分佈沒有任何的假設。結果就是,每個人都相信只有 GAN 能夠創造出清晰而生動的圖片。雖然可能確實是這樣,因為從理論上講,GAN 捕獲到了畫素之間的相關性,但是沒有多少人試過用比 28*28 維的 MNIST 資料更大的圖片作為輸入訓練 VAE 來證明這一點。

    在 MNIST 資料集上有太多變分自編碼器(VAE)的實現,但是很少有人在其他的資料集上做些不一樣的事情。這是因為最原始的變分自編碼器的論文僅僅只用 MNIST 資料集作為了一個例子嗎?

    流言終結者!

    現在,讓我們做一個「流言終結者」的實踐來看看 VAE 影象生成器的效果是多麼不盡人意。例如,下面這些影象。

    模糊不清的 VAE 樣例。

    我們從尋找一些 GAN 的對比組開始。我在 Google 上搜索了」GAN 應用程式」,並且發現了一個非常有趣的 Github 程式碼倉庫,這個程式碼倉庫總結了一些 GAN 應用程式:https://github.com/nashory/gans-awesome-applications

    為什麼「GAN 應用程式」就可以呢?好吧,很難找到不是影象生成的 GAN 應用程式,不是嗎?為了讓這個實踐更加令人興奮,我們這次將嘗試用生成模型輸出一些動漫形象!

    首先,讓我們看看一個 GAN 模型完成這個任務的效果有多好。下面的兩組圖片來自於兩個做動漫圖片生成的專案,它們被很多人選擇並且以此為基礎開展工作:

    1)https://github.com/jayleicn/animeGAN

    2)https://github.com/tdrussell/IllustrationGAN

    還不錯哦,不是嗎?我喜歡它們的色彩,它們和真實的圖片十分相似。

    儘管這些圖片裡面有些重影,但它們看上去更好。我猜竅門是放大影象,僅僅只看人臉。

    結果表明,GAN 的優異表現令人印象深刻。這讓我倍感壓力。

    額... 我們還應該繼續嗎...

    從哪裡獲得資料?

    很不幸,在網路上沒有可以得到的標準動漫形象資料集。但是這不能阻止像我這樣的人去尋找它。在瀏覽了一些 GitHub 程式碼倉庫之後,我得到了一些提示:

    一個叫做「Getchu」的日本網站有大量的動漫圖片。

    需要一些工具從網上下載圖片,但是你需要自己找到這種工具。(我在這裡向你提供一個可能是不合法的)

    有很多預訓練好的 U-net/ RCNN 動漫人臉檢測器,比如 lbpcascade_animeface,這樣一來你就可以將人臉提取成 64×64 的圖片。

    變分自編碼器 VAE

    本文假設你已經閱讀了大量關於變分自編碼器的帖子。如果你沒有的話,我想向你推薦下面這幾篇文章:

    Intuitively Understanding Variational Autoencoders (https://towardsdatascience.com/intuitively-understanding-variational-autoencoders-1bfe67eb5daf)

    Tutorial—What is a variational autoencoder? (https://jaan.io/what-is-variational-autoencoder-vae-tutorial/)

    Introducing Variational Autoencoders (in Prose and Code) (http://blog.fastforwardlabs.com/2016/08/12/introducing-variational-autoencoders-in-prose-and.html)

    在 TensorFlow 中對比兩大生成模型:VAE 與 GAN

    所以,在你知道了什麼是 VAE 以及如何實現它之後,現在的問題就是「如果知道目標函式和實現方法就足夠去訓練一個變分自編碼器了嗎?」我認為答案是肯定的,但是它並不想通常說的那麼簡單。例如,這個目標函式來自哪裡的問題,以及 KL 散度分量在這裡有什麼作用。在這篇帖子中,我會試著去解釋 VAE 背後隱藏的奧秘。

    變分推斷是一種在機率圖模型(PGM)中推斷複雜分佈的技術。直觀地說,如果你不能很容易地捕獲複雜分佈的最優點,你就可以用一些像高斯分佈這樣的簡單分佈來近似估計它的上界或者下界。例如,下圖展示瞭如何使用高斯分佈近似估計區域性最優解。

    圖片來自:https://people.duke.edu/~ccc14/sta-663/EMAlgorithm.html

    請忽略標題中的 EM(最大期望演算法)。這是一個在機率圖模型中經典的最佳化方法,它能夠更新變分下界,但是現在你在深度學習中會使用隨機梯度下降演算法(SGD)。

    KL 散度是另外一個在機率圖模型中會用到的非常重要的技術。它用來測量兩個分佈之間的差異。它不是一個距離度量,因為 KL[Q||P] 不等於 KL[P||Q]。下面的幻燈片展示了這種差異。

    圖片來自:https://www.slideshare.net/Sabhaology/variational-inference

    顯然,在 Q>0 時,KL[Q||P] 不允許 P=0. 換句話說,當最小化 KL[Q||P] 時,你想用 Q 分佈來捕獲 P 分佈的一些模式,但是你必然會忽略一些模式的風險。並且,在 P>0 時,KL[P||Q] 不允許 Q=0。換句話說,當最小化 KL[P||Q] 時,你想讓 Q 捕獲整個分佈,而且如果有需要的話,完全忽略掉 P 的模式。

    到目前為止,我們直觀地明白了兩個事實:

    「變分」大致是對上界或者下界的近似。

    「KL」衡量兩個分部之間的差異。

    現在讓我們回過頭來看看 VAE 的目標函式是怎麼得來的。

    這是我對 VAE 的推導。儘管它似乎與你可能在論文中看到的看起來不同,但這是我認為最容易理解的推導。

    給定一些影象作為訓練資料,我們想要擬合一些能夠儘可能準確地表示訓練資料的引數(theta)。正式一點說,我們想要擬合用於最大化觀測值的聯合機率的模型。因此,你會得到左邊的表示式。

    「z」從何而來?

    z 是創造觀測值(影象)的潛在表示。直觀地說,我們假設一些神秘的畫家在資料集中創作這些影象(x),我們將它們稱作 Z。並且,我們發現 Z 是不確定的,有時 1 號畫家創作了圖片,有時候是 2 號畫家創作了圖片。我們僅僅知道所有的藝術家都對他們所畫的圖片有著特別的偏愛。

    大於等於號是怎麼來的?

    Jensen 不等式如下所示。注意: log 是凹函式,所以在我們的例子中,不等式反過來的。

    圖片來自 Youtube:https://www.youtube.com/watch?v=10xgmpG_uTs

    為什麼在最後一行取近似?

    我們不能對無窮的可能的 z 做幾分,所以我們使用數值逼近,這意味著我們從分佈中進行抽樣來對期望取近似。

    什麼是 P(x|z) 分佈?

    在變分自編碼器中,我們假設它是高斯函式。這就是為什麼在最佳化 VAE 時,要做均方誤差(MSE)。

    f 函式是解碼器!哦!在範數之後應該有平方符號。

    P(x|z) 的假設: 高斯和伯努利分佈。程式碼顯示了負的對數似然,因為我們總是希望最小化錯誤,而不是在深度學習中顯式地最大化似然。

    你在 Github 中看到如此多的 softmax 函式的原因是,對於像 MNIST 這樣的二進位制影象,我們假設分佈是伯努利分佈。

    什麼是 P(z|x) 分佈?

    這是高斯分佈。這就是為什麼你看到 KL 散度的實現是一個近似的解。不明白嗎?不要擔心,你可以看看這篇裡:https://stats.stackexchange.com/questions/318184/kl-loss-with-a-unit-gaussian

    Python 語言編寫的 KL 散度近似形式的表示式

    這個等式怎麼能成為一個自編碼器呢?

    等式中有兩類引數。引數 theta 是用來對分佈 P(x|z) 建模的,它將 z 解碼為影象 x。變體的 theta 是用來對分佈 Q(z|x) 建模的,它將 x 編碼成潛在的表示 z。

    自制的變分自編碼器的示意圖。綠色和藍色的部分是可微的,琥珀色的部分代表不可微的白噪聲。每個人都用著名的貓的圖片,所以這裡我使用了狗。我不知道我從哪裡得到的這張可愛的狗狗圖片。如果你知道,請告訴我,這樣我可以正確地引用原始網站。

    相應的 TensorFlow 計算圖譜:

    VAE 目標函式的兩個組成部分的意義

    最小化 KL 項:將 P(z|x) 看作 N(0,1)(標準正態分佈)。我們希望透過從標準正態分佈中抽樣來生成影象。因此,我們最好讓潛在的分佈儘可能地接近標準正態分佈。

    最大限度地減小重構損失:創造儘可能生動/真實的影象。最小化真實的影象和生成的影象之間的誤差。

    很容易看到,為了使 VAE 很好的工作,平衡這兩個部分是十分關鍵的。

    如果我們完全忽略 KL 項,變分自編碼器將收斂到標準的自編碼器,它將刪除目標函式中的隨機部分。因此,VAE 不能生成新的影象,只能記住並且展示訓練資料(或者創造純粹的噪聲,因為在那個潛在的位置沒有編碼的影象!)如果你足夠幸運的話,理想的結果是實現了核主成分分析!

    如果我們完全忽略了重構項,那麼潛在的分佈會退化成標準的正態分佈。所以無論輸入是什麼,你總是得到類似的輸出。

    一個 GAN 退化的案例。VAE 的情況也相同。圖片來自:http://yusuke-ujitoko.hatenablog.com/entry/2017/05/30/011900

    現在我們明白了:

    我們希望 VAE 生成合理的影象,但是我們不想讓它顯示訓練資料。

    我們想從標準正態分佈中取樣,但是我們不想一次又一次地看到同樣的影象。我們希望模型能產生差別非常大的影象。

    那麼,我們如何平衡它們呢?我們將觀測值的標準差設定成一個超引數。

    我看到人們經常將 KL 項設定為一個像 0.001×KL + Reconstruction_Loss 這樣的值,這是不正確的!順便問一下,這就是很多人只在 MNIST 資料集上做 VAE 的原因嗎?

    還有什麼值得注意的呢?模型的複雜程度是支撐損失函式的關鍵因素。如果解碼器太複雜,那麼即使是較弱的損失也不能阻止它過擬合。結果是,潛在的分佈被忽略了。如果解碼器太簡單了,模型就不能合理地解碼潛在的表示,最終只能捕獲一些粗略的輪廓,就像我們之前所展示的影象那樣。

    最後,如果我們上面做的事情都是正確的,是時候看看 VAE 的力量了。

    成功了!

    好吧,我承認,小圖片是沒有說服力的。

    稍微放大一點...

  • 中秋節和大豐收的關聯?
  • 苗情不好的小麥,後期應該如何管理?