2019年7月23日 星期二

Google Calendar 定定出現歹物仔

最近, 我的 Google Calendar 定定出現莫名其妙的 "活動", 點入去親像按呢:



這文字看無, 共 "Вам поступил перевод " kok-pì (Copy) 起來, 貼入去 Google 翻譯,知影伊是露西阿 (Russia) 文。

當當我共伊揭挕捒,隔轉工伊閣出現,有時陣一出現就是規個月三十工滿滿,真齷齪,刣袂離。就愛想一个辦法來解決。

原來這活動是透過 Gmail 添入來个。Gmail 有一个功能是: 若有人寄邀請予你,伊就會自動添一个活動去 Google 曆日。就算我已經共彼張批擲入去糞埽桶(Trash) 抑是設做糞埽批(垃圾郵件) 嘛無路用。

後來揣著方法是按呢,這干焦會使踮桌面版的 Google 曆日設,袂使佇手機版的 Ep (App)
  1. 揤正手頂懸,六齒的 Gí-a icon,出現 Mé-nìu (Menu) 了後,入去 一般設定 這个 Thé-phù (Tab)
  2. "自動新增邀請",共伊揤落,改做 "不, 只顯示我已經回覆的邀請"
  3. 切過去 "畫面顯示設定",揣 "顯示已拒絕的活動",佇頭前的四角框,若是有一个勾勾仔,就共伊揤落去,予勾仔無--去。
毋過,我感覺上好的辦法是: 直接佇 Gmail ,設定 --> 篩選器和封鎖的地址 中方,共彼个電批 (Email) 的地址封鎖--起來。

2019年7月5日 星期五

倒退攄的煞鼓 -- 佮伊佮做伙

←前一篇 


到今,咱已經共所有倒退攄所需要的倒退攄攏搜揣出來,這馬是時機來共伊佮做伙。咱先來看伊的圖:


一棧一棧的實作,是囥佇 layers.py
伊主要的程式,是囥佇 two_layer_net.py

咱來斟酌解說一个:

    def __init__(self, input_size, hidden_size, output_size, weight_init_std = 0.01):
        # 開始攢好勢
        self.params = {}
        self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size)
        self.params['b1'] = np.zeros(hidden_size)
        self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size) 
        self.params['b2'] = np.zeros(output_size)

        # 共伊一棧一棧疊khi
        self.layers = OrderedDict()
        self.layers['Affine1'] = Affine(self.params['W1'], self.params['b1'])
        self.layers['Relu1'] = Relu()
        self.layers['Affine2'] = Affine(self.params['W2'], self.params['b2'])

        self.lastLayer = SoftmaxWithLoss()

這前半段佮神經網路的學習siâng
第二段是使用一个特別的資料結構: OrderedDict 來共一棧一棧整--起來。
啥乜是 OrderedDict 咧? 簡單講,伊是一款字典 (Dictionary),毋過伊會共添入去的資料照順序排予好勢。原在字典內面的資料,是用 Khí(Key) 來揣出來,伊是無順序,由在 Python 家己去安排。按呢有啥乜好處? 小等你就知。


向前行


主程式是 gradient(),一開始就呼 (khoo/call) self.loss(x, t)

    def gradient(self, x, t):
        # forward
        self.loss(x, t)

        # backward
        dout = 1
        dout = self.lastLayer.backward(dout)
        
        layers = list(self.layers.values())
        layers.reverse()
        for layer in layers:
            dout = layer.backward(dout)

        # 設定
        grads = {}
        grads['W1'], grads['b1'] = self.layers['Affine1'].dW, self.layers['Affine1'].db
        grads['W2'], grads['b2'] = self.layers['Affine2'].dW, self.layers['Affine2'].db

        return grads


這 loss() 就是共向前行(Forward propagation),softmax 和 error function 一擺做到底。

    # x:入力データ, t:教師データ
    def loss(self, x, t):
        y = self.predict(x)
        return self.lastLayer.forward(y, t)

loss() 分兩步: predict() 佮 lastLayer.forward(),也就是共上尾彼 SoftmaxWithLoss() 另外做。

    def predict(self, x):
        for layer in self.layers.values():
            x = layer.forward(x)
        
        return x

predict() 嘛是有影簡單。一个 for 箍輾,照步來,去呼 layers 內面,逐棧的 forward() 函式。照頂懸 __init__() 所指定,就是照 Affine1, ReLU1, Affine2,一个一个呼伊的 forward(),共逐棧的輸出,成做會一棧的輸入。

這就是 OrderedDict 好用的所在,我毋免一个一个寫出來,用 for loop 就好。



倒退攄

佇 gradient() 內底,dout = 1 做參數開始,先呼上尾棧 lastLayer 的 backward()。紲落來這幾逝嘛是用  OrderedDict 的奇巧:

        layers = list(self.layers.values())
        layers.reverse()
        for layer in layers:
            dout = layer.backward(dout)

因為伊是照順序,我共伊的值捎出來,共伊顛倒反 (layers.revers()),閣用 for 箍輾,伊就是倒退攄囉。

結束了後,咱欲愛的 W1 和 W2 的改變,是囥佇 Affine layer 內底 (參考 layers.py 的 Affine Clase), 所以愛共伊掠出來:

        grads['W1'], grads['b1'] = self.layers['Affine1'].dW, self.layers['Affine1'].db
        grads['W2'], grads['b2'] = self.layers['Affine2'].dW, self.layers['Affine2'].db

擲轉去。


轉去 20181028 這工

 20181028 這工是咱頭一擺來訓練神經網路。gradient() 就是囥佇 train_neuralnet.py 內面使用,咱得著的 grads, 是予伊用來改變 network_parameters: 

    grad = network.gradient(x_batch, t_batch)
    for key in ('W1', 'b1', 'W2', 'b2'):
        network.params[key] -= learning_rate * grad[key]

紲落來才閣進行下一擺的訓練。

uì 20181028 講到今嘛年外,講甲落落長,伊上重要的觀念就是共正港的數學微分,伊的運算方式,改用倒退攄的方法。倒退攄,其實就是共微分个運算拍破,分解做上基本的神經元有法度算。按呢生會使予會算數速度加有夠緊,按呢才有實用的價值。

寫到遮,應該共神經網路上基本的原理講到一个崁站矣。這个系列嘛欲踮遮到煞鼓矣。這本書: 

Deep Learning|用Python進行深度學習的基礎理論實作 


後半段閣有袂少內容。毋過,完全共人用心血寫落來的書囥佇網路頂予人免費看,按呢嘛無好。向望逐家若是有興趣,會當去共伊交關一咧。

因為是利用做工課掠外,有閒的時間才寫,有當時閣會懶屍,所以進度真慢。總是,佇寫的時陣,才會了解台語欲寫專業的物件,會拄著啥乜困難,解決的方向是佗一爿? 加一个行業有人用台語寫作,就加一个行業的專有名詞會生--出來。各行各業攏有人用台語寫,台語才會健康生湠落去。特別是上新个智識,咱莫共家己母語限制佇厝內,抑是懷舊爾爾。

←前一篇 


Python Deep Learning 深學筆記 - Softmax 佮 Loss 的倒退攄

←前一篇     後一篇→


上尾, 咱欲討論輸出棧的倒退攄。

 uì 輸出棧 ê 一寡討論,知影分類問題用 softmax (Sòo-hu-mak-su)函數。所致,咱愛揣出 softmax 的倒退攄函式。
上尾,閣愛用 Loss 函式來算出精差是偌濟,親像這張圖:




因為這數學較複雜, 咱直接看伊的結果:


綠色是向前行, 藍色是倒退攄。
看著倒退攄是遐呢仔簡單的 y - t, 佮向前行 ê 時陣彼款複雜的算式比起來, 是夭壽簡單。會得著遮爾媠氣的結果,當然是揀著好用的 Cross Entropy Error 函式,佮 Softmax 會貼峇的結果。若有興趣,會當參考原書的附錄 A。

根據這結果,咱來看 Python 的 code 按怎寫, 參考 layers.py  中方的 class SoftmaxWithLoss:


class SoftmaxWithLoss:
    def __init__(self):
        self.loss = None
        self.y = None # softmax 的輸出
        self.t = None # 正確的答案

    def forward(self, x, t):
        self.t = t
        self.y = softmax(x)
        self.loss = cross_entropy_error(self.y, self.t)
        
        return self.loss

    def backward(self, dout=1):
        batch_size = self.t.shape[0]
        if self.t.size == self.y.size: # 這是 one-hot vector
            dx = (self.y - self.t) / batch_size
        else:
            dx = self.y.copy()
            dx[np.arange(batch_size), self.t] -= 1
            dx = dx / batch_size
        
        return dx


backward() 的 if 條件式內面, 就是 (y1 - t1), (y2 - y2), ... 的實做。毋過遮爾清氣的結果, 是佇
t 是 one-hot 的條件之下。啥乜是 one hot 呢? 咱來回想 MNIST 資料集中方, load_mnist() 介紹有紹介.

若是 else 彼爿就較複雜, 我現此時嘛毋知影。因為咱目前用的 MNIST 資料是 one hot, 就先按呢行落去。

上尾愛講予斟酌的所在是: backward(self, dout=1). dout = 1, 是因為當當咱算出 dL (delta L), 成做倒退攄的輸入的時陣,若是 dL 大, 就表示離標準答案差較遠。dL 細, 就較倚標準答案。所以咱會向望 dL 大的時陣,倒退攄的輸入嘛愛大,予伊刺激較強。所以根據得著的 dL,咱會用 dL/dL = 1 來做為倒退攄的輸入。



←前一篇     後一篇→





佇 Linux 來看GPX 檔案

最近定定有戶外活動。使用𤆬路機 (GPS) 來記錄行過的路線。普通我記錄路線,攏是用手機仔抑是專門个𤆬路機,罕得用電腦來看。 毋過,"仙人拍鼓有時錯,跤步踏差啥人無"。有一擺我無細膩,袂記得共一擺活動的路線收煞起來,閣直接開始記錄下一擺的活動,按呢共幾落...