Translate

2017年10月23日月曜日

Proxy環境下でHubotコンテナが起動しなくなった

前に書いた記事

HuBotを使ってRocketChat用のチャットボットを試しに作ってみる
https://fight-tsk.blogspot.jp/2017/04/hubotrocketchat.html

で書いたスクリプトがProxy環境下で動作しなくなってしまった
どうも

[GitHub] hubot-rocketchat
https://github.com/RocketChat/hubot-rocketchat

をcloneしてちくちくbuildしていくと
npmコマンドへのproxyを設定しないとビルドに失敗してしまうのだ。

Dockerfileの中でスイッチユーザしてたりして厄介だ..

..ということで、Dockerfileを自分で書いてみた。

ベースイメージはnodeの安定版がv6.11らしいので、コッチをつかってみた。


FROM node:6.11
MAINTAINER hara hara development

# change your setting or overwrite with build parameters
ARG HTTP_PROXY=http://proxy.server:8080
ARG HTTPS_PROXY=$HTTP_PROXY

USER root
RUN npm -g config set proxy $HTTP_PROXY && \
    npm -g config set https-proxy $HTTPS_PROXY && \
    npm -g config set registry http://registry.npmjs.org/ && \
    npm install -g yo generator-hubot && \
    npm install  -g hubot-rocketchat@1 && \
    useradd hubot -m
USER hubot
WORKDIR /home/hubot

# change your setting or overwrite command parameter
ENV ROCKETCHAT_URL=change_rocketchat_server:3000
ENV ROCKETCHAT_ROOM=
ENV BOT_OWNER="Change Your Name "
ENV BOT_NAME=bot
ENV BOT_DESC="change bot description"
ENV ROCKETCHAT_USER=bot
ENV ROCKETCHAT_PASSWORD=password
ENV ROCKETCHAT_AUTH=password
ENV LISTEN_ON_ALL_PUBLIC=true
ENV EXTERNAL_SCRIPTS=hubot-diagnostics,hubot-help,hubot-google-images,hubot-google-translate,hubot-pugme,hubot-maps,hubot-redis-brain,hubot-rules,hubot-shipit,hubot-jenkins-notifier,hubot-grafana
ENV TZ=Asia/Tokyo

RUN cd $HOME && \
    yo hubot --owner=$BOT_OWNER --name=$BOT_NAME --description=$BOT_DESC --adapter="rocketchat@1" && \
    node -e "console.log(JSON.stringify('$EXTERNAL_SCRIPTS'.split(',')))" > external-scripts.json && \
    npm install $(node -e "console.log('$EXTERNAL_SCRIPTS'.split(',').join(' '))")

EXPOSE 8080

CMD bin/hubot $BOT_NAME -a rocketchat



DockerfileENVARG指定を、各自の環境に合わせて変更して、

mkdir -p data && chmod a+rwx data && sudo docker build --name myhubot:latest .
sudo docker run -v data:/home/hubot/scripts -p3001:8080 mybot:latest

を実行してもいいし、

mkdir -p data && chmod a+rwx data
sudo docker build --name hara2/myhubot:latest --build-arg HTTP_PROXY=http://my,proxy:8080 --build-arg HTTPS_PROXY=http://my.proxy.8080 .
sudo docker run -e ROCKETCHAT_USER=mybot -e ROCKETCHAT_PASSWORD=mybotpass -v data:/home/hubot/scripts -p 3001:8080 hara2/myhubot:latest


と全部引数指定しても良い。

hubot-scripts.jsonexternal-scripts.jsonの扱いが今後も変わってきそうなので
このあたりまた動かかなくなるかもしれない。

けどDockerfileを見てもらったらわかると思うけど、
インストール手順に従っただけなので、
動かなくなったらちょこちょこ直して動かせるようにするにはそう難しい技術がいるわけでもない。

#ので、今後動かなくなっても、あとは各自でやってください..

2017年10月17日火曜日

TensorFlow 1.4.0 rc0 がリリースされていた

タイムラインにTensorFlow1.4.0 rc0 のリリース案内が流れてきました。
ので、何処が変わったかGitHubのREADMEを翻訳してみました。

以下、参照される場合は、at your own risk でお願いします。

-------

TensorFlow 1.4.0-rc0


リリース 1.4.0


主要な機能および改善点



  • tf.dataはコアTensorFlow APIの一部になりました
  •  APIは現在、下位互換性の保証を受けています。
  •  tf.contrib.data APIから移行する方法については、README参照のこと。
  •  主な新機能には、Dataset.from_generator() (Pythonジェネレータからの入力パイプラインを構築するため)、カスタム変換関数を適用するための Dataset.apply()メソッドがあります。
  •  tf.contrib.data.batch_and_drop_remainder()tf.contrib.data.sloppy_interleave() などいくつかのカスタム変換関数が追加されました。
  • 単純な分散Estimatorトレーニングのための train_and_evaluate を追加しました。
  • DCT-IIを計算するためのtf.spectral.dctを追加しました。
  • Mel-Frequency Cepstral Coefficientのサポートのために tf.contrib.signalを追加しました(GPUおよびグラディエントサポートあり)。
  • Windows DLLの問題のために import tensorflow 処理時セルフチェックを追加しました。
  • GPU上での tf.depth_to_space にNCHWサポートを追加しました。
  • contrib.distributions SinhArcsinh (スカラー)分布を追加しました。
  • GANEstimator オープンソースを構築しました。
  • Estimator.export_savedmodel() にすべての有効なサービスシグネチャが含まれるようになりました。
  • Estimator.export_savedmodel() には、サービング入力レシーバと利用可能なすべての ExportOutputs から構築できるすべての有効なサービングシグネチャが含まれるようになりました。 例えば、分類器は、分類フレーバな出力に加えて、回帰および予測フレーバな出力を提供することができます。これらからシグネチャを構築することで、 TF サービングはさまざまな API(ClassifyRegress、および Predict) を使用してリクエストを尊重することができます。 さらに、 serving_input_receiver_fn() は入力として機能するノードの代替サブセットを指定できるようになりました。 これは、例えば、直列化された tf.Example の代わりに生の Tensors を受け入れる分類子の予測シグネチャを生成することを可能にします。
  • tf.contrib.bayesflow.hmc を追加しました。
  • tf.contrib.distributions.MixtureSameFamily を追加しました。
  • Dataset.shuffle() は、デフォルトで各繰り返しの後に常に再シャッフルされます。
  • tf.contrib.bayesflow.metropolis_hastings を追加しました。
  • tf.contrib.distributions.Poissonlog_rate パラメータを追加しました。
  • tf.contrib.distributions.bijector API を拡張して非注入のものを処理
  • いくつかの非注入変換をハンドル
  • Java:
  •  型安全性を向上させるジェネリックス(Tensor など)(@andrewcmyers の好意より)。
  •  多次元ストリングテンソルのサポート。
  •  Linux および OS X上でカスタム操作(たとえば、tf.contribの多く)の読み込みをサポート。


バグフックスおよびその他変更



  • tf.nn.rnn_cell.DropoutWrapperは、LSTM状態を取り除くことに、今より注意が必要です。 具体的には、LSTMStateTuplec(メモリ)状態を削除することはなくなりました。 新しい動作により、LSTMとスタックされたLSTMの適切なドロップアウト動作が実現します。 このバグ修正は、公開された文献の推奨事項に従いますが、動作上の変更です。 状態のドロップアウト動作は、新しいdropout_state_filter_visitor引数を使用してカスタマイズできます。
  • tf.contrib.training.python_inputを削除しました。 新しいtf.contrib.data.Dataset.from_generatorメソッドを使用すると、より柔軟で再現性の高いパッケージで同じ動作を利用できます。
  • tf.contrib.distributions.Affineを間違ってlog-det-jacobianを修正しました。
  • tf.random_gammaが非バッチ、スカラー描画を誤って処理するのを修正しました。
  • TensorForest TreePredictionsV4Opの競合状態を解決しました。
  • Google Cloud StorageファイルシステムとHadoopファイルシステムのサポートはデフォルトビルドオプションになりました。


APIの変更点



  • tf.contrib.data.rejection_resample() 関数のシグネチャが変更されました。 これで、Dataset.apply() の引数として使用できる関数が返されます。
  • tf.contrib.data.Iterator.from_dataset() メソッドを削除します。 代わりに Dataset.make_initializable_iterator() を使用してください。
  • まれに使用され、不要な tf.contrib.data.Iterator.dispose_op() を削除します。
  • いくつかの TFGAN 損失関数を後方互換性のない方法で並べ替えます。


貢献者への謝辞


このリリースには、Googleの多くの人々からの寄付と次のものが含まれています。


  • 4d55397500, Abdullah Alrasheed, abenmao, Adam Salvail, Aditya Dhulipala, Ag Ramesh,
  • Akimasa Kimura, Alan Du, Alan Yee, Alexander, Amit Kushwaha, Amy, Andrei Costinescu,
  • Andrei Nigmatulin, Andrew Erlichson, Andrew Myers, Andrew Stepanov, Androbin, AngryPowman,
  • Anish Shah, Anton Daitche, Artsiom Chapialiou, asdf2014, Aseem Raj Baranwal, Ash Hall,
  • Bart Kiers, Batchu Venkat Vishal, ben, Ben Barsdell, Bill Piel, Carl Thomé, Catalin Voss,
  • Changming Sun, Chengzhi Chen, Chi Zeng, Chris Antaki, Chris Donahue, Chris Oelmueller,
  • Chris Tava, Clayne Robison, Codrut, Courtial Florian, Dalmo Cirne, Dan J, Darren Garvey,
  • David Kristoffersson, David Norman, David RöThlisberger, DavidNorman, Dhruv, DimanNe,
  • Dorokhov, Duncan Mac-Vicar P, EdwardDixon, EMCP, error.d, FAIJUL, Fan Xia,
  • Francois Xavier, Fred Reiss, Freedom" Koan-Sin Tan, Fritz Obermeyer, Gao, Xiang,
  • Guenther Schmuelling, Guo Yejun (郭叶军), Hans Gaiser, HectorSVC, Hyungsuk Yoon,
  • James Pruegsanusak, Jay Young, Jean Wanka, Jeff Carpenter, Jeremy Rutman, Jeroen BéDorf,
  • Jett Jones, Jimmy Jia, jinghuangintel, jinze1994, JKurland, Joel Hestness, joetoth,
  • John B Nelson, John Impallomeni, John Lawson, Jonas, Jonathan Dekhtiar, joshkyh, Jun Luan,
  • Jun Mei, Kai Sasaki, Karl Lessard, karl@kubx.ca, Kb Sriram, Kenichi Ueno, Kevin Slagle,
  • Kongsea, Lakshay Garg, lhlmgr, Lin Min, liu.guangcong, Loki Der Quaeler, Louie Helm,
  • lucasmoura, Luke Iwanski, Lyndon White, Mahmoud Abuzaina, Marcel Puyat, Mark Aaron Shirley,
  • Michele Colombo, MtDersvan, Namrata-Ibm, Nathan Luehr, Naurril, Nayana Thorat, Nicolas Lopez,
  • Niranjan Hasabnis, Nolan Liu, Nouce, Oliver Hennigh, osdamv, Patrik Erdes,
  • Patryk Chrabaszcz, Pavel Christof, Penghao Cen, postBG, Qingqing Cao, Qingying Chen, qjivy,
  • Raphael, Rasmi, raymondxyang, Renze Yu, resec, Roffel, Ruben Vereecken, Ryohei Kuroki,
  • sandipmgiri, Santiago Castro, Scott Kirkland, Sean Vig, Sebastian Raschka, Sebastian Weiss,
  • Sergey Kolesnikov, Sergii Khomenko, Shahid, Shivam Kotwalia, Stuart Berg, Sumit Gouthaman,
  • superzerg, Sven Mayer, tetris, Ti Zhou, Tiago Freitas Pereira, Tian Jin, Tomoaki Oiki,
  • Vaibhav Sood, vfdev, Vivek Rane, Vladimir Moskva, wangqr, Weber Xie, Will Frey,
  • Yan Facai (颜发才), yanivbl6, Yaroslav Bulatov, Yixing Lao, Yong Tang, youkaichao,
  • Yuan (Terry) Tang, Yue Zhang, Yuxin Wu, Ziming Dong, ZxYuan, 黄璞

問題を提起した人、解決を助けた人、、質問した人、質問に答えてくれた人に感謝しています。


ダウンロード



-----

ざっとながめると、新機能というより Contrib の組み入れが中心なかんじか。

新しいモデルなどはまだついていけてないのでよくわからないし..


ちなみにDocker Hubのほうも既に更新されていて tensorflow/tensorflow のlatestはすでに1.4.0-rc0になっていた。


追記2017/11/7

今朝TwitterタイムラインにGoogle中の人が1.4.0の紹介したい機能に関する記事をながしていたので、ここに勝手翻訳文を載せておきます。
------

TensorFlow 1.4.0 の発表

2017年11月7日火曜日
TensorFlowチームによる投稿
TensorFlowリリース1.4が公開されました - これは大きなものです!私たちは誰もが楽しむことを願って、新しくてエキサイティングな機能をいくつか紹介します。

Keras

1.4では Keras が tf.contrib.keras からコアパッケージ tf.keras に移行しました。Keras は非常に一般的な機械学習フレームワークであり、ハイレベルのAPIで構成され、アイデアと実装の間の時間を 最小限に抑えます。Keras は Estimator API を含む他のコアTensorFlow 機能とスムーズに統合します。実際には、tf.keras.estimator.model_to_estimator 関数を呼び出すことによって任意のKerasモデルから直接Estimatorを構築することができます。 Keras が TensorFlow コアに組み込まれているので、実際の業務で稼動するワークフローのために使用することができます。

Keras を始めたい方は、次のドキュメントを読んで下さい:
Estimator を始めたい方は、この記事を読んで下さい。

Datasets

私たちは、Dataset API の ( tf.contrib.data から) コアパッケージ tf.data 移行を発表できることを喜んでいます。1.4 版の Dataset API では、Python ジェネレータのサポートも追加されています。TensorFlow モデルの入力パイプラインを作成するには、 Dataset API を使用することを強く推奨します。


  • Dataset API は過去のAPIより機能的( feed_dict もしくはキューベースパイプライン)
  • Dataset API のパフォーマンスが向上
  • Dataset API がクリーンで使いやすく
今後は過去のAPIの更新ではなく、Dataset API の開発にフォーカスしていく予定です。

Dataset API を開始するには、次のドキュメントを読んでください。


Estimator による分散トレーニングおよび評価

1.4 ではユーティリティ機能 tf.estimator.train_and_evaluate が導入されており、Estimator モデルのトレーニング、評価、およびエクスポートが簡単になりました。この機能は、ローカル実行をサポートしながら、トレーニングと評価のための分散実行を可能にします。

その他の機能拡張

これまで紹介してきた機能以外にも、1.4 ではいくつかの追加機能が導入されています。詳細はリリースノートを参照してください。

TensorFlow 1.4 のインストール

pip install を使用して TensorFlow リリース 1.4 をインストールできるようになりました。
# 注意:次のコマンドは既存の TensorFlow を上書きインストールします
$ pip install --ignore-installed --upgrade tensorflow
# Python 2.7 の場合は pip
# Python 3.x の場合は pip3

tensorflow.org のドキュメントを 1.4 に更新しました。

TensorFlow のそれぞれの拡張は異なる寄稿者によってなされています。 TensorFlow の開発を手伝ってくださったみなさん、本当にありがとうございました! GitHub のソースコードを開発したり、 Stack Overflow に関する質問に答えるのを手伝ったりして、コミュニティに参加して貢献者になることを躊躇しないでください。

このリリースのすべての機能を楽しんでください。

Happy TensorFlow Coding!
-----

どうも1.4.0のポイントはEstimatorらしい。

この日本語記事を読んでも、これからモデルを作る人はこのEstimator のAPIにしたがって作ってね、ということなのだとおもうが..

サンプルが全然ない..

既存のモデルもパーセプトロンぐらいしか無い..

(この文書を書いている時点の)T2Tすら、Estimator実装してないし..

やっぱ Keras API をナカ実装に使って、外見APIはEstimator習って書けってのは
いっちょかみ機械学習開発者にはまだまだハードルが高い..

Keras ベースにJavaライブラリを標準化して、
中の人をAbstractFactoryでTensorFlowやChsainer、CNTK、Theanoにかえられるようにして、
Estimator はGenericServletみたいにJava API化して
あ、もちろんDataset API( input_fn )もいいかんじにTemplateMethodにして
くれないと日本のサラリーマンSEには厳しいのよ..

たのむ、頑張ってくれ Google Brainチーム..

2017年10月12日木曜日

コカコーラのTensorFlow活用紹介ブログ記事を翻訳してみた


これもタイムラインに流れてきたのだけど、
コカコーラ社でTensorflowを活用した事例が書かれた記事のリンク

How Machine Learning with TensorFlow Enabled Mobile Proof-Of-Purchase at Coca-Cola
https://developers.googleblog.com/2017/09/how-machine-learning-with-tensorflow.html



が私のところにながれついた。


ので翻訳してみた。
..というか、最近はほぼGoogle翻訳のままでイケてるので、ブラウザで翻訳させたほうが良いかもしれないけど..

以下の日本語訳を読む方は at your own risk でお願いします。

----------

いかにして Coca-Cola社が購入証跡を TensorFlow エンベデッドモバイルを使って機械学習させたか

木曜日、9月21日、2017



コカ・コーラ社のパトリック・ブランデ氏は、AIとTensorFlowを使って、摩擦のない購入証明をどのように利用しているのかを説明しています。
2006年にMyCokeRewards.comとして開始されたコカ・コーラのコアロイヤルティプログラム。「MCR.com」プラットフォームには、20オンスボトルで販売されるコカコーラ、スプライト、ファンタ、パワー・ド・プロダクト、および食料品店やその他の小売店で購入可能な段ボール「冷蔵庫パック」用のユニークな製品コードの作成が含まれていました。ユーザーは、MyCokeRewards.comでこれらの製品コードを入力して、プロモーションキャンペーンに参加することができます。



2016年の振り返り:コークスのロイヤルティプログラムは、プロモーションや懸賞のために数百万の製品コードが登録され、依然として非常に人気があります。しかし、モバイルブラウジングは、2006年に存在しなかったものから2016年末までに50%以上のシェアになりました。 (「MCR.com」の代わりに)「 Coke.com 」を立ち上げたのは、ブラウジング行動の変化に対する応答でした。モバイルデバイスに14文字のコードを大文字で入力すると、プログラムの成功に影響を及ぼすのに十分なユーザーエクスペリエンスが得られません。私たちはモバイルユーザーに最高の体験を提供したいと考えています。最近の人工知能の進歩は新しい機会をもたらしました。

摩擦のない証拠の探求



何年もの間、Coke は既製の光学式文字認識(OCR)ライブラリとサービスを使用しても、製品コードをほとんど読み取れませんでした。当社の印刷プロセスでは、通常、低解像度のドットマトリックスフォントを使用し、プリントヘッドの下で実行されるキャップまたは冷蔵庫の媒体を非常に高速で使用します。これはすべて、既製のOCR製品を凌駕する忠実度の低い文字列に変換されます(人間の目でも読みにくいことがあります)。OCRは、モバイルユーザーのコード入力プロセスを単純化する上で非常に重要です。コードの写真を撮って、自動的にプロモーションエントリ用に購入を登録する必要があります。私たちは、製品コードを認識するための専用のOCRシステムが必要でした。


ボトルキャップと冷蔵庫パッケージの例

私たちの研究により、有望なソリューション、Convolutional Neural Networksが実現しました。CNNは、近代的な人工知能製品の中心にある「ディープラーニング」ニューラルネットワークのファミリーの1つです。GoogleはCNNを使用してStreetView画像から住所番を抽出しています。CNNは、手書き数字の認識においても非常によく機能します。これらの数字認識ユースケースは、私たちが解決しようとしていた問題のタイプの完璧な代替となります。小さな文字セットを含むイメージから文字列を抽出し、文字の外観に大きなばらつきがあります。


TensorFlowのCNN


過去には、利用可能な訓練および推論ライブラリの複雑さのために、CNNのようなディープニューラルネットワークの開発が課題でした。2015年11月にGoogleがオープンソースとした機械学習フレームワークであるTensorFlowは、深いニューラルネットワークの開発を簡素化するように設計されています。

TensorFlowは、さまざまな種類のニューロン層と一般的な損失関数に高レベルのインターフェイスを提供します。これにより、異なるCNNモデルアーキテクチャを実装するのが容易になります。さまざまなモデルアーキテクチャを素早く反復する能力は、CokeカスタムOCRソリューションを構築するために必要な時間を劇的に短縮しました。数日間で異なるモデルを開発し、訓練し、テストすることができるからです。TensorFlowモデルも移植可能です。フレームワークは、モバイルデバイス(「エッジ上のAI」)またはクラウド内でリモートでホストされているサーバー上でモデルの実行をネイティブにサポートします。これにより、Webベースやモバイルなど、さまざまなプラットフォーム間でモデルを実行できる「一度作成、どこでも実行(create once, run anywhere)」アプローチが可能になります。


機械学習:訓練が完璧を作る(practice makes perfect)


どのニューラルネットワークも、それを訓練するために使用されたデータと同じくらい重要です。私たちは、パフォーマンス目標を達成するCNNを育成するために、大量の製品コードイメージを必要としていることを知っていました。私たちのトレーニングセットは3つのフェーズで構築されます:

  1. 事前起動シミュレーション画像
  2. 実際の画像をプレランチ
  3. でユーザによってラベル付けされた製品の画像

launch前のトレーニング段階は、プログラムされた数百万のシミュレートされた製品コード画像を生成することから始まりました。これらのシミュレートされた画像には、傾斜、照明、陰影、およびぼやけの変化が含まれていました。シミュレーションの画像のみを使用してモデルを訓練した場合、予測精度(すなわち、上位10の予測内で14文字すべてが正確に予測された頻度)は、実世界の画像に対して50%でした。これは転送学習のベースラインを提供しました。シミュレーションされた画像で最初に訓練されたモデルは、実際の画像に対して訓練されるより正確なモデルの基礎でした。

現在の課題は、実績のある目標を達成するのに十分な現実世界の画像でシミュレートされた画像を豊かにすることに変わっています。私たちは iOS と Android デバイス用の専用のトレーニングアプリを作成し、「トレーナ」がコードの写真を撮りラベルを貼ることができるようにしました。これらのラベル付けされた画像は、訓練のためにクラウドストレージに転送されます。ボトルキャップと冷蔵庫パッケージで数千の製品コードを生産し、アプリを使って最初の実世界のトレーニングセットを作成した複数のサプライヤに配布しました。

強化された豊富なトレーニングセットがあっても、さまざまな環境条件でエンドユーザーによって作成されたイメージを代替することはできません。スキャンでコードの予測が不正確になることがあるため、ユーザーがこれらの予測を迅速に修正できるユーザーエクスペリエンスを提供する必要がありました。この経験を提供するためには、2006年にオリジナルのロイヤルティ・プラットフォーム(予測コードが実際のコードであることを検証するため)の開始以来使用されてきた製品コード検証サービスと、回帰を実行する予測アルゴリズムが14文字の位置のそれぞれで文字当たりの信頼度を決定します。予測されたコードが無効である場合、各文字の最上位予測および信頼レベルがユーザインターフェースに戻されます。


エラー訂正UIにより、ユーザは無効な予測を訂正し、有用な訓練データを生成できる


このユーザインターフェイスの革新により、積極的な学習プロセスが可能になりました。フィードバックループを使用すると、補正された予測をトレーニングパイプラインに戻すことでモデルを徐々に改善することができます。このようにして、ユーザは時間の経過とともに文字認識モデルの精度を有機的に改善することができるのです。



最大限のパフォーマンスを得るための最適化


パフォーマンスに関するユーザーの期待に応えるために、製品コードOCRパイプラインのいくつかの野心的な要件を確立しました。

  • より速く:製品コードイメージがOCRパイプラインに送られた後、平均処理時間が1秒とすることが必要。
  • より正確に:私たちの目標は、積極的な学習により、起動時に95%の文字列認識の精度を達成すること。
  • より小さく:OCRパイプラインは、モバイルアプリケーションに直接配布され、時間の経過とともにモデルが改善されると、無線アップデートを収容するのに十分小さい必要がある。
  • よりおおくの製品コードデバイスをハンドルできるように:フォント・タイプ、ボトル・キャップ、厚紙のフライディ・パック・メディアなど、数多くの異なる組み合わせの製品コード・メディアを扱う必要がある。

最初に、すべての製品コードメディアに単一のCNNを使用したアーキテクチャを検討しました。このアプローチでは、モバイルアプリに配布するには大きすぎるモデルが作成され、実行時間が必要以上に長くなっていました。  Quantiphi Inc. の我々の適用されたAIパートナは、 異なるモデルアーキテクチャで反復を開始し、最終的に複数のCNNを使用したものに到達しました。



この新しいアーキテクチャは、精度を犠牲にすることなくモデルサイズを劇的に縮小しましたが、モバイルアプリケーションへの無線アップデートをサポートするために必要なものの最高水準でした。次に、接続されたニューロン間の重みの忠実度を減らすことによってモデルのサイズを縮小するために、TensorFlowの事前構築された量子化モジュールを使用しました。量子化は、モデルサイズを4倍に縮小しましたが、Quantiphiが SqueezeNet という新しいアプローチを使用して画期的な進歩を遂げたときに、モデルサイズが大幅に縮小されました。

SqueezeNet モデルは、2016年の11月にUC Berkeleyとスタンフォードの研究者チームによって発表されました。このモデルは、 Imageet などの一般的なベンチマークに対して、より大きなモデルと同等の精度レベルを達成するために、小さく複雑です。 SqueezeNet CNN を使用するために文字認識モデルを再構築した後、 Quantiphi は特定のメディアタイプのモデルサイズを100倍に減らすことができました。 SqueezeNet モデルは本質的に小さく、豊富な特徴量検出アーキテクチャを構築できました。 SqueezeNet なしで訓練された最初のバッチモデルと比較して、はるかに小さなサイズではるかに高い精度を実現しました。現在、リモートデバイスで簡単に更新できる高精度なモデルが用意されています。能動的学習前の最終モデルの認識成功率は96%に近く、これは99.7%の文字認識精度(1000文字の予測ごとにわずか3回のミス)に相当します。


さまざまなタイプのオクルージョン(隠れ領域)、翻訳、およびカメラフォーカスの問題を伴う有効な製品コード認識の例


AIとの境界を越えて


人工知能の進歩と TensorFlow の成熟により、私たちは長期にわたって求められていた購入証明機能を最終的に達成することができました。2017年2月下旬より発売されて以来、当社の製品コード認識プラットフォームは、十数以上のプロモーションを促進し、18万件以上のスキャンコードをもたらしました。現在、コカ・コーラ北米のウェブベースのプロモーションのすべてのコアコンポーネントとなっています。

AI対応の製品コード認識プラットフォームへの移行は、2つの重要な理由から価値があります。

  • モバイルファーストマーケティングプラットフォームへの全般的な移行に対応して、摩擦のない購入証明がタイムリーに使用可能になりました。
  • Coke は、既存の既製のOCRソフトウェアで動作するより忠実なフォントをサポートするために、生産ラインのプリンタを更新する必要性を避けることによって、何百万ドルも節約できました。

当社の製品コード認識プラットフォームは、コカコーラ内でスケールアップされた新しいAI対応機能の最初の実行です。現在、新製品開発から電子商取引小売の最適化まで、複数の事業部門にわたってAIアプリケーションを検討しています。

----------

上記記事を読む際の、参考リンクとしては、以下のあたり。


TensorFlowサイトを探っていた頃は "量子化" のあたりなんで突然現実的な話がでてきたんだろうか、と不思議に思っていたがおそらく米国でコカ・コーラ社との事案が実際に動いていたのだと思う。技術的にではなく、論理的に繋がった。


で、なんでこの記事を紹介したのかというと...

前の記事で紹介したkeras.js のサンプルにたしか SqueezeNet のやつあったよなあ..
じゃあそれをつなげれば、TensorFlow Mobileを使わないでAndroidのWebPanelだけで
似たようなアプリできるんじゃないのかなあ..と。


Keras.js の README.md を翻訳してみた

タイムラインに keras.js なる単語がでてきた。

..Kerasに JavaScript ライブラリがあるのか..とおもい検索すると

GitHub に以下のページが見つかった。

[GitHub] Keras.js
https://github.com/transcranial/keras-js


ということでトップページの README.md を翻訳してみた。
以下、勝手翻訳なので、参照の際は at your own risk でお願いします。

-----

Keras.js


ブラウザでGPUをサポートしているル(Tensorflowバックエンドを使って訓練済みの)Kerasモデを実行します。モデルは、対応するHDF5ファイルから直接シリアル化されたウェイトを使用して、Keras JSON形式設定ファイルから直接作成されます。nodeでも動作しますが、CPUモードでのみ動作します。

現在、このライブラリの焦点は順方向推論のみです。

テンソル操作は、ndarrayライブラリの上で拡張されます。GPUのサポートは、WebGLを介してWebGLによってサポートされています。

ライブラリバージョンの互換性:


  • Keras 2.0.4
  • TensorFlow 1.1.0


インタラクティブなデモ

  • MNISTで訓練された基礎的な埋め込みネット
  • MNISTで訓練された畳み込み変分オートエンコーダ
  • MNIST上の補助分類子生成的敵対ネットワーク(AC-GAN)
  • ImageNetで訓練された50層の残存ネットワーク
  • ImageNetで訓練された Inception v3 モデル
  • ImageNetで訓練された SqueezeNet v1.1
  • IMDBセンチメント分類の双方向LSTM

使い方


demos/src/ にある vue.js で書かれた実際のサンプルのソースコードを参照してください。


1. Model、Sequential クラスベースでともに動作します:
model = Sequential()
model.add(...)
 ...

...
model = Model(input=..., output=...)

 訓練を終えたら、ウェイトを保存し、モデルアーキテクチャの設定をエクスポートします。

model.save_weights('model.hdf5')
with open('model.json', 'w') as f:
    f.write(model.to_json())
詳細については、デモの Jupyter note (demos/notebooks/)を参照してください 。たとえば、ResNet50に必要なものは次のとおりです:

from keras.applications import resnet50
model = resnet50.ResNet50(include_top=True, weights='imagenet')
model.save_weights('resnet50.hdf5')
with open('resnet50.json', 'w') as f:
    f.write(model.to_json())

2. エンコーダスクリプトをHDF5 ウェイトファイルで実行します。

$ python encoder.py /path/to/model.hdf5

 HDF5 ウェイトファイルと同じフォルダに2つのファイル model_weights.buf model_metadata.json が作成されます。


3. Keras.jsに必要な3つのファイルは次のとおりです。

  • モデルファイル: model.json
  • ウェイトファイル: model_weights.buf 
  • ウェイトメタデータファイル: model_metadata.json

4. keras,js をインクルードします。



 もしくは node(バージョン4以降が必須):

$ npm install keras-js --save
# もしくは
$ yarn add keras-js

// 名前空間
const KerasJS = require('keras-js')
// nodeの場合は
import * as KerasJS from 'keras-js'

// 名前空間なし
const Model = require('keras-js').Model
// nodeの場合は
import { Model } from 'keras-js'

5. 新規モデルを作成します。

 インスタンス化では、XHR(同じドメインまたはCORSが必要)を使用してデータがロードされ、レイヤーは有向非循環グラフとして初期化されます。



// ブラウザ内では相対/絶対URLを指定できます
const model = new KerasJS.Model({
  filepaths: {
    model: 'url/path/to/model.json',
    weights: 'url/path/to/model_weights.buf',
    metadata: 'url/path/to/model_metadata.json'
  },
  gpu: true
})

// nodeでは gpu フラグはoffに
// パスはファイルシステムパスもしくは絶対URLを指定
// ファイルシステムパスの場合以下のように指定します
const model = new KerasJS.Model({
  filepaths: {
    model: 'path/to/model.json',
    weights: 'path/to/model_weights.buf',
    metadata: 'path/to/model_metadata.json'
  },
  filesystem: true
})


 クラスメソッドready()は、これらのステップが完了したときに解決するPromiseを返します。次に、predict()モデルを通じてデータを実行し、Promiseを返します。

model.ready()
  .then(() => {
    // 入力レイヤの名前でキー入力された入力データオブジェクト、
    // またはシーケンシャルモデルの場合は `input` です。
    // 値は平坦化された Float32Array データです
    // (入力テンソルの形状はモデルの設定で指定されています)
    const inputData = {
      'input_1': new Float32Array(data)
    }

    // 推論します
    return model.predict(inputData)
  })
  .then(outputData => {
    // outputData は出力レイヤーの名前をキーとするオブジェクトであり、
    // Sequential モデルの場合は `output` です
    // e.g.,
    // outputData['fc1000']
  })
  .catch(err => {
    // ハンドルエラー
  })


 あるいは、async/await を使用することもできます。

try {
  await model.ready()
  const inputData = {
    'input_1': new Float32Array(data)
  }
  const outputData = await model.predict(inputData)
} catch (err) {
  // ハンドルエラー
}


使用可能なLayer

  • core: Dense, Activation, Dropout, SpatialDropout1D, SpatialDropout2D, SpatialDropout3D, Flatten, Reshape, Permute, RepeatVector 
  • convolutional: Conv1D, Conv2D, SeparableConv2D, Conv2DTranspose, Conv3D, Cropping1D, Cropping2D, Cropping3D, UpSampling1D, UpSampling2D, UpSampling3D, ZeroPadding1D, ZeroPadding2D, ZeroPadding3D
  • pooling: MaxPooling1D, MaxPooling2D, MaxPooling3D, AveragePooling1D, AveragePooling2D, AveragePooling3D, GlobalMaxPooling1D, GlobalMaxPooling2D, GlobalMaxPooling3D, GlobalAveragePooling1D, GlobalAveragePooling2D, GlobalAveragePooling3D
  • recurrent: SimpleRNN, LSTM, GRU
  • embeddings: Embedding
  • merge: Add, Multiply, Average, Maximum, Concatenate, Dot
  • advanced activations: LeakyReLU, PReLU, ELU, ThresholdedReLU
  • normalization: BatchNormalization
  • noise: GaussianNoise, GaussianDropout
  • wrappers: Bidirectional, TimeDistributed
  • legacy: Merge, MaxoutDense, Highway

実装レイヤ

  • core: Lambda
  • local: LocallyConnected1D, LocallyConnected2D

注意


WebWorkersとその限界

Keras.js は、メインスレッドとは別の WebWorker で実行できます。Keras.js は多くの同期計算を実行するため、UI が推論処理の影響を受けるのを防ぐことができます。しかし、WebWorkers の最大の制限の1つは、 (の元であるWebGL) アクセスできない点です。したがって、別のスレッドで Keras.js を実行することによって得られる利点は、CPUモードでのみ実行が必要なことと相殺されます。言い換えれば、GPUモードで Keras.js をメインスレッド上でのみ実行することができます。これは永遠に続くことはありません



WebGL MAX_TEXTURE_SIZE

GPU モードでは、テンソルオブジェクトは計算に先立って WebGL テクスチャとしてエンコードされます。これらのテンソルのサイズ gl.getParameter(gl.MAX_TEXTURE_SIZE) は、ハードウェア/プラットフォームで異なります。典型的な期待値については、ここを参照してください。この値が任意の次元を超えてテンソルを含む操作の場合、その操作は CPU に戻されます。


特定のプラットフォーム(特に macOS、おそらく他のプラットフォーム)の Firefox は、依然としてテクスチャサイズの制限がハードコードされています。最新の GPU であっても、この制限は低すぎる可能性があります。これは既知の問題です。この場合、 Keras.js が CPU を使用するように正常にダウングレードされますが、計算パフォーマンスが低下します。これを回避する1つの方法は、ブラウザに移動し about:config にて gfx.work-around-driver-bugs false に変更してブラウザを再起動することです。これにより、最大テクスチャサイズが通常に戻されます。


開発/テスト

実装されたlayerごとに広範なテストが行われています。  これらすべてのテストのデータを生成する Jupyter notebooks (notebooks/) を参照してください。


$ npm install
 # または
$ yarn

すべてのテストを実行するには npm run server して http://localhost:3000/test/ を開くだけです。すべてのテストが自動的に実行されます。追加のテストデータ情報については、ブラウザの開発ツールを開きます。

開発者は次を実行してください:


$ npm run watch

src/ のファイルを編集すると webpack の dist/keras.js が更新されます。

プロダクション UMD webpack ビルドを作成するには、次のように dist/keras.js を出力します:


$ npm run build:browser

デモ用のデータファイルは demos/data/ にあります。大きなサイズのため、このフォルダは git によって無視されます。 keras-js-demos-data リポジトリをクローンし、内容を demos/data/ へコピーします。


ライセンス


MIT

---------

ブラウザの動くPCをのGPUが使えるんだ..
でも node で動かす場合はCPUのみか..

WebWorkerのマルチスレッド..そろそろJavaScript自体の実行エンジンについても本気で勉強してないかないと、ついていけなくなるよな..

Webでぐいんぐいん動くゲームアプリも出だしたからなあ、このあたりの技術がガンガン上がってるんだよなあ..

アプリケーションサーバでなくブラウザのエンジンへ開発の主流がうつっていったんだけど、Webアプリ屋がフレームワークの上で踊っている間に、じだいがかわっちゃったかな..

なんでか知らないけど、Java屋ってJavaScriptをパチもんだと勘違いして小馬鹿にしていたから、そのツケを今払わされている感じがする..

モデルファイルのエンコードツールっていうのは、圧縮とかも考えてのことなのかな..

HDF5のファイルってTensorFlow側で作れたんだっけ..
もしだめならKeras実装モデルでないと動かないのかもしれないなあ..


deeplearning.js もあるし、そろそろ考えないとなあ..









既存アプリケーションをK8s上でコンテナ化して動かす場合の設計注意事項メモ

既存アプリをK8sなどのコンテナにして動かすには、どこを注意すればいいか..ちょっと調べたときの注意事項をメモにした。   1. The Twelve Factors (日本語訳からの転記) コードベース   バージョン管理されている1つのコードベースと複数のデプロイ 依存関係 ...