しんさんのブログ

科学や技術のこと読書のことなど

論文: "Deep Clustering for Unsupervised Learning of Visual Features"

"Deep Clustering for Unsupervised Learning of Visual Features"
https://arxiv.org/abs/1807.05520

教師なし学習の話。
クラスター分類をCNNで行うのだが、k-meansでクラスタ分類した結果を使用してCNNを学習することで高い性能が出たという話。
ImageNetでもデータとしては偏っていて、数も少ない。もっとたくさんの幅広いカテゴリのデータで学習しないといけないが、そんな学習データセットはない。
ConvNetのところはAlexNetでも、VGGでもなんでもいいよ。k-meansもほかの方法でもいい。
普通に考えると、一つのクラスタに収束してしまいそうだが、そうはならないよという話は言及あり。
Fig. 1にこの論文で紹介する手法のすべてが書いてある。

論文: "A Framework for Evaluating 6-DOF Object Trackers"

[1803.10075] A Framework for Evaluating 6-DOF Object Trackers

日々論文をタイトルだけ見たり、眺めるだけだったり、流し読みしたり、熟読したりしています。
その記録を簡単に書いていきます。

今日は表題の論文についてです。

[概要]
6DOFのオブジェクトトラッキングアルゴリズム開発用のデータセットを作りましたという論文。
既存のデータセットは、シンセティックものは現実とは結構違っているし、実写のデータセットは大きなマーカーが
映っていたりする。
Kinect V2を使って、real objectからground truthを取得する一連の手法を開発した。
これを使って人間が手に持った状態でのオブジェクトのトラッキングをやってみた。

Processingで超お手軽に物体認識をやってみる

Pythonでtensorflowはたくさん記事があり、お手軽に使えますが、Processingでも推論だけでしたら非常にお手軽に試すことができます。
私の実行環境は、以下のとおりです。
Windows10 64bit
Processing 3.3.7

この記事はつぎのブログを参考にしました。
Tensorflow in Processing with the LabelImage example – Magic & Love Interactive

まずは、この記事にリンクが張ってある以下のGitHubからProcessingのコードをcloneします。
github.com

基本的にreadmeを読んでその通りにファイルを用意すればOKです。

環境構築と実行手順:
1.Tensorflow for Javaをダウンロードする
 Tensorflowのオフィシャルサイトから、Windows版のjava用のバイナリをダウンロードします。
 https://www.tensorflow.org/install/install_java#install_on_windows
 ダウンロードするファイルは、
  libtensorflow-1.8.0.jar
  tensorflow_jni.dll
 の二つです。

2. 上記二つのファイルをcodeというフォルダーを作ってそこにコピーします。
 codeというフォルダーはml20180615a.pdeがあるフォルダーに作ります。

3. 以下のサイトからInceptionのモデルと学習済みデータをダウンロードします。
 https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip
 解凍すると以下の二つのファイルが生成されます。
  tensorflow_inception_graph.pb
  imagenet_comp_graph_label_strings.txt
 それぞれ、モデル及び学習済みデータと1000クラスに分類されたオブジェクトのラベル名のリストとなります。
 これら二つのファイルは、dataフォルダーにコピーしておきます。

ちなみに、Inception-v3とはGoogleによって開発されILSVRCという大規模画像データセットを使った画像識別タスク用に1,000クラスの画像分類を行うよう学習されたモデルです。 開発当時、非常に高い精度の画像識別を達成していることで注目されました。
以上で準備ができました。

ml20180615a.pdeを起動して実行すると、data/BearBear.jpgを読み込み、"teddy bear 45.89%"と表示されます。
簡単ですね~。
あとは、ソースコードを見ていろんな改造ができそうです。

私はwebcamから入力した動画を識別するようにさせてみました。
カメラの前に座る自分の映像は、
 "BEST MATCH: barbershop (22.31% likely)"
のように、理髪店で髪を切っている状態と認識されたようです・・・。
PCやマウスなどは比較的正確に認識されました。

「人工知能と経済の未来」 井上 智洋著 を読みました

人工知能が経済にどのような影響を与えるのかをテーマにした本です。
現在のAIは囲碁や将棋で、人間に勝つまでに進歩しましたがそれはあくまで一つの或いはよく似た複数の仕事をこなす専用AIです。
2030年から40年にかけて、それが汎用AIに進化する、いやむしろ汎用AIという新しいAIが発明されるだろうと予想されています。
本当に今から10~20年で汎用AIと呼ばれるものが出現するのかどうかはわかりませんが、もし汎用AIが出現すれば、いったい何が起きるのかが考察されています。
本書は、人の生活の仕組みが劇的に変化することを革命と呼び経済の切り口でこの革命について、その本質を説明しています。
例えば、人類が始めに体験した大きな革命として、定住革命があります。
これは、狩猟採集から農業を行うようになった変化です。
食料を自ら生産しストックするようになったこのころから経済活動といったものが始まったと考えられます。
しかし、この時代には農作物の生産には土地+労働が必要とされ、より多くの生産を得るためにはより多くの耕作地を必要としました。
しかし、生産可能な土地の面積には限りがあるので成長が持続することはできず、また生産量が伸びてもそれに応じて人口が増えて、一人当たりの収穫は変化しないというマルサスの罠という現象に直面し人が豊かになることはなかったそうです。
その後、第1次産業革命により、機械化経済が始まります。
現代に生きる我々も基本的にはこのとき始まった機械化経済の枠組みの中にいます。
では機械化経済では何が起こったか? 人は豊かになったのか?
機械化経済では、生産の手段は機械+労働になり、土地が有限だったために成長が持続できなかった時とは異なり、資本を投入し生産設備(機械)を増やすことで生産量を増やすことができるようになりました。
しかし機械化経済の時代では生産力を倍にしてもOutputはせいぜい線形にしか伸びることはなく、設備を増強した分、労働力も増やさないといけないので、人はそれ程豊かになることはないそうです。(これは日々我々が実感していますよね)
General Purpose Technology(GPT)と呼ばれる新しい技術が発明されるたびに、第2次、第3次の産業革命が起きて、それは内燃機関だったりコンピュータやインターネットだったりするわけですが、そういう新しい汎用技術により数十年にわたって成長率が伸びることがあり、そのたびに人は豊かにはなりましたが、それもあくまで機械化経済の枠組みから外れることはなく、成長率はいずれ1パーセントほどの低い水準に収束することになります。
ここで著者は、汎用人工知能というGPTにより今後数十年以内に第4次の産業革命が起き、機械化経済から"純粋機械化経済"の時代に移行すると主張しています。
純粋ってどういうことだろう?と思いますが、それは生産活動に人が関与することがない、”純粋に”機械だけで生産活動ができるという意味です。
これはつまりAIによって人は仕事を奪われてしまう、別の言い方をすれば働かなくてもいい時代がくるということです。
純粋機械化経済の時代では、生産活動に人というボトルネックがありませんので、経済成長率を大きく持続的に伸ばすことができ、人類がこれまで経験したことがない豊かな時代に入ることができるとしています。
しかし、そのままでは仕事を機械に奪われてしまう労働者はこの富を得ることができなくて、資本や生産設備を持つ人のみが富を独占することになります。
どうすればこの豊かな時代に皆が幸せになれるのか、その仕組みを作るのが経済の役割ですので、著者は専門家としてどういう経済体制に移行すれば人類が体験したことのないこの大きな革命からユートピアを作ることができるかを非常に楽観的な視点から論じています。
そして、その働かなくても欲しいものが何でも手に入る豊かな時代に人はなにをすればいいのか?それは本書の最後の最後「おわりに」と題された章に凝縮されています。
著者が「おわりに」で述べているような世界が本当に来るのかどうか?それはきっとまだ誰もわからないと思いますが、その革命の基になる汎用AIをいち早く手にできるように世界中で研究開発が行われているのは確かです。
汎用AIの研究・開発に少しでも貢献したいなと考えながら本書を閉じました。

Kerasのコーディングではまったこと集

Kerasのsessionはきちんとclearさせてないとエラーがでます

Tensoflow + Keras のコードの実行で、

TypeError: 'NoneType' object is not callable

というエラーがでて原因がわからず少しはまりました。
どうやら、kerasのバックエンドのTensorFlowのsessionをclearしていないのが原因だったようです。
以下の記事を参考にしましたら、エラーが消えました。
keras+tensorflowで終了処理でエラーが発生する | CodeLab技術ブログ

ネットワークの可視化に関して

ネットワークを可視化したかったので、以下のドキュメントを参考にしました。
可視化 - Keras Documentation

from keras.utils import plot_model
plot_model(model, to_file='model.png')

たったこれだけなら簡単だと思ったのですが、必要なパッケージがインストールされていなくてそのままでは動かなかったです。

私の環境では、以下のようにすれば動作しました。

conda install graphviz
conda install pydot

さらに、以下のサイトから"Stable 2.38 Windows install packages"をダウンロードしインストールしました。
http://www.graphviz.org/download/
そして、Windows環境変数のPathに C:\Program Files (x86)\Graphviz2.38\bin を追加しました。
以上で無事、ネットワークのグラフが表示されました。

Google のTPU v3について

Google I/O 2018で発表された、機械学習を効率よく演算できる専用ASICチップのTPUについてです。
第3世代の発表が今回行われていたので、メモってみます。

彼らのアナウンスをまとめると:

TPUには4つのTPU演算ユニットが載っている。
TPU v2: 180Tera ops per second per one TPU chip which include 4 TPU units.
TPU v3は8倍?とアナウンスされているので、
TPU v3: 180 * 8 = 1.44Peta ops per second per one TPU chip which include 4 TPU units.
さらに TPU v3を束ねたサーバーは256 TPUs なので、
1.44Peta * 256TPU = 369Peta ops per second

という計算で、100Peta以上というアナウンスになっているのでしょうか。
8bit int の演算だと思っていましたが、100Peta flops と書いてあるし、floatの計算なのでしょうか。

よく読むと、Podが8倍の性能になって100kTeraFloposと書いてあり、チップの演算速度8倍になったとは言ってないですね。
逆算すると、
100Peta / 256 = 390 TeraFlops なので、チップそのものはv2 の2倍程度の速度向上のようです。

TensorflowのTutorial "Deep MNIST for Experts"を試した時のメモ

wshinya.hatenablog.com

前回は"MNIST For ML Beginners"の解説を読みプログラムを実行してみました。
今回は、以下のリンクから"Deep MNIST for Experts"の解説を読みプログラムを実行してみます。
Deep MNIST for Experts  |  TensorFlow

前回のBeginners編と今回のExperts編の一番大きな違いは、Beginners編では画像のローカル構造を無視してしまい、1次元のベクトルに展開してしまいましたが、Exprets編では2次元の画像の2次元のまま扱う手法としてCNNを用いているところです。
CNNを用いることで数字の形の特徴をとらえることができ、認識率が大きく向上することが期待されます。

  • 今回のネットワーク構成

畳み込み層
プーリング層
畳み込み層
プーリング層
全結合層
Softmax層

となっています。

2回の畳み込み層により画像のローカルな構造とよりグローバルな構造をとらえることができます。
そのあとは、多値分類問題として、全結合層+Softmax regressionという前回と同じような構造になっています。

まずはmnist_deep.py を実行してみました。
するとWARNINGがずらずらと表示されいますが、
"xxx is deprecated and will be removed in a future version."
という将来のバージョンでこのコマンドは使えなくなりますよという警告ですので、当面は無視しておいても問題なさそうです。
そして実際に学習が進み最終的には、
step 19900, training accuracy 1
test accuracy 0.9913
今度は、testデータで99%の精度を超えてきます。簡単なCNNですがかなりの精度がでますね。

1層目の畳み込み層の
W_conv1 = weight_variable([5, 5, 1, 32])
は、5x5x1(channel数、いまはgray scaleなので1)の畳み込みフィルターが32種類あるということを示しています。
2層目では、
W_conv2 = weight_variable([5, 5, 32, 64])
となっており、5x5x32のフィルターが64種類あることを意味しています。
ここでの32や64はネットワークの途中で学習して特徴量の数に対応しています。
また各層ごとに2x2でMax poolingしていますので,画像サイズは
28 x 28 -> 14 x 14 -> 7x7 と順次スケールされていきます。

2層目のmax poolingが終わった時点では7x7の画像が64枚出力されています。
これをreshapeして1次元ベクトルに変換しているのが
h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
です。fully connected layerを構成するためのweight, W_fc1とバイアスb_fc1
をこれに作用させることで、全結合層計算ができます。
最後に活性化関数としてreluを適用してのが以下の行です.
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)

このネットワークでは過学習を防止するためにdropout、つまり適当にネットワークの重みWをゼロにするという操作を行います。
keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
初めの行はdropoutの際に接続が保持される確率を格納するためのplaceholderで学習時には0.5で推論時にはdropoutしないように1.0にセットしています。
最後に10種類の数値に対応するように単層のsoftmax回帰に相当する層を追加しています。

最適化は
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
とAdamを使用しています。

GradientDescentとAdamで結果がどれくらいちがうのかちょっと実験してみました。
学習率はどちらも0.0001
ADAM:
step 100, training accuracy 0.88
test accuracy 0.9195
SGD:
step 100, training accuracy 0.26
test accuracy 0.2062
まあ、予想通りですが、SGDに比べるとADAMの方がかなり収束が早いです。