Tensorflowによる画像のクラス分類(3)ー判定編ー

 

Tensorflowによる画像のクラス分類(2)より続きます。

 

Tensorflowによる画像のクラス分類(1)ー画像収集編ー - パーソンの日記

Tensorflowによる画像のクラス分類(2)ー学習編ー - パーソンの日記

 

作成したプログラムはgithubに全て上げてあります。

github.com

 

3:判定

学習済みパラメーター、"./model4.ckpt"を読み込んで、実際の画像に対してクラス分類を行います。学習済みパラメーターの保存と読み込みには以下のリンクを参考にさせていただきました。

 

TensorFlow学習パラメータのsave, restoreでつまった - Qiita

 

作成したプログラムはeval.py です。

eval.pyの関数evaluationは画像のパスを受け取って、クラス分類の判定結果を出力します。

次に、app.py、upload.htmlを作成しました。

上の関数をapp.pyから呼び出します。flaskを利用しました。flaskはWebを手軽に構築できるフレームワークです。このflaskコードがWeb上のインターフェースを 形成します。flasコードで、ディレクトリtemplates内にあるupload.htmlを呼び出します。この部分はかなり駆け足での実装となってしまいました。flask、勉強します。以下のリンクを参考にしました。

 

Flask - ファイルのアップロード

 

Web上ではこんな感じに表示されます。シンプルです。ここで画像をアップロードしてもらうことで、画像にlatteが写っているかいないか判定します。latteが写っていたら、latte、そうでなかったら、otherと出力されます。Flaskかなり便利です。

 

f:id:wada0421514:20171124220133p:plain

 

 

以上、Tensorflowによる画像のクラス分類でした。latte君が画像に写っているかどうか判定しました。最終的な判定精度ですが、7割前後です。latteの画像に特別な変換を施していない。otherは完全にランダムな画像を用いているので、特徴量が捉えられない。などの理由が考えられます。画像の収集を工夫すれば、おそらくもっと精度が出るはずですが、今回の目的は、実際に自分でコードを書いて、ニューラルネットワークを体験することだったので、良しとします。時間があれば、精度向上に取り組みたいと思います。

 

次は、Pythonの復習をした後、Chainerに挑戦します。RNNを実装してみたいです。

 

アドバイス、改善点があったらお願いします。

Tensorflowによる画像のクラス分類(2)ー学習編ー

 Tensorflowによる画像のクラス分類(1)より続きます。

Tensorflowによる画像のクラス分類(1)ー画像収集編ー - パーソンの日記

 

作成したプログラムは全て、githubに上げてあります。

github.com

 

後日、Chainerで同じことをしました。リンクを貼っておきます。

person.hatenablog.jp

 

2:学習

 

tensorflowを用いて、パラメーターの学習を行います。tensorflowのチュートリアルを参考にしました。最終的なパラメーターを"./model4/ckpt"に保存します。参考にしたリンクを貼っておきます。

プログラムは、new_20171111_keep_20171122.py です。

 

Deep MNIST for Experts  |  TensorFlow

 

Tensorflowはsessionの概念が特徴的です。個人的に、使いにくく感じました。慣れるとそこまで、気にならなくなるので、大丈夫です。

 Tensorflowの醍醐味の一つである、Tensorboardですが、今回はネットワークがそこまで複雑でない事から、必要性を感じなかったので、今回は割愛しました。
 
Tensorflowによる画像のクラス分類(3)ー判定編ーに続きます。

Tensorflowによる画像のクラス分類(1)ー画像収集編ー

 tensorflowを用いて、我が家の愛犬latte君が画像に写っているかどうか判定するアプリをWeb上で実装することを目的とします。

 

作成したプログラムはgithubに全て上げてあります。

github.com

 

後日、Chainerで同じことをしました。リンクを貼っておきます。

person.hatenablog.jp

 

latte君の画像と、その他の適当な画像を用いて、2クラス分類で、latteが画像に写っているかどうか判定します。以下の3ステップでまとめます。

 

1:画像収集

 2:学習

 3:判定

 

 

1:画像収集

 

latte君の画像(latte)を901枚と、その他の適当な画像(other)を1101枚用意します。

ディレクトリはdateの中にother,latteで、data_keepの中にother,latteです。dataの中には(28,28)の画像を入れて、data_keepの中には収集した生の画像を入れます。

 

data_keep/otherはこんな感じです。ネット上で使いやすい画像クローラーを見つけたので、それを使わせていただきました。

 

多くの画像ファイルを集めるためのツール置き場、です。

 

f:id:wada0421514:20171124221047p:plain

 

集めたdata_keepの画像を以下のコード(1)を利用して、全て、jpgに変換します。 

 コード(1): png_2_jpg.py

 

data_keepの画像を以下のコード(2)を利用して、全て(28,28)にリサイズして、dataに保存します。

  コード(2):keep_2_gakushu.py

 

data内の(28,28)の画像を以下のコード(3)を利用して、配列に直して、保存します。

 コード(3):jpg_2_tensor.py

 

画像処理には、以下のリンクを参考にさせていただきました。

 

Pythonで画像処理 | Nana-Korobi 

初めてのPython画像処理 - Qiita

 

以下のコード(4)を利用して、latte_r,other_rに保存された配列をテストデータ、学習データに振り分けます。 同時に、それぞれのラベルも生成します。

 コード(4):tensor_2_all.py

 

これで、画像収集、学習の準備は完了です。次は、待ちに待った学習を実装します。

 

Tensorflowによる画像のクラス分類(2)ー学習編ーに続きます。

 

Tensorflowによる画像のクラス分類(2)ー学習編ー - パーソンの日記

Tensorflowによる画像のクラス分類(3)ー判定編ー - パーソンの日記

人工知能についての現在理解していることをまとめてみます

 

 

私見ですが、だんだん人工知能についてわかってきたので、備忘録的に。

 

 

(1-1)人工知能とは

 

人工知能(AI):

 

[1]人によって解釈が異なるが、読んで字のごとく、人工的に人間のよう                                  な汎用的な知能をコンピュータ上に実現させたもののこと。

[2]部分的に知能的な活動を行っているものを、商業的に呼ぶ。

 

人工知能はインプットによってアウトプットを決定するエージェントという説明もできます。

人工知能は文脈、使っている人によって、様々な意味を持ちます。

 

(1-2)人工知能のレベル付け

 

人工知能はその複雑さ、仕組み、可能なこと、で四段階にレベル付けできます。

 

レベル1:単純なIF分岐。探索、推論を行うもの。ハノイの塔、迷路を解くことができる。現在は、機械学習を組み込まれているので、分類に迷うが、オセロ、将棋をする人工知能もここに分類される。パズルなどのトイプロブレムと呼ばれるものしか解けない。現実世界で起こり得る問題は解けない。学習しない。

 

レベル2:たくさんの知識を組み込んだレベル1。分岐パターンが多い。ワトソンの原型はここに分類される。医学、薬学、の知識などを大量に読み込むことで、現在の症状から、病名を判定したりする。エキスパートシステムと呼ばれる。現実世界の問題は、この例のように限定的になら解ける。学習しない。

 

レベル3:機械学習を行う。文書の内容を読み込んで、クラス分類ができる。ただし、特徴量を人間側で設定する必要がある。学習を行えるため、解決できる問題は増えたが、特徴量は人間で設定する必要があるため、かなり手間がかかる。

 

レベル4:ディープラーニングと呼ばれる。特徴量を人間が設定する必要がない。汎用性が上がる。画像認識、クラス分類、自然言語処理、音声処理、など、様々な分野で、活躍している。また、活躍する見込みがある。ただし、学習するのに時間がかかる。処理量が多いため。

 

 

(2)機械学習について

 

機械学習とは、人工知能が、クラス分類を自力で行うことです。人間がIF文などをプログラミングする必要がありません。様々な手法があります。ニューラルネットワークディープラーニングサポートベクターマシン、最近傍法などです。

 

(3)ディープラーニングについて

 

ディープラーニングとは、層を深くしたニューラルネットワークのことです。パワーアップしたニューラルネットワークと説明できます。その他の機械学習とは一線を画します。ディープラーニングは特徴量を設定する必要がありません。特徴量とは、簡単に言えば、データを数学的に扱えるようにするための関数と言えます。これは、人間が設定しますので、前述した通り手間がかかりますが、ディープラーニングはその手間がありません。つまり、より多くの問題に対応できます。またその可能性があります。

 

時間がなかったため、かなり雑になってしまいました。今度もっとわかりやすく丁寧にまとめなおしたいと思います。改善点、アドバイスがあったらお願いします。

「ゼロから作るDeep Learning Pythonで学ぶディープラーニングの理論と実装」を読みました

 

 

「ゼロから作るDeep Learning Pythonで学ぶディープラーニングの理論と実装」の内容の要約と感想を書きます。

 

www.oreilly.co.jp

 

読み終わったのは、1か月くらい前なのですが、当時、Pythonの知識は多少はあるものの、人工知能全般の知識ゼロでの挑戦でしたが、非常に読みやすかったです。内容について説明します。

 

まえがき:

対象となる読者や本のコンセプトなどです。内容に入る前にこういった情報を先に明示してくれると読みやすくなるので良かったです。

 

1章 Python入門:

Pythonのインストール、anaconda、Pythonの基本文法、Numpy、Matplotlibなどについての説明です。説明は軽くです。Python未経験者でも、この本に取り組めるようにするための説明です。一通り知っているので、軽く読んで、触ったこと無かった、matplotlibだけ、色々試しました。

 

2章 パーセプトロン

パーセプトロンについての説明。重みをかけます、バイアス足します、って感じです。多層パーセプトロンでXORゲート実装しました。少しコードがでてきます。

 

3章 ニューラルネットワーク

ニューラルネットワークの説明。パーセプトロンニューラルネットワークの違いは活性化関数です。ステップ関数に対して、シグモイド関数などを使います。そうすれば、学習できます。最後、Pythonで畳み込みではないニューラルネットワークを実装して、学習済みデータもらって、MNIST試して、終わりです。

 

4章 ニューラルネットワークの学習:

学習方法の説明です。損失関数を減らしたいです。微分をします。多変数関数なので、勾配です。最後はコードを書いて、ニューラルネットワークの学習を実装します。

 

5章 誤差逆伝播法:

誤差逆伝播法の説明です。勾配を使って、損失関数を減らすのが目的です。4章よりもっと速くできる方法があります。誤差逆伝播法の出番です。計算ノードを使って説明します。結局、合成関数の微分をします。チェインルールです。コード書いてこれを実装しました。

 

6章 学習に関するテクニック:

テクニックについての説明です。確率的勾配効果法、シンプルでいいのですが、遠回りです。AdaGradが便利です。重みの初期値もいろんな決め方があります。学習にかなり関わってきます。過学習避けるためにDropoutをします。

 

7章 畳み込みニューラルネットワーク

畳み込みとプーリングの説明です。ただのニューラルネットワークだと限界があります。空間的情報も使っていきたいです。畳み込みとプーリングです。畳み込みフィルターはただのニューラルネットワークの重みに対応します。プーリングはデータの圧縮です。ロバストになります。最後、畳み込みニューラルネットワークを実装します。ただのニューラルネットワークより精度が上がります。

 

8章 ディープラーニング

世界中で使われているディープラーニングの手法や実用例についてです。実装は7章までです。この章ではコードは書きません。グーグルはこんなモデルを使っていますなど書いてあります。ディープラーニングを利用することで、画像の自動生成や自動運転などが可能になります。面白いです。

 

全体的なぼくの感想:

先にも書きましたが、非常に読みやすいです。人工知能ニューラルネットワークの知識ゼロでも理解できました。ニューラルネットワークに興味を持ちました。各章で、やったことが最後にまとめられている点も良かったです。ニューラルネットワーク入門として最高の一冊でした。

 

改善点、アドバイスがあったらお願いします。

 

2017年学部1年、夏休みの振り返り Python,CNN,Tensorflow

2017年学部1年の夏休みを振り返ります。

 

夏休みの前半でPythonの基礎を一通り学びました。「実践力を身につけるPythonの教科書」を使いました。

book.mynavi.jp

 Pythonの参考書は種類が非常に多いため、かなり迷いましたが、読みやすそうだったのでこちらの本にしました。実際読みやすかったです。前半のPythonの基礎的な文法に対する説明は初心者にもわかりやすくて良かったのですが、後半のWeb系の技術に関する説明は、正直、おまじないの写経に終始していた気がします。繰り返し読んで、辞書型やリスト型、など、大体理解したと思います。

 

夏休みの中盤では「ゼロから作るDeep Learning――Pythonで学ぶディープラーニングの理論と実装」を読みました。

www.oreilly.co.jp

 

非常にわかりやすく読みやすい本でした。ニューラルネットワーク入門にぴったりの本であると、初心者ながら感銘を受けました。値段が少し気になりますが。

この本のおかげで、ニューラルネットワーク、CNN、ディープラーニングに興味を持ちました。この本は、復習もしたいので、別記事で具体的にまとめまようと思います。

 

夏休みの後半で、tensorflowを始めました。最初は苦戦しましたが、やっていくうちに徐々に理解しました。セッションの概念など、目新しいものが多かったです。Tensorboardがいまいち使いこなせていないので頑張りたいです。

 

現在は、Qiitaで見つけた記事などを参考にしながら、CNNによるオリジナル画像データセットのクラス分類に挑戦中です。実際にやってみるとCNNそのものより、APIによる画像の収集や、画像の取り扱い、Webアプリ作成に苦戦しています。っていうか全然できないです。勉強します。

 

改善点、アドバイスがあったらお願いします。