Robotics

TensorFlow課程筆記-Softmax實作

今天受到趙大神的啟發決定來上一下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()

當務之急是先了解函式的特性

1

所以假設我把[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詳細做了什麼,怎麼有辦法產生出一張有點酷炫的圖:
1

嗯就來看看這一坨東東:

# 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疊在一起而已,上個圖就瞭了:
1

接下來就是最不直覺的地方了,我傳進去softmax(scores)的scores不應該是把三個score值放在同一個list裡嗎?啊怎麼反而分散在三個list裡面?這傳進我的softmax裡面應該會爆吧?

原來這個(.T)偷偷做了transpose!不過這還是不足已解釋傳進去的時候為什麼會有那樣的行為,不過這個問題不是很重要,我懶得再花時間了,有需要的話會再遇到的XD

Leave a comment