kabaohのブログ

仕事ができなすぎて辛いので、趣味に逃げるカバ野郎

あっちいったりこっちいったり

はじめに

お久しぶりです

非常によろしくない。 あっちいったり、こっちいったりしてました。

最近どうよ?

簡単なCNNなら組めるようになってきたけど だからなに?みたいな感じになっているし 学習がうまく行っているかの確認も雰囲気でやってる。

そこで、CourseraのMLコースをちゃんとやることにしました。 現在2Weekです。

コース的には、Octaveっていう言語をつかうんですが 今回が完全に初めましてなので、メモりながら進めていかないと。

ブログをめもに使うのってどうなんでしょうね。

どうなんでしょうね。

趣味

まぁ作りたいものはふんわりあるんですよね。画像認識系で。 とはいえDBさわったことないし、pythonも、「あぁ...」ってれべるなので CouseraのMLコースやって、pythonのコースやって、DBやって pythonからDB触るみたいなコースやってみようと思います これは長くなるな....

ゲームセンターCXばりに 一日で、コースを終わらせるみたいな企画やったら 「アットホームな職場で圧倒的成長!!」 ができるんじゃないかと思いました。

本職

ネットワークよくわからない コミュニケーション基盤選定むずい きびしい。

TensorFlowを使ってみる(MNIST編)

今回はつかってみます
MNISTのデータをCNN(Convolutional Neural Network)で判別させるのが目的です。 実装にはTensorFlowを使います。 と言うか、実際はほとんどTensorFlowの用意してくれたものを 使うだけです。全然役に立つエントリではない。

それではコードを書いてみます(チュートリアル通り)

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

def weight_variable(shape):
    initialize = tf.truncated_normal(shape, stddev=0.1)
    return(tf.Variable(initialize))

def bias_variable(shape):
    initialize = tf.constant(0.1, shape=shape)
    return(tf.Variable(initialize))

def conv2d(x, W):
  return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

def max_pool_2x2(x):
  return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
                        strides=[1, 2, 2, 1], padding='SAME')


if __name__ == '__main__':
    #input data
    mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
    sess = tf.InteractiveSession()
    x = tf.placeholder(tf.float32, shape=[None, 784])
    y_ = tf.placeholder(tf.float32, shape=[None, 10])

    #Layer1
    W_conv1 = weight_variable([5, 5, 1, 32])
    b_conv1 = bias_variable([32])

    x_image = tf.reshape(x, [-1,28,28,1])

    h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
    h_pool1 = max_pool_2x2(h_conv1)

    #Layer2
    W_conv2 = weight_variable([5, 5, 32, 64])
    b_conv2 = bias_variable([64])

    h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
    h_pool2 = max_pool_2x2(h_conv2)

    #Fully Connected
    W_fc1 = weight_variable([7 * 7 * 64, 1024])
    b_fc1 = bias_variable([1024])

    h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
    h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)

    #Output
    keep_prob = tf.placeholder(tf.float32)
    h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)


    W_fc2 = weight_variable([1024, 10])
    b_fc2 = bias_variable([10])

    y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)

    #evaluation
    cross_entropy = -tf.reduce_sum(y_*tf.log(y_conv))
    train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
    correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    sess.run(tf.initialize_all_variables())
    for i in range(20000):
        batch = mnist.train.next_batch(50)
        if i%100 == 0:
            train_accuracy = accuracy.eval(feed_dict={
                x:batch[0], y_: batch[1], keep_prob: 1.0})
            print("step %d, training accuracy %g"%(i, train_accuracy))
        train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})

    print("test accuracy %g"%accuracy.eval(feed_dict={
        x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))

...で? 最終結果の画像も表示してないし predictionをしてるわけでもない。 だからなに、馬鹿なの?っていわれそう。 根性叩き直します また、修行編入らないと。

雑感

ちょっと、別件で忙しくて全然さわれなかった。 これじゃ全然だめだ。 自分でフルスクラッチできない...くずすぎる。 CNNとかのモデルづくりはまあいいんだけど 読みこみとかその辺りが全然わかってない。

これはTensofFlowをわかってないの? それともPythonをわかってないの?

CNNってなんですか(2)

で、CNNってなんですか

Convolutional 層(畳み込み層)と Pooling層という2つの層があるNeural Networkのことっぽい

Convolutional層?

inputされた画像にフィルターをかけて
新たな画像を生み出すところ。

模式的に書くとこんな感じ???
注: 計算結果ではないですし、フィルタかけた後の画像はあくまでイメージで実際はこんなんじゃないです。
f:id:kabaoh:20160903013411p:plain

こういうインプット画像に対してフィルターを掛けて新たな画像をつくる。
にゃんこかわいい
f:id:kabaoh:20160903014510p:plain

そしてフィルターを何枚も用意して、たくさんイメージをつくる。
にゃんこかわいい
f:id:kabaoh:20160903014529p:plain

っていうことをやる層 (各画像の各ピクセルの値が特徴量相当??)

備忘録

input画像が32x32x3で、フィルターが5x5x3のとき  
ゼロ埋め(パディング)しないと、その後得られる画像サイズは28x28x1  
ゼロ埋めした場合32x32x1  
input画像のchannelとフィルターのchannelがあってないと計算出来ないらしい  
行列計算するときに、2x2行列と3x3行列の掛け算ができない的な理由かなーってぼんやりおもってた。  
フィルターを64枚用意したら
得られるアウトプットは32x32x64と考える(パディングあり)
(64枚で1セットって感じかな)

Pooling層?

convolutional層で得られた画像を小さくする層 これによって、例えば、手書き文字認識の時とか ちょっと位置がずれただけで、判定できませーんっていう事態を避けられるようになるらしい。

イメージ的にはピントをぼかして、なんとなーくわかるっていう状況を つくる層という感じだとおもってる。

小さくするやり方はすっごく簡単なので マックスプーリングとか平均プーリングとかでググッて。

雑感

自分の理解はこんな感じ。数式使ったりもしてみたんだけど、定性的な理解が大切と思ってる。
なんとなーく、こんな事いってるのかなって思ったんだけど
「全然違うこと言ってるわ、こいつ。ププッ」
てことだったら恥ずかしいから教えて下さい。

これで、よくある四角が並んで、細かくなっていってっていうニューラルネットワークの図は 何をいってるのかわかるんじゃないかとおもうんだけど...。

次回こそ、きちんとコード載せます。

CNNってなんですか(1)

わかったことがたくさんあって、これ以上まとめるのを放置すると
書くのを諦めてしまうので、今日は予定を変更してわかったことを書きます。

本当は「Deep Learningってなんですか」っていうタイトルで書きたいんだけど
Deep Learningって明確な定義を見つけられなかたので、やめます。
代わりにCNNってなんですかっていうのを順を追って書いていきたい。

所詮ブログなので、間違い上等。
もしも違うところがあって、詳しい人がいたら後学のために指摘してください。

では始めていきます。

CNNってなんですか

Convolutional Neural Networkの略
よく画像認識の分野で使われるNeural Networkの一種

Neural Networkってなんですか

Neural(Neuronの) Network
その名の通り人間の脳細胞の動きを模した、機械学習のしくみ
(ちゃんというと数学モデルみたいなことになるのかしら)

人間の脳細胞?

f:id:kabaoh:20160902223354p:plain



脳細胞の動き?

f:id:kabaoh:20160902223925p:plain
これがくりかえされて、腕を動かすとか
そういう脳からの命令になるとどっかで聞いた

例えば、スポーツで同じ動きを繰り返すと、動きがスムーズになる。 これは、特定のNeuron同士の結合が強まり、命令がスムーズに出せるようになるから

...らしい。

これを模すとは

f:id:kabaoh:20160902224454p:plain



さらに、特定のNeuronとの結合の強さを表現したいので f:id:kabaoh:20160902224653p:plain

「重み」をかけてやれば良い

一番単純なモデルはパーセプトロンと呼ばれるやつ。
実際これ以外のモデルがあるのかよく知らない。
(制限ボルツマンマシンとかのノードもそうなのかしら?)


ともかく
これを次々とつなげたものがNeural Network


で、これで何ができるの???

一つのNeuronだと、A or Bが判断できます。
(パーセプトロンの場合、線形分離できる場合だけだけど)
(数式書いたり、説明してもいいんだけど、数式打つの辛いので単純パーセプトロンとかでググッてください)

複数のNeuronを組み合わせることで、もっと複雑な条件下でのA or Bを判断できたり 画像認識とかができます。

なんで画像認識できるの?

注意: 以下は、自分なりの理解です。違う可能性も大いにあります。

まず、画像をinputします
そして、その画像が何を表しているか教えてやります(例:猫)
これを画像をかえて何回も繰り返しinputします。 すると猫に共通するパターン(概念?)を見つけだしてくれます。

こういう部分があれば猫なんだと、理解してくれる。
あとは、判断させたい画像を新たにinputして、その部分があるかどうかを判断させる
これで、入力画像が猫 or not を判断できる。
...みたいな話っぽい  

猫などに共通するパターンをどうやってみつけるの

画像の一部分をトリミングしたり、ぼかしり、重ねあわせたりいろんな処理をさせます。
すると、なぜか共通パターンがうまれるっぽい。
なんでそんなことになるのか、よくわかっていないらしい。

画像のどの部分をトリミングして、どれくらいぼかすか、かさねあわせるか。
いろんな処理をすると、いろんな処理の組み合わせがうまれる。 結果いろんなパターンがうまれるが 本当に猫に共通するパターンを重視して どうでもいいパターンは無視したい

これを、さっきの「重み」と「しきい値」を変えることで決定させるのが Neural Networkで決定すべきパラメータ

TensorFlowを使ってみる(導入編)

実はこのエントリーを作る前にCaffeで画像分類をしてみるという
タイトルで書くつもりだったんですが

  • OSX (10.11)
  • anaconda使用
  • OpenCV3
  • Python3

という数え役満だったのでそもそも入れられませんでした。
パソコン初心者には厳しすぎました...

TensorFlowってなに

なんかグーグルが用意したすごいやつ

インストールはどうやんの

conda create -n tensorflow python=3.5
conda install -c conda-forge tensorflow

終わり
はやすぎて鼻血が出るかとおもいました。
Caffeよ、こういうところだぞ???シェアに差がでるのは。
いや、実際でてるかどうかわかりません。
すみませんでした。

画像分類のその前に

前回までのあらすじ

人の画像の角度で分類した、類似画像検索システムを作ろうとした初心者は
知らない単語という雑魚キャラと闘いながらレベル上げを図り
何度か全滅を繰り返しながらシステム作成に向けて戦いを続けるのだった...


ほとんどプログラムしらないカバ野郎が仕事しながら 一週間でここまでできればまぁまぁじゃないっておもったけど 9割方コピペなので、頑張ってレベル上げを続けます。


今後の話

特徴点をゲットできた。次はこのデータを集めて分類するっていうことになると思う。 さてどうしたもんか、また情報集めからか...

でぃーぷらーにんぐって言う単語を良く聞くので、それを調べるところからか。 Kaggleやろうぜ!って思った時に聞いてはいた。が、中身はしらない。 なんか機械学習のすごいやつなんでしょってレベル。


レベル上げ

ディープラーニング、深層学習(英: deep learning)とは  
多層構造のニューラルネットワーク(ディープニューラルネットワーク、  
英: deep neural network)を用いた機械学習である。

ディープラーニング - Wikipediaより


あっ、はい。


ニューラルネットワーク(神経回路網、英: neural network, NN)は  
脳機能に見られるいくつかの特性を計算機上のシミュレーションによって  
表現することを目指した数学モデルである  

ニューラルネットワーク - Wikipediaより


お、おう。


ん、いや、まてよNeuralってNeuron的なってことか。
神経細胞がつながって、1つの処理を完了させるっていう
脳みその動きをそのまま持ってきたのね。
わからないなりにも幾つか気付きはあった。

そして大切なのはここ

ニューラルネットワークを多層積み重ねたモデルを機械学習させればディープラーニングであるが有名なモデルとして以下の物がある[15]  
- 畳み込みニューラルネットワーク - 画像認識などで使われる
- 再帰型ニューラルネットワーク
- 積層自己符号化器 - オートエンコーダを多層積み上げた物
- ディープビリーフネットワーク
- ディープボルツマンマシン

畳み込みニューラルネットワーク - 画像認識などで使われる
なるほど。
ざっくり調べるべき単語は見えてきた。
が、どうせ理解できないくせに他のことを調べてしまうんだろう。

ちょっとここは時間がかかりそうな予感がする。
次の更新は来週とかになっちゃうかもな。

つづく

訂正(2016/08/23)

ニューラルネットワークというか 人工ニューロンの動きについて

根本的に理解が違いましたな。 生物苦手が露呈してしまった。

ニューロンは様々な刺激(入力)が与えられて
一定値を超える強さの刺激があると
出力を返すという動きをするらしい。

村上・泉田研究室 ニューラルネットワーク

わかりやすい。
なるほど。

顔認識の話(続)

顔認識というかパーツごとに認識させてみた

OpenCV

目だけ認識させてみた

gist.github.com

Lennaさんの場合はキチンと認識できているが
三森パイセンの場合は余計なところまで認識されている。

なお、公開に耐えうる顔をしていないため公開していないが
自分の正面の顔(笑顔のおっさん)の場合も余計なところも認識しちゃっている。

dlib

一方 dlib
こちらは、目だけを抜き出すっていうのはどうしたらいいかわからなかったので とりあえず、顔の特徴全部をぬきだした。 gist.github.com

雑感

同じ画像つかってないし、同じパーツを抜き出してないしで
比較ができないことは理解してる。
趣味でやっているので特に定量的な比較はいいかな。

顔の角度をもとにした類似画像検索を最終的にさせたいという目的から考えると 特徴点をGETしてくれているdlibのほうが使いやすそうに見える

※最初はOpenCVで、両目の位置、鼻ないし口の位置を計算させて その3点のなす三角形の各角の角度で類似度を図ろうと思っていた。