関連記事は目次にまとめられています。はじめにTensorFlowは汎用的な機械学習フレームワークですが、特にニューラルネットワークを記述するために便利なAPIをたくさん備えています。今回はTensorFlowを使って、チュートリアルでは扱っていない構造の新しいネットワークを構築し、学習から推定までをやってみます。わかりやすいよう、解説とコードをセットで進めていきます。テーマ深度推定のネットワークをテーマとし、実装の流れがシンプルな以下を選びました。Networkhttps://arxiv.org/abs/1406.22832014年の論文で、1枚の画像からカメラと物体との距離を推定する深度推定を行うためのアーキテクチャです。古いのですが、この論文を機に深度推定は人気が出た(だと思っているのですが)ので、きっかけとして興味深い論文であると思っています。複数アクセプトされています。簡単にアーキテクチャを見てみましょう。入力は1枚の画像、出力としてピクセル単位で深度を推定した画像を出力します。ネットワークと呼び、1段ずつ学習します。ネットワークには出力のエッジを強調する狙いがあるため、後半では畳み込みのstrideを1にしてサイズを保持しています。実装TensorFlowによる実装では以下の4つのパートに分けると簡単に整理ができます。入力データとなる画像と教師画像を準備します。手頃で良いと思います。http://cs.nyu.edu/~silberman/datasets/nyu_depth_v2.htmlオリジナルのRGB画像と、深度を計測して画像にしたファイルがセットになっています。pngに変換しておきます。convert_nyu(nyu_path)準備した画像のリストをCSVファイルとして保存する処理も記述しておきました。TensorFlowには、自分でミニバッチ生成を記述しなくても良い便利な仕組みが備わっています。それでもいくつかの選択肢が残されており、その中でも便利な2つの方法があります。ファイルにデータのリストを記述しておくtfrecords形式にデータを変換しておくtfrecords形式とは、TensorFlowが公式にサポートしているデータの保存形式です。v.0.10から画像の圧縮もサポートされて便利になりました。tfrecordsにするために一手間必要なので、ここでは先程出力したCSVファイルを使ってミニバッチを作成する処理を行います。depth_pil.save(depth_name)深度の教師として無効な点も同時に計算します。結果の画像を出力するコードも書いておきます。ニューラルネットワークのアーキテクチャTensorFlowでは、最初は以下の点に注意すると良いと思います。スコープを使う再利用可能なように工夫しておくこれらを意識するだけで、アーキテクチャの構造がコードから汲み取りやすくなります。再利用可能なスコープ付きレイヤー関数を定義します。fc基本的なレイヤー(畳込みと全結合層)しか定義していませんが、今回のアーキテクチャの範囲では十分(活性化関数が固定されていることに注意してください)です。次に、アーキテクチャ全体を記述します。refineネットワークを記述しました。関数化したことによって、ネットワークの構造が見やすくなりました。誤差関数TensorFlowはバージョンを追うごとに誤差関数を実装するためのAPIも便利になっています。costloss関数はニューラルネットワークの目標との差を計算する尺度です。TensorFlowはミニバッチを前提としたloss計算に対応していますので、ミニバッチを意識せずに記述することが可能です。教師として無効な画素への対応も忘れずに行います。確率的な学習ループバックプロパゲーションによる微分の評価と勾配法のループを実行するコードを記述します。計算グラフにデータを流します。誤差関数までのコードでは、グラフを構築しているだけで計算していません。普通は別の勾配法によるデバッグが必要ですが、TensorFlowのコードを信頼して記述するとすごく短くてすみます。段階で学習することを思いだします。実現するにはいくつか方法が考えられますが、ここでは理解し易いように愚直にそれぞれの実行コードを分けます。別に、勾配の伝播を止めることでも実現可能でよりスマートに記述できると思います。スコープを使ったので、以下のように必要なパラメータを選択できます。variable...パラメータの選択を含んだコード全体は以下のようになります。sess.close()ほとんど完成ですが、coarseとrefineネットワークを順番に学習するためのパラメータロード部分の記述を加えます。Model.")...完成しました。実行コード全体はgithubから取得して動かすことが出来ます。https://github.com/MasazI/cnn_depth_tensorflow学習とその過程で推定結果を出力します。学習が進む過程で、どのように推定できるか確認してみましょう。大まかな近い、遠いがわかるようになってきました。推定はっきりとしてきました。補足githubのコードはテストケースを含んでいませんが、ほとんど学習と同様に記述可能ですし、メタデータから構築すればコード量を削減できます。画像1枚に対する推定で、画像中のコンテキストなどを利用しない場合であれば、この枠組で解ける問題も多いでしょう。一方で、今回紹介したアーキテクチャと同じ枠組みでは解けない問題も多いとともに、テーマに絞って考えてみても、複雑な状況や屋外ではうまく推定できませんから、広く実用的なものにするためには改善が必要です。TensorFlowを使うと、改善に関する本質的な部分に注力できることが多いため、実験段階で使うメリットは十分にあると考えています。組み込みやすい構造になっていますので、比較的簡単に試すことが可能だと思います。応用ができるパワフルなフレームワークです。皆さんで楽しんで使っていきましょう。2018長らくTensorFlowのバージョンが古いことが原因で、使えないと言ったISSUEをいただいたのですが、Githubのリポジトリにおいては親切に新しいTensorFlowに対応したコードをプルリクエストいただきました。ありがとうございます。