TensorFlowをインストールしてみた

今さらですが、TensorFlowをインストールしてみました。

pipのインストール

$ sudo pacman -S pip

TensorFlow 1.5のインストール

1.9だとillegal instruction (core dumped)になってしまったので1.5を指定しました。

$ pip install tensorflow=1.5 --user

ちなみに--userはローカルインストールするためのオプションです。

次のようにして、インストールパスが確認できます。

$ pip show [パッケージ名]

動作確認

$ python
Python 3.6.4 (default, Jan  5 2018, 02:35:40) 
[GCC 7.2.1 20171224] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
2018-04-19 21:12:12.121902: I tensorflow/core/platform/cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2
>>> print(sess.run(hello))
b'Hello, TensorFlow!'

Conceptual Mathematics 10.4 Relation between fixed point and retraction theorems

Exercise 1がわからなかった。

円板Dの境界(円周)をCとする。包含写像 j: C \to Dに対して、連続写像 g: D \to D g \circ j = jを満たすとき、別の連続写像f: D -> Dに対して、 \exists x \in D . f(x) = g(x)が成り立つことを示す。

 \forall x \in D . f(x) \neq g(x)を仮定する。
円板D上に異なる2つの点f(x), g(x)をとることができる。この2点を結ぶ線分を延長し、円周Cとの交点をh(x)とする。
hは連続写像であり、jのレトラクション( h \circ j = 1_C)である。なぜなら、 x \in Cに対して g(x)=x=h(x)が成り立つからである。
jの連続なレトラクションは存在しないので、仮定 \forall x \in D . f(x) \neq g(x)は偽、すなわち、 \exists x \in D . f(x)=g(x)

リソースの解放忘れを防ぐには? Effective C++ 14項を読んで

Scott Mayers著, 小林健一郎訳, Effective C++ 第3版, 丸善出版(2014) を1日1項目読んでいます。

今日は14項を読みました。

リソース(メモリ、ファイルディスクリプタミューテックスロック、DB接続、ネットワークソケットなど)の解放忘れを防ぐにはどうしたらよいでしょうか? RAIIオブジェクトをリソースを渡すことで生成すればよい。そして、RAIIオブジェクトとしては、C++11のstd::shared_ptrを使うとよい、ということがわかりました。

どうして、リソースの解放忘れが起こるのでしょうか? それは、例えば、リソースとしてメモリを考えると、ある関数内でヒープ領域にメモリを確保すると、その関数を抜ける前に、メモリを解放する必要があります。

void f(){
    A* a = new A();
   ... // ここで、returnしたり、例外が発生したりするとdeleteが実行されない。
   delete a;
}

しかし、上のように、deleteする前にreturnしたり、例外が発生したりするとdeleteが実行されず、メモリリークになります。何らかの理由で関数を抜ける際に、必ずdeleteが実行されるような仕組みはないでしょうか? これを解決するアイディアはデストラクタです。

デストラクタは、そのオブジェクトの寿命が終わると実行されます。つまり、関数内で、あるオブジェクトをポインタなどのリソースを渡すことで生成すれば、関数を抜けるときに、オブジェクトのデストラクタが実行されるので、このデストラクタでポインタをdeleteしてもらうことができます。

このデストラクタをもつオブジェクトのことをRAIIオブジェクトといいます。既に用意されているRAIIオブジェクトとして、C++11のstd::shared_ptrがあります。また、std::shared_ptrをstaticでないメンバとしてもつオブジェクトもRAIIオブジェクトになります。なぜなら、デストラクタが呼ばれるとき、メンバのデストラクタも呼ばれるからです。

リソースがメモリのときには、リソースへのポインタをstd::shared_ptrのコンストラクタに渡します。すると、std::shared_ptrのデストラクタでこのポインタがdeleteされます。(delete[]でないことに注意)

リソースがメモリでないときには、リソースへのポインタをdeleteするとともに、何らかの解放処理(デリータ)が必要になります。リソースへのポインタを引数とする関数オブジェクト、すなわちデリータをstd::shared_ptrのコンストラクタに渡せます。

リソースがミューテックスロックの場合のサンプル

#include <memory>
#include <iostream>

class Mutex {
    public:
    void lock(){
        std::cout << "locked\n";
    }

    void unlock(){
        std::cout << "unlocked\n";
    }
};

void lock(Mutex* pm){
    pm->lock();
}

void unlock(Mutex* pm){
    pm->unlock();
}

class Lock {
    public:
    Lock(Mutex* pm)
    : mutexPtr(pm, unlock)
    {
        lock(mutexPtr.get());
    }

    ~Lock(){}

    private:
    std::shared_ptr<Mutex> mutexPtr;
};

void test(const Lock& ml){
    std::cout << "test start\n";
    {
        Lock ml2(ml);
        std::cout << "in critical session in test...\n";
    }
    std::cout << "test end\n";
}

int main(int argc, char* argv[]){
    Mutex m;
    std::cout << "start\n";
    {
        Lock ml1(&m);
        std::cout << "in critical session...\n";
        test(ml1);
    }
    std::cout << "end\n";

    return 0;
}

コンパイル

$ clang++ -std=c++11 Lock.cpp -o lock

実行

$ ./lock
start
locked
in critical session...
test start
in critical session in test...
test end
unlocked
end

Scott Mayersさんのブログhttp://scottmeyers.blogspot.jp/も読んでみようと思います。

国立近代美術館 熊谷守一展覧会

奥さんと一緒に国立近代美術館の熊谷守一没後40年の回顧展に行ってきた。
東京駅の丸善が入っているオアゾがある出口から出て、徒歩で東京メトロ大手町駅に行った。
大手町からは、東西線で竹橋まで一駅だ。
東西線に乗る前に、地下のドトールで軽く食べた。
奥さんは、レタスドッグと黒ごまのマシュマロラテを注文し、
僕は、チーズのパンとオレンジジュースを頼んだ。
奥さんは、レタスドッグのソーセージをマシュマロラテに沈没させていた。

熊谷守一は、わりと好きな画家だ。
知っていたとおり、抽象化された、動物や風景の絵が多かった。
一見すると何の絵なのかわからないほど抽象化された絵の方が、
絵本のようにわかりやすくデフォルメされたものよりも、
より高尚な感じがしてよいと思った。
例えば、熊谷がシベリアで見たという乾いたような茶色い風景の中央に
赤や緑、白といった色の布のようなものが墓標のように描かれている
絵があった。
また、地味な茶色の画面で、ピンク色の亀が水から人間のペニスのように
顔をだしている絵や、これまた、おなじみの、茶色の画面で、
カッターで短く切れ込みをズッズッズッと入れたような
一本線の小魚の小群が泳いでいた。

そんな絵をずらずらと眺めた後、MOMATコレクションを見た。
ロバート・フランクの写真「青い空」に感動した。
モノクロ写真で窓の中の花を撮ったもので、その窓に
雲が写っていた。

また、チンポムのカラスが後ろから追っかけてくる映像作品が
とても印象的だった。
www.youtube.com

2017年の振り返り

2017年は、2017が素数というだけあって、良い年になるだろうと期待していた。しかし、僕にとっては、まあまあ普通の年であった。2017年は、数学を趣味にしようということで、数学の啓蒙書や数学者の自伝、高校~大学1、2年向けの本を読んだりしていた。神保町の書泉グランデに行って、ジョン・コーツ先生の講演を聞いたり、カルチャーセンターの代数幾何学の講義を受けたりした(仕事で疲れていて最初の1回しか行けなかった)。今までは、仕事に役立てようと、休日もプログラミングの勉強をしていた。それが、プログラミングの方の興味は少し減って、数学への興味が増したという感じだ。プログラミングはC言語C++言語の知識が少し増えたけど、まだまだだ。何か、自分なりのプログラムを書きたいな、と思っている。まあ、無理せずやっていこうと思う。