[TensorFlow] TensorBoard Scalar 空白

(tensorflow 1.0.1, ubuntu 14.04 in Docker)

  1. TensorBoard Scalar 一片空白, 而 Graph 則是有東西, 顯然有找到 events 檔, 只是 scalar 那邊有點問題.
  2. 並且可能在訓練或 tensorboard 出現這一行:

Error in `python': double free or corruption (!prev)

 

根據這個官方 Issue #6968, 這是什麼 malloc 的問題. 簡單的 workaround 就是先用 libtcmalloc:


$ sudo apt-get install libtcmalloc-minimal

$ LD_PRELOAD=/usr/lib/libtcmalloc_minimal.so.4 python train.py

# tensorboard

$ LD_PRELOAD=/usr/lib/libtcmalloc_minimal.so.4 tensorboard --logdir "..."

 

或是等新版 release 或自己 build tensorflow 可能可以解決.

廣告
[TensorFlow] TensorBoard Scalar 空白

[OpenGL] ShapeNet 模型 render 問題

ShapeNetCore 是一個很大的 3D 模型 dataset。他的檔案格式是 .obj。因為研究上的需要,要把 3D 模型 render (phong shading) 成 12 個角度的圖。

我是用 OpenGL 並用 vertex shader 和 fragment shader 去繪製的,有環境光和一顆點光源。理想上應該要有這種非常光滑的圖(這是 ModelNet40 的一個飛機模型):

螢幕快照 2017-03-27 上午12.43.48.png

但 ShapeNetCore 的一台飛機畫出來卻會這樣:

螢幕快照 2017-03-27 上午12.40.46.png

 

這問題經過大量的 Google 和思考,最後確認了原因:

ShapeNetCore 的模型 obj 檔案中,同樣三個點 A B C 組成的面,正面和反面可能會重複出現。也就是會有 F1(A, B, C) 和 F2(A, C, B)。這兩個面是完全重疊的,而法向量則恰好相反。

 


TL;DR

解法:動態在 render 時刪除那些"法向量背對視角(看不到)的面"並且重新計算所有頂點法向量。


 

在 fragment shader 中,會利用該像素的表面法向量光線視角算出表面顯示的顏色。而像素的表面法向量則是在 fragment shader 中自動由附近的頂點法向量內插得到的。

但 obj 檔案並不一定會給每個頂點的頂點法向量,所以實際上,頂點法向量是在 obj 檔案載入的時候,先列出有哪些面使用該頂點,並一一用每個面的三頂點外積得到所有平面法向量,再平均起來。

當同一個頂點被正反兩個面都使用到的時候,這兩個面的法向量相加恰好等於 0,互相抵消。因此,這個面的法向量會是錯誤的。最差的情況甚至是三個面都有正反面,抵消完整個歸零,所以頂點法向量 = 0。

附上一張概念圖:

螢幕快照 2017-03-27 上午1.12.55.png

N2 是正面,N2′ 則是和 N2 疊合卻反向的面。

螢幕快照 2017-03-27 上午1.14.01.png

 

問題清楚了,接下來得想解決方法。

Google double-faced 之類的關鍵字,會找到 Back face culling 之類的。但這不是我們要的,因為我們不是要 “不顯示一個正確的面的背面" ,而是要 “不顯示一個錯誤的面 (的正面)"。

最後的方法是,在每一個角度要 render 時,都根據當前的視角,列出哪些面的法向量和視線反向(朝向遠方),刪除那些面,只留下和視角同向(朝向眼睛)的面。再用剩餘的面,執行上述計算所有頂點法向量的步驟,然後餵進 vertex shader。

 

其他軟體

其他軟體有些也有遇到一樣的問題,有些則是處理的不錯。

Blender

非常的順利。要不是想要保持 data 的一致性(因為 ModelNet40 是用我的 OpenGL 程式畫的),我就直接換成用 Blender render 了。

Meshlab

顯示錯誤(跟我的問題一樣)。

GLC Player

正常顯示。

 

[OpenGL] ShapeNet 模型 render 問題

Postfix 阻止使用者被盜用大量發送垃圾信

mail server 這幾天被計中因為 spam 封了3次,請系館網管解除,然後把發現發送垃圾信的使用者照學姊的方法封鎖,他還是繼續照發… 就來研究一下哪裡出了問題

觀察信件

找出是誰大量發垃圾信:

$ cat /var/log/mail.log | grep nrcpt

只要 nrcpt 是 1 以上,尤其是 6~10 的,如果重複一直做這件事,那就大有問題,先抓出來繼續看。

# 看 mail queue
$ mailq | grep user
# 找出他的 mail id
# 由 id 看他的信件內容 (假設已經被ban 那信件會一直擺在queue)
$ postcat -q id
# big5
$ postcat -q id | iconv -f big5

我看到的是國外徵才信….很明顯 sender 雖然是我們 lab 的帳號,但來源卻是某個奇怪的信箱,而 reply-to 也是他們的信箱。

封鎖他

建立一個檔案 /etc/postfix/sender-access ,在裡面設定要特別處理的帳號,假設我們的網域是mail.server,被盜用的使用者叫 spammer:

$ vim /etc/postfix/sender-access

# /etc/postfix/sender-access
spammer@mail.server

 

然後建立 .db 檔並重啟 postfix:

$ postmap /etc/postfix/sender-access
$ service postfix restart

設定檢查寄件者功能

這邊就是研究的重點。/etc/postfix/main.cf 裡面可以放兩個項目:smtpd_sender_restrictions 和 smtpd_recipient_restrictions。我們要在裡面檢查寄件者因此分別在兩項加入
“check_sender_access hash:/etc/postfix/sender-access"。

以下是我們目前的設定,注意兩者都有 check_sender_access。

smtpd_sender_restrictions =
 check_sender_access hash:/etc/postfix/sender-access,
 reject_non_fqdn_sender,
 reject_unknown_sender_domain,
 reject_unknown_address

# postgray: 127.0.0.1:10023
smtpd_recipient_restrictions =
 permit_mynetworks,
 permit_sasl_authenticated,
 reject_non_fqdn_recipient,
 reject_unknown_recipient_domain,
 reject_unauth_destination,
 check_policy_service inet:127.0.0.1:10023,
 check_sender_access hash:/etc/postfix/sender-access,
 check_recipient_access hash:/etc/postfix/recipient-access,
 permit

原本只有 smtpd_sender_restrictions 有 check_sender_access,卻從 /var/log/mail.log 發現被ban掉的人根本還是會繼續發送。研究了才發現,需要在 smtpd_recipients_restrictions 也設定才有用。從名字看,本來不懂,以為前者是管理 發出的信件,後者是管理 接收的信件。看了一些教學 才知道,他們是都在 smtp 轉發信件的時候觸發,只是順序不一樣,一個是在 MAIL FROM 的時候,一個是在 RCPT TO 的時候。

另外也查到一篇討論說有人建議把所有規定都設在 smtpd_recipients_restrictions,另一篇卻說這樣有點危險。好吧,目前沒辦法再更深入研究太多,總之現在的設定是可以確保垃圾信被擋住就是了。
338825 Aug 18 19:58:21 mailserver postfix/smtpd[12500]: NOQUEUE: reject: RCPT from unknown[x.x.x.x]: 554 5.7.1 <spammer@mail.server>: Recipient add ress rejected: Access denied; from=<Skyy@moninware.org> to=<spammer@mail.server> proto=ESMTP helo=<email.moninware.org>

暫時安心。

部分失效

但是用 Mac 上的 Mail 測試,還有使用 mail server 上的 roundcube webmail 試,都不會擋成功… 參考這篇,沒有非常確定。使用 gmail 寄才會真的被擋。

 

 

Postfix 阻止使用者被盜用大量發送垃圾信

編譯 TensorFlow w/ cudnn v5

目前 [2016/06/12] 用 pip 裝的 tensorflow 0.9,預設會使用 cudnn v4,我們的系統上也是裝 cuda-7.5 和 cudnn-v4。不過聽說 v5 對 convolution 效能大幅改善,想裝來用,那麼就得自己編譯 Tensorflow 才行。

環境

OS:Debian Streth 64
cuda:7.5
bazel: 3.0 (1.4 遇到奇怪的錯誤,記得更新)
gcc/g++: 5.2

步驟

首先把 cudnn-v5 載下來解壓縮放到家目錄 $HOME/cudnn5 (/include, /lib64)。

然後進到 tensorflow 目錄。若之前有編譯過,用 bazel clean 清掉。

git pull # 更新最新 0.9 版
git pull --recurse-submodules
git submodule update --recursive

如果 gcc/g++ 像我們一樣是 5.1 以上,等下編譯會遇到像這種錯誤 [1]

/usr/lib/gcc/x86_64-linux-gnu/5/include/mwaitxintrin.h(36): error: identifier "__builtin_ia32_monitorx" is undefined
/usr/lib/gcc/x86_64-linux-gnu/5/include/mwaitxintrin.h(42): error: identifier "__builtin_ia32_mwaitx" is undefined

那麼要修改一下 third_party/gpus/crosstool/CROSSTOOL 加上兩行:

 cxx_flag: "-std=c++11"
+ cxx_flag: "-D_MWAITXINTRIN_H_INCLUDED"
+ cxx_flag: "-D__STRICT_ANSI__"
 linker_flag: "-lstdc++"
 linker_flag: "-B/usr/bin/"

接著設定一下編譯環境

./configure

cudnn 版本打 5 ,路徑記得設 cudnn v5 的安裝路徑。

最後終於編譯(gpu模式):

# 編譯要 "--config=cude" 才能用 GPU。此編譯的目標是tutorials_example_trainer
bazel build -c opt --config=cuda //tensorflow/cc:tutorials_example_trainer 
# 測試
bazel-bin/tensorflow/cc/tutorials_example_trainer --use_gpu

官網只寫了以上,笨笨的直接跑完就以為裝好了,結果 PYTHONPATH 也加入 tensorflow/ 了,怎麼 import 卻總是說找不到 pywrap_tensorflow。發現原來是要另外編譯 pip package 才能做出能 import 的東西:

# 編譯 pip package 以便之後在 python import 使用
bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package

然後決定安裝路徑,例如想裝在 ~/tensorflow/built_package

TF_DIR=$HOME/tensorflow
TF_INSTALL_DIR=$HOME/tensorflow/built_package
rm -r $TF_INSTALL_DIR
mkdir $TF_INSTALL_DIR
cd $TF_INSTALL_DIR 
cp -r $TF_DIR/bazel-bin/tensorflow/tools/pip_package/build_pip_package.runfiles/org_tensorflow/* .
cp -r $TF_DIR/tensorflow/tools/pip_package/* .
  • 當然,cudnn v5 的 lib64 路徑要在設定檔 (.bashrc, .zshrc, etc.) 裡加到 LD_LIBRARY_PATH,以後程式才找得到。
  • 把 $TF_INSTALL_DIR 加到 PYTHONPATH,使 python 找得到。
  • 把 $TF_INSTALL_DIR/tensorflow/tensorboard 加進 PATH,就能使用 tensorboard。

參考:

  1.  build fail with cuda: identifier “__builtin_ia32_mwaitx" is undefined #1066
  2. tensorflow install

 

 

 

 

編譯 TensorFlow w/ cudnn v5

Paper Note: Sequence to Sequence – Video to Text

Venugopalan, Subhashini, et al. “Sequence to sequence-video to text." Proceedings of the IEEE International Conference on Computer Vision. 2015.

GOAL: To generate a caption sentence describing a video.

CNN and LSTM (long-short-term memory) networks are combined. The CNN is used to extract features for every frame. 2 LSTM are used. The 1st models the video frame sequence, and the 2nd models the output word sequence.

In the CNN part, inputs can be comprised of RGB and/or optical flow. CaffeNet and VGG-16 are used in the experiments.

 

螢幕快照 2016-06-02 下午3.18.58.png

 

They use the datasets:

  1. Microsoft Video Description corpus (MSVD)
  2. MPII Movie Description Corpus (MPII-MD)
  3. Montreal Video Annotation Dataset (M-VAD)

螢幕快照 2016-06-02 下午3.25.41.png

 

Examples:

螢幕快照 2016-06-02 下午3.28.02.png

 

Paper Note: Sequence to Sequence – Video to Text

Paper Note: Deep neural networks for acoustic modeling in speech recognition

Hinton, Geoffrey, et al. “Deep neural networks for acoustic modeling in speech recognition: The shared views of four research groups." Signal Processing Magazine, IEEE 29.6 (2012): 82-97.

DNN gets great success on speech recognition. The previous state-of-the-art acoustic modeling method is GMM-HMM, which had been already used in read world. However, GMM is not good at modeling nonlinear manifold. Replacing GMM with DNN, DNN-HMM outperforms GMM-HMM by a large margin.

 

DBN-DNN

The DNN’s input is MFCC feature, and the output is acoustic state. It is pretrained as a DBN (deep belief network), which is stacked with multiple RBMs (restricted Boltzmann machine).

RBM are first trained separately, and then stacked together, added a softmax layer on the top, becoming a pretrained DNN.

螢幕快照 2016-05-26 下午11.32.02.png

Evaluation

The experiments are based on TIMIT dataset. There are 192 test sentences.

螢幕快照 2016-05-26 下午11.34.58.png

As you can see, GMM-HMM is 25.6%, while the best DNN-based model get 20.0% on the benchmark.

Paper Note: Deep neural networks for acoustic modeling in speech recognition

Paper Note: Text Understanding from Scratch

Zhang, Xiang, and Yann LeCun. “Text understanding from scratch." arXiv preprint arXiv:1502.01710(2015).

CNN (convolutional neural network) has been widely used on image problems, but this article replicate the success of CNN on the text understanding problem. They propose a method to convert a sentence into some character-level image-like representation, feed it into a well-designed CNN, and train the model to classify the sentence.

Binary Encoding

70 characters are the alphabets: abcdefghijklmnopqrstuvwxyz0123456789-,;.!?:’’’/\|_@#$%ˆ&* ̃‘+-=<>()[]{}

Every character in a sentence is encoded to a one-of-m (m is the alphabet size, which is 70) code. Sentence length l, thus the input size m x l, a column is a char. The result is somehow like the Braille used for assisting blind reading.

螢幕快照 2016-05-19 上午11.40.19.png

 

CNN Model

螢幕快照 2016-05-19 上午11.42.33.png

The input is as described at the above. Two models (Large / Small) are proposed, both of which have 9-layers (6 conv + 3 fc).

 

Data Augmentation using Thesaurus

They do synonym replacement for words to do augmentation. This is very different to what we do on image data augmentation like flipping, cropping , random rotation.

Chinese

What’s more, the model can be used on other languages than only English. They experiment it on Chinese news data and get good results.

Evaluation

Datasets:

  1. DBpedia Ontology Classification
  2. Amazon Review Sentiment Analysis
  3. Yahoo! Answers Topic Classification
  4. AG’s news corpus
  5. Chinese news

螢幕快照 2016-05-19 上午11.55.02.png螢幕快照 2016-05-19 上午11.55.41.png

螢幕快照 2016-05-19 下午1.13.18.png螢幕快照 2016-05-19 下午1.13.50.png

螢幕快照 2016-05-19 下午1.17.12.png

Paper Note: Text Understanding from Scratch