2019年12月2日 星期一

Linux 螢幕校正

最近佇學攝影 (liap-iánn). 我攏佇電腦整理相片。

毋過, 定定佇我的 Laptop 頂仔看起來色緻閣會算正常的相片,擲入去 LINE,佇手機仔內面看起來色緻煞烏趖趖。有時會予老師罵講這相片 "曝光(pha̍k-kng)不足" 也敢交出來, 按呢實在是真冤枉!

後來,攝影老師借我一隻 x-rite i1 Display Pro專業色彩校正機器乎我試看佇 Linux 按怎做。

我記得較早佇 Linux 頂做色彩校正足麻煩的。毋過這擺發現伊加真簡單。

參考這篇文章: How to color calibrate your monitor in Linux, 照步來就 kha̋n-jó 起來。毋過,有一寡鋩鋩角角嘛是愛小注意一个。這篇文章有介紹一寡色彩的基礎智識,若有閒嘛是會使共伊斟酌看,順紲練英文。我佇遮干焦共我佇 Ubuntu Linux 頂懸的實驗,一步一步共伊寫落來,後擺若是有人欲作,就照起工來行就會使。


環境佮器材

我實驗的環境是 Ubuntu Linux 19.10 (Eoan Ermine)。
x-rite i1 Display Pro, PCHome 有佇賣

安裝 DisplayCal

用 Google 抑是去伊官方網站去掠: 揤落你會看著這個畫面:


揤綠晚中方 Get DisplayCAL,伊會走去

你會使看著,伊支援真濟 OS,咱就揀 Linux:



揣 Ubuntu 19.10 (Eoan) 的 x86_64, 共伊搝落來。

紲落來安裝,若是順利,你干焦佇 Terminal 落:

# dpkg -i displaycal_3.8.8.1-1_amd64.deb

就結束。若是拄著錯誤,親像

dpkg: 因相依問題,無法設定 displaycal:
 displaycal 相依於 python-wxgtk3.0 (>= 3.0) | python-wxgtk2.8 (>= 2.8.11)﹔然而:
  套件 python-wxgtk3.0 未安裝。
  套件 python-wxgtk2.8 未安裝。
 displaycal 相依於 python-numpy (>= 1.0)﹔然而:
  套件 python-numpy 未安裝。
 displaycal 相依於 python-psutil﹔然而:
  套件 python-psutil 未安裝。
 displaycal 相依於 libsdl2-mixer-2.0-0﹔然而:
  套件 libsdl2-mixer-2.0-0 未安裝。

你就愛事先共這寡欠的包袱仔攏安起哩:

sudo apt install -f python-wxgtk3.0  python-numpy python-psutil libsdl2-mixer-2.0-0
sudo apt --fix-broken install

這 sudo apt --fix-broken install 是因為閣有依賴的包袱仔 (dependent package) 的問題,叫 apt 去共伊修理予好。按呢生,你閣來行 dpkg -i displaycal_3.8.8.1-1_amd64.deb 應該都無問題囉。

開始校正 - 設定


  1. 先共 x-lite i1 Display Pro 的 USB 頭插入去電腦的 USB 空
  2. 拍開 displaycal,看你欲用命令 displaycal 抑是對 GUI 開攏好。若是你是頭一擺拍開, 伊會自動去 ArgyllCMS 網站去掠一寡需要的資料轉來,伊嘛認得你使用的彩色校正器是佗一款,自動去掠伊的需要的物件來。若是第二擺以後,就直接走去 3
  3. 你會看著一个金光閃閃的起磅畫面,落尾停佇遮:





  • Settings 有濟濟無仝的設定,普通 Laptop 是使用 Gamma 2.2,你會使用 Default (Gama 2.2) 抑是 Laptop (Gamma 2.2)。我是揀 Laptop。
  • Display 伊會自動揣著你的螢幕是佗一款。若是你有接兩台,你愛揀你欲調整佗一台。
  • Instrument 會顯示你的校正器,像我用的 i1 DisplayPro.
  • Mode 因為我是 LCD 螢幕,所以改 LCD (generic)。


紲落來切到 Calibration 彼搭 (Tab)



Calibration settings 起勾 interactive display adjustment
Calibration speed 會使調整速度,看你有趕時間無? 當然愈慢是愈準。

按呢都差不多會用來開始

校正

先共色彩校正器 i1 DisplayPro 的蓋拍開,掛佇螢幕,予伊對頂懸垂落來,親像按呢:


共 DisplayCal 上下跤的 Calibrate & profile 揤落去, 伊會出現一个四角型,你會使調整伊的位置佮大細。上好是踮中方,揤 start measurement:



你會看著一个窗仔號做 Interactive display adjustment,中方會閃幾落擺無烏色,白色,鳥鼠仔色的四角,等到 Interactive display adjustmentStart measurement 會使揤,就共伊揤落去:


過無偌久,紅色, 綠色, 藍色的長線就捅出來。in 的長度無仝。若是理想,愛調整到中方三角型的所在。毋過,目前我閣無看著伊有法度雕到遐。有可能我用的螢幕攏是俗物。

而且,愛注意: 你螢幕的光度,會影響著這個部份的值。像我共伊揤較光抑是較暗,伊紅綠藍的長度就無仝, 你上好愛固定伊的光度。



不管按怎等,伊攏袂自動停,所以等一段時間,揤 Stop measurement, 閣揤 Countinue
,伊就開始紲落去..




這時間閣愛真久...., 等到結束了後, 會出現:


你會使看覓伊的內容, 去勾 Show profile information:


倒手爿彼張圖,是顯示你的顯示器偌有才調: 若是彩色的範圍愈大愈倚外面彼輾白色的框,表示你的螢幕有法度表現的色彩較濟。
若是無問題,就揤 Install Profile 來共伊安入去電腦內面, 出現這:

揤 "匯入",


按呢揤 OK 就結束啊!

佇 GNOME 中方檢查看覓

你若是用 GNOME 3 / GNOME SHELL, 開正手爿頂懸的設定值 --> 裝置 --> 色彩:



會看著出現一個新的,有日期的 Profile,你會使切過覓佮舊的敢有啥物差別無?


2019年8月25日 星期日

Ubuntu 變啞口 (Audio has dummy output)

uì升級到 Ubuntu 19.04, Disco Dingo, 我的電腦忽然間變啞口. 雖然你會當佇正手頂懸看著喇叭的音量符號, 毋過無聲. 你入去 設定->音效 裏去看伊的輸出裝置, 干焦會看著 Dummy Output. 我小搜揣網路, 有看著這个討論綰:

Fix No Sound (Dummy Output) Issue In Ubuntu With SND HDA Intel

一開始照伊講个步序行, 攏無法度解決我的問題:

檢查

1 先落 lsmod|grep snd_hda_intel 來檢查有這寡 Má-tsìo (module) 無?

結果是有
# lsmod|grep snd_hda_intel
snd_hda_intel          40960  4
snd_hda_codec         131072  4 snd_hda_codec_generic,snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec_idt
snd_hda_core           86016  5 snd_hda_codec_generic,snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec,snd_hda_codec_idt
snd_pcm               102400  5 snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec,snd_hda_core
snd                    81920  18 snd_hda_codec_generic,snd_seq,snd_seq_device,snd_hda_codec_hdmi,snd_hwdep,snd_hda_intel,snd_hda_codec,snd_timer,snd_pcm,snd_hda_codec_idt,snd_rawmidi

2 落 檢查 Audio 晶片的資訊:
確定是 Intel 晶片, 是用 snd_hda_intel 無毋著。精差彼版本無仝, 我的有較新淡薄仔:

# lspci -nnk | grep -A2 Audio
00:1b.0 Audio device [0403]: Intel Corporation 7 Series/C216 Chipset Family High Definition Audio Controller [8086:1e20] (rev 04)
 Subsystem: Dell 7 Series/C216 Chipset Family High Definition Audio Controller [1028:0534]
 Kernel driver in use: snd_hda_intel
 Kernel modules: snd_hda_intel

試伊的方法

伊講佇 /etc/modprobe.d/alsa-base.conf 尾溜添一逝: options snd-hda-intel model=auto, 我就用 root 身份, 用文字編輯器 vim (抑是任何你慣勢用个) 共伊添入去. 當然用伊的方法嘛會用得, 這是仝款的意思


# echo "options snd-hda-intel model=generic" | sudo tee -a /etc/modprobe.d/alsa-base.conf

紲落來重開 (reboot).

毋過按呢無較縒

閣共 model 改做 auto

# echo "options snd-hda-intel model=auto" | sudo tee -a /etc/modprobe.d/alsa-base.conf

嘛無路用。看來是無步矣, 欲按怎呢?


上尾的絕招

當佇頭𢯾佇燒的時陣,佇下面的討論粽捾(discuss thread)巡巡咧, 看著有人講, 愛落:

# pulseaudio -k && sudo alsa force-reload

就免重開機。

我就共伊試看覓, 結果按呢生聲音就走出來矣, 彼 輸出裝置 就成做 喇叭 - 內部音效 矣 。

所以,這的問題對我來講, 解決方式就是修改, alsa-base.conf, 重開機, 閣用這個絕招.

愛特別注意: pulseausio -k 干焦會當佇普通使用者 (normal user), 袂使佇 root  身份.


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 來做為倒退攄的輸入。



←前一篇     後一篇→





2019年5月5日 星期日

Python Deep Learning 深學筆記 - Affine 棧佮 Sigmoid

←前一篇    後一篇→


咱了解倒退攄演算法, 其實就是利用計算圖來共一个點的計算分拆, 成做上基本的數學式, 現此時就是愛共這寡基本運算的倒退攄公式揣出來, 才閣共 in 合起來。前一篇是分析,這篇是欲討論佮做伙。


A-hainn棧 (Affine Layer) 的觀念

Affine (華語: 仿射, 台語暫時用音譯: A-hainn) 是幾何學的名詞,Affine transformation 就是共一組點, 線, 抑是平面,對一個空間, 轉換到另一個空間。

這兩個空間是有關係的。

簡單舉一个例: 日落山的時陣,日頭光共你的影炤甲長ló-ló。嘛共你身軀邊的愛人的影炤甲長長長。日頭就是彼个 A-hainn  函式,共你佮你的愛人, 活佇真實世界的人,成做 (transform) 平面的影。

影佮你是有關係, 你振動, 伊嘛振動。你兩个徛做伙,影嘛黏牢牢。
影佮你是無仝--ê。伊無面無喙,干焦深淺無仝的烏,佇平面活動。

普通 A-hainn 運算,是矩陣 (Matrix)運算。

對另一個角度來講,就是共一組數字,透過固定的方式 (function, 函式), 成做另一組數字。
所以,神經網路對輸入,一棧一棧, 向前行的演算法,做 dot 運算閣加法:


X ● W1 + B1 = A1
h(A1) = Y

這款矩陣 Dot 運算, 也就是一種 A-hainn 運算。


Dot 運算的計算圖

加法真簡單, 咱來看  X* W = Y 就好.
透過計算圖來分拆:


伊的倒退攄是:





其中
  • Δ 是 diff 的意思。因為數學符號僫拍, 有時用字母 d 代替.
  • 細个 T 佇 W 抑是 X 的正手爿較懸, 是Matrix 的斜倒反(Transpose, 音譯: Tsuán-su-pho-su, 簡單寫做 Tsuán-su-pho)。有時為著簡單拍字, 嘛寫做 ^T.

愛注意: 佇 Dot 運算, 順序是要緊的. X ● W 袂使寫做 W   X. 當然, 你欲做甲真幼, 來推算 Dot 的倒退攄嘛是會使。彼是滿滿的數學.

啥乜是斜倒反咧? 咱回想 2 維陣列 ê 運算是有維度个, 準講 2x3 的 Mé-tshuì, 伊的倒反就是:
沿伊的對角線共伊反--過來, 成做 3x2 的 Mé-tshuì

你若閣有印象, 伊略略仔有成乘法的倒退攄: 就是對輸入 X 來講, 攄轉來的變化,是受著另一爿輸入 W 的影響(乘法時是乘以 W 倍, Dot 運算時是 dot)。仝理, W 嘛是受著 X 的影響。咱就無閣詳細分拆這過程。咱注心來看為啥物欲有這个 Transpose。
其實,這是 uì 陣列的 dot 運算,算倒轉來需要个: 咱回想 Dot 運算的這張圖:


咱若是欲算轉來, [ [50, 68], [122, 167]] 顛倒反算轉來 [[1, 2, 3], [4, 5, 6]] 欲按怎做呢? Mé-tshuì 無除法, 伊的逆運算是揣出一个 Mé-tshuì, 共結果 dot 這个 Mé-tshuì 會當得著原來的 Mé-tshuì,彼个型是:






X 的維度是偌濟呢? 咱 uì Matrix ê Dot 運算知影: 

  • dot 倒手爿Mé-tshuì 幾逝 (row)  , 等號 (=) 算出來的 Mé-tshuì  就幾逝
  • dot 正手爿Mé-tshuì 幾欄(column),  等號 (=) 算出來的 Mé-tshuì  就幾欄

所致,咱會當推算出來 X 的型是 2x3:
拄好就是原在 3x2 的斜倒反。當然,a1~a3, b1~b3 和原來的數字無仝,這你會使一个一个去算。
重點是: 咱佇遮欲解說的是: 倒退攄uì顛倒頭算轉來,因為輸入佮輸出的維度攏愛維持,中方使用著的 Mé-tshuì 就愛共伊對角反過來,這我共伊號做 "斜倒反(tshiâ-tó-ping)".


伊的寫法, 就是佇 layers.py 內面的 class Affine


Softmax 的倒退攄


這若是學過微積分 (Calculus), 就會曉知按怎共伊算出來. 咱佇遮共伊直接寫落來:


閣小可整理一个, 就成做:


當然, y, 就是佇寫過个 y = 1/(1+exp(-x))。為啥物欲做這款的變化? 因為按呢較簡單算。y 的值佇向前行 (forward propagation) 就算出來矣, 咱倒退攄時,干焦做乘法當然比平方(pîng-hong) 閣指數(kí-sòo) 加真簡單。參考 layers.py 的 class Sigmoid 的 backward() 函式, 是毋是真屧貼?


←前一篇    後一篇→



佇 Linux 來看GPX 檔案

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