今天受到趙大神的啟發決定來上一下TensorFlow的課,遇到第一個程式作業就有些看不懂的東西,決定用一種意識流的方法來寫寫看筆記,幫助自己更加理解!
原始的程式碼挖了個空,要自己寫softmax
<pre>"""Softmax.""" scores = [3.0, 1.0, 0.2] import numpy as np def softmax(x): """Compute softmax values for each sets of scores in x.""" pass # TODO: Compute and return softmax(x) print(softmax(scores)) # Plot softmax curves import matplotlib.pyplot as plt x = np.arange(-2.0, 6.0, 0.1) scores = np.vstack([x, np.ones_like(x), 0.2 * np.ones_like(x)]) plt.plot(x, softmax(scores).T, linewidth=2) plt.show()
當務之急是先了解函式的特性
所以假設我把[3.0, 1.0, 0.2]傳進來,我想得到的應該是[exp(3.0)/(exp(3.0)+exp(1.0)+exp(0.2)), …],所以就先算出分母,然後把最後的陣列湊出來應該就行了吧。
啊不過要怎麼算exponential咧? 查了一下發現numpy裡就有好用的函式可以算整個陣列的exponential值~
寫出來就像這樣:
import numpy as np def softmax(x): """Compute softmax values for each sets of scores in x.""" sum=0 for item in x: sum += np.exp(item) return np.exp(x)/sum
不過我很好奇後面那一坨code詳細做了什麼,怎麼有辦法產生出一張有點酷炫的圖:
嗯就來看看這一坨東東:
# Plot softmax curves import matplotlib.pyplot as plt x = np.arange(-2.0, 6.0, 0.1) scores = np.vstack([x, np.ones_like(x), 0.2 * np.ones_like(x)]) plt.plot(x, softmax(scores).T, linewidth=2) plt.show()
首先我們可以先預測這一段code到底要幹嘛,解讀起來看看是否印證預測,會比較快。如果光看圖的話,感覺就是想要畫出一個X軸,根據X軸的變化改變scores裡面的三個值,然後把三個值經過softmax之後的值畫在Y軸上(所以Y軸的最大值是1)。
好喔好像滿合理的~
所以首先我們要產生X軸的值,從圖上可以明顯看到最小值是-2、最大值是6,恩所以np.arange應該就是用來產生一系列的X軸值,查到的結果也的確是這樣。
接下來這一行有點噁心,一下vstack一下ones_like的,到底是什麼東西?不要急,一個一個來~
ones_like就只是產生一個全部都是1的list而已,不過list的維度會跟input一樣,所以ones_like(x)會產生一個跟x一樣大小,只是裡面的元素全部都是1。
啊vstack不過就是把幾個list疊在一起而已,上個圖就瞭了:
接下來就是最不直覺的地方了,我傳進去softmax(scores)的scores不應該是把三個score值放在同一個list裡嗎?啊怎麼反而分散在三個list裡面?這傳進我的softmax裡面應該會爆吧?
原來這個(.T)偷偷做了transpose!不過這還是不足已解釋傳進去的時候為什麼會有那樣的行為,不過這個問題不是很重要,我懶得再花時間了,有需要的話會再遇到的XD