TAG Tensorflow

人工知能を開発する

TensorFlowを用いたクロメンバーの顔認識(前編)

二番煎じ感が半端ないですが、やっちゃったものは仕方ないので書きます。機械学習やディープラーニングについては全く初心者のソフトウェアエンジニアが、畳込みニューラルネットワークを用いて「ももいろクローバーZ」のメンバーの顔識別を行うアプリを作った話です。作ったものec2上で稼働してます。ただしt2.mi…この記事の続きを読む

ニュース

Distributed TensorFlow でデータ並列を試してみる

データ並列とは 前回はDistributed TensorFlowのビルドからモデル並列までを行いましたが、今回はデータ並列による学習を試してみます。並列化にはモデル並列とデータ並列の2種類がありますが、大雑把に言うと下記のようになります。 モデル並列: データ1000個に対する巨大な演算1回を100人で分担する データ並列: 1人あたりデータ10個ずつ小分けにして100人で分担する モデル並列は当然ながらモデルに依存するので、データ並列で一度に扱うデータを減らすほうが汎用性は高いといえるでしょう。 パラメータの共有 学習におけるデータ並列化では、同じパラメータを持ったモデルのコピーを複数作り、バッチを小分けにしてそれぞれのモデルのコピーに渡し、各々に微分を計算させます。つまり同じパラメータをもったモデルをデバイスごとに持たせなければならないのですが、そのあたりの扱いが少しわかりにくいです。今回はGPUは使いませんが、複数デバイスでの計算や、パラメータの共有については、公式のHow To のGPU周りの記述 (Using GPUs,Sharing Variables) が参考になります。 tf.variable_scope()を使うと変数のスコープの定義ができます。同じスコープで同名の変数を使いたい場合はreuseフラグを立てた状態でget_variable()を呼べばよいようです。get_variable()は、reuseフラグが立っていなければ新規作成、立っていれば既存の同名の変数へのリンクを返すような動作をします。これを使えばパラメータの共有ができることになります。 グラフをあとから参照する際にはコレクションというものを使います。 クラスタ構成 Distrubuted Tensorflowのホワイトペーパでは、パラメータデバイスなるVariableを管理するサーバがパラメータの管理と更新を行って、masterが各workerに仕事を投げる、というあたりの記載があります(すみません、ちゃんと読んでません…)。そのあたりを斜め読みしつつ、masterで一括してVariableを管理することにして、小分けされたバッチをこなすのはworker二人、という構成にします。別途パラメータ用のサーバ(ps)を分けてもいいのですが、今回はm…この記事の続きを読む

ニュース

C++でTensorFlow: Opを実装する( 1 )

Opを実装してみる 今までMatMul、Sub、Div、…などいろいろなOpがあったと思いますが、ここではOp新たに定義して使ってみたいと思います。 tensorflow/core/user_ops/fact.cc tenserflow/user_ops/ackermann_op.cc というexampleがありましたが、これについてはAdding New Opを見た方が良いと思うので、これを元に進めたいと思います。 1回ですべてまとめるとかなり長くなりそうだったので、多分3回くらいに分割してやっていきたいと思います。 1回目: Op実装の仕方 2回目: Attrの追加 3回目: Opのポリモーフィズム もしかしたら2回かも 説明がわかりにくかったらごめんなさい! 1. 追加するOpのインターフェースの定義 まず初めにやることは、OpDefというものを定義して、OpRegistryというものに登録することになります。これは、以下に示したREGISTER_OPというマクロを呼んで定義することになります。 tensorflow/core/framework/op.h REGISTER_OP(“my_op_name”) .Attr(“:”) .Attr(“:=”) .Input(“:”) .Input(“:Ref()”) .Output(“:”) .Doc(R”( …この記事の続きを読む