作者 | 李秋鍵
責編 | 劉靜
引言: 相信我們都做過一些圖片分類或者是其他分類的項目,我們知道神經網絡是在w和b參數調節基礎上,使得x與y達到對應輸出的效果。比如最經典的Mnist手寫字體識別,給一張圖片模型判斷後將會輸出數字結果,比如這樣:
我們知道大多數生成網絡是用的GAN算法,顯然他有他自己的優勢,
通過對目的的改進,可以變更機率分解建模的變量,使隨機變量與具體數據分布儘量相似。在現代的分解建模中的,一般使用統計數據的似然作為改進目的,而GAN創新地用於了另一個改進目的。
首先,引進判斷建模(常見建模還包括反對矢量機和多層人工神經網絡)。
其次,其改進步驟是在分解建模和判斷建模兩者之間尋找沃克平衡。
GAN創建的自學構建實質上是分解建模和判斷建模兩者之間的仿真博弈論。
分解建模的目標是儘量多地仿真、仿真和自學現實統計數據的產於規律性。
判斷建模是辨別一個輸出統計數據是來自現實的數據分布還是分解的建模。
通過這兩個外部建模兩者之間的停滯市場競爭,提升了分解和區別這兩個建模的戰鬥能力。如果分解的建模統計數據依然不存在誤解,無法準確辨別,那麼我們指出分解的建模實質上早已理解了現實統計數據的狀況。
與其它算法比起,GAN能製造出有更加明晰、現實的樣本
下面我們將對我們的項目進行演示講解
通過程序調試可以知道,它的輸入端是x,為多行784列的矩陣,而輸出端是多行10列的矩陣為onehot編碼形式,即[0,0,0,1,0,0,0,0,0,0]這種形式。
那麼我們不妨設想,如果把x換成[0,0,0,1,0,0,0,0,0,0]形式,而輸出端換成多行784列的矩陣又將如何呢,下面我們將對其進行修改演示。
首先導入相關的庫:
from __future__ import absolute_importfrom __future__ import divisionfrom __future__ import print_function#構建TensorFlow模型import tensorflow as tfimport sysimport numpy as npfrom matplotlib import pyplot as pltfrom tensorflow.examples.tutorials.mnist import input_data
讀入數據:
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)print(mnist)
下面是定義變量和佔位符,注意看我的修改:
x = tf.placeholder("float", [None, 10])#佔位符W = tf.Variable(tf.zeros([10,784]))#賦值變量,生成784*10的矩陣,內容全為零b = tf.Variable(tf.zeros([784]))#同上理y = tf.nn.softmax(tf.matmul(x,W) + b)#將x*W+b公式計算的結果藉助softmax激活函數分類y_ = tf.placeholder("float", [None,784])#佔位符,生成10列的矩陣,行數自適應
很顯然在上面我們把x輸入改成了[0,0,0,1,0,0,0,0,0,0]形式,而y則是多行784列的矩陣,為了滿足矩陣相乘的條件,把w和b也對應互換。
下面我們就用最簡單的算法進行實現,因為我們只是在試探生成器的原理,至於是用神經網絡算法還是卷積等等最後按照自己需求修改即可。
分別定義短時函數,優化器梯度下降,以及會話訓練的準備。
cross_entropy = -tf.reduce_sum(y_*tf.log(y))#定義損失函數為y*logy的算術平均值train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)#梯度下降法減少損失函數的值,優化模型init = tf.initialize_all_variables()#模型初始化。即所有參數初始為0sess = tf.Session()#模型初始化會話sess.run(init)#準備訓練correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))#定義預測準確數,通過對比y真實值和y_預測值的相等的數量accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))#定義準確率為準確率的均方差
然後訓練1000次:
for i in range(1000):#訓練1000次if i % 20 == 0:#每20次向控制臺輸出結果 sys.stdout.write('.') batch_xs, batch_ys = mnist.train.next_batch(100)#訓練批次為100次 sess.run(train_step, feed_dict={y_: batch_xs, x: batch_ys})#建立訓練 ttt=str(sess.run(accuracy, feed_dict={y_: batch_xs, x: batch_ys}))print("訓練第"+str(i)+"次的準確率為"+ttt)
輸出下最終得到的結果,看生成的圖片效果怎麼樣:
print (sess.run(accuracy, feed_dict={y_: mnist.test.images, x: mnist.test.labels}))#測試輸出預測結果'''顯示圖片預測'''x=np.array([[0,1,0,0,0,0,0,0,0,0]])x=tf.cast(x,tf.float32)plt.figure()y=tf.nn.softmax(tf.matmul(x,W) + b)y=y.eval(session=sess)print(y)y=np.reshape(y,[28,28])plt.imshow(y)plt.show()
僅僅是5秒的時間,我們便訓練了1000次生成了圖片,因為是最簡單的線性訓練,測試的是生成數字1的圖片
效果如下圖所示:
很顯然我們5秒生成的圖片效果還不錯,還是挺接近1的。如果你想要更多的效果可以修改生成其他圖片。我們這個項目最簡單的講解了生成器和判別器的互換,讓更多的人不必研究那些深奧的算法即可實現生成圖片。那麼下面我們將生成器做更深的了解。
市面上大多數生成圖片是用的GAN算法,即生成對抗神經網絡,很顯然我們用了如此簡單的算法也可以實現生成圖片的效果。但是不可忽略的是GAN的效果會更好些,但是難度較大。那麼我們將對其中的GAN做個簡單的介紹。
GAN主要的啟發可能是零和的遊戲在概率論觀念,運用於淺自學人工神經網絡,是通過生成器和判斷器(鑑頻器)網路遊戲,從而使S自學數據分布,如果用在影像分解軍事訓練已完成後,S可以從一個哈希分解細緻的影像。
G和D的主要基本功能是:
G是一個生成網,它接管一個隨機噪聲y(哈希),通過雜訊分解影像。
D是一個辨別影像否「現實」的網。它的輸出變量是f, f推選一張照片,輸入E (f)推選f是一張現實照片的機率。如果是1,推選100%現實的影像,如果是0,推選不有可能的影像。
在軍事訓練步驟中的,分解網際網路S的目的是分解儘量多的現實影像來愚弄網際網路E,而E的目的是企圖將S分解的騙影像與現實影像區別。這樣,S和E包含一個靜態的「博弈論步驟」,最後的均衡點為沃克均衡點。
通過對目的的改進,可以變更機率分解建模的變量,使隨機變量與具體數據分布儘量相似。
那麼,如何界定必要的改進目的或傷亡呢?
在現代的分解建模中的,一般使用統計數據的似然作為改進目的,而GAN創新地用於了另一個改進目的。
首先,引進判斷建模(常見建模還包括反對矢量機和多層人工神經網絡)。
其次,其改進步驟是在分解建模和判斷建模兩者之間尋找沃克平衡。
GAN創建的自學構建實質上是分解建模和判斷建模兩者之間的仿真博弈論。
分解建模的目標是儘量多地仿真、仿真和自學現實統計數據的產於規律性。
判斷建模是辨別一個輸出統計數據是來自現實的數據分布還是分解的建模。
通過這兩個外部建模兩者之間的停滯市場競爭,提升了分解和區別這兩個建模的戰鬥能力。
當一個建模具備極強的區別戰鬥能力時。
如果分解的建模統計數據依然不存在誤解,無法準確辨別,那麼我們指出分解的建模實質上早已理解了現實統計數據的產於狀況。
作者簡介: 李秋鍵,CSDN 博客專家,CSDN達人課作者。
聲明:本文系作者獨立觀點,不代表CSDN立場。