- 投稿日:2019-07-24T23:12:02+09:00
Jetson Nanoでディープラーニング
Jetson Nanoでディープラーニング
Jetson Nano TIPSまとめのページが大きくなってきたので、ディープラーニング関連の項目を切り出してまとめました。
TensorFlowのセットアップ方法
公式の方法は以下です。
Jetson NanoへのTensorFlowセットアップ方法(公式)ただし、少し煩雑なのと現時点(2019/05/12)でいくつか問題点があるため、問題点を回避しつつ自動でセットアップするスクリプトを作成しました。以下コマンドで(比較的)楽々セットアップできます。
$ git clone https://github.com/karaage0703/jetson-nano-tools $ cd jetson-nano-tools $ ./install-tensorflow.shその他、TensorFlow関係のセットアップでハマりやすいことを記載しておきます。
pip3 install -U pip してしまうとその後「cannot import name ‘main’ 」というエラーが出る
pip3 install -U pipを実行してはいけないようです。もし、誤って実行してしまった場合は、以下コマンドでリカバーできます。$ sudo python3 -m pip uninstall pip && sudo apt install python3-pip --reinstall詳しくは、このサイトなど参照下さい。
公式の方法でTensorFlowをインストールできない
以下でバージョン固定してTensorFlowをインストールして下さい。
$ pip3 install --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v42 tensorflow-gpu==1.13.1+nv19.4 --user詳細は、以下のリンク先を参照下さい。
Official TensorFlow for Jetson Nano !!!
404 Client Error:でインストールできない
pip3に
--no-cache-dirをつけた以下コマンドでTensorFlowをインストールできました。$ pip3 install --no-cache-dir --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v42 tensorflow-gpu==1.13.1+nv19.4 --user以下のコミュニティーサイトの情報を参考にしました。
Unable to install TensorFlow on Jetson Nano because of "404" on NVidia server!
Kerasのセットアップ方法
TensorFlowのラッパープログラムKerasの使い方です。元々は単独のプログラムだったのですが、途中からTensorFlowに取り込まれたため、TensorFlow内蔵のKerasと単体のKerasがあります。それぞれ説明します。
TensorFlow内蔵のKerasを使用する方法
Jetson Nanoで使う最新のTensorFlowにはKerasが内蔵されているので、TensorFlow内蔵のKerasを使うのがオススメです。import文を書き換えるだけで基本的にそのまま動きます。
具体的には、例えば以下のようなimport文であれば
from keras.preprocessing.image import array_to_img, img_to_array, load_img from keras.models import model_from_json以下のように変更します。
from tensorflow.keras.preprocessing.image import array_to_img, img_to_array, load_img from tensorflow.keras.models import model_from_json単体のKerasをインストールする方法
単体のKerasは以下のコマンドを実行してインストールできます(TensorFlowはインストール済みの前提です)。単体のKerasを前提にしたプログラムを動かすときは、Kerasを入れた方が手っ取り早いと思います。
$ sudo apt install libatlas-base-dev gfortran $ pip3 install -U cython $ pip3 install kerasofficialのKeras拡張
keras-contribをインストールする場合は、追加で以下も実行下さい。$ pip3 install git+https://www.github.com/keras-team/keras-contrib.git以下のページを参考にしました。
【Jetson_nano】インストールからTensorflow,Chainer,そしてKeras環境構築出来たよ♬
PyTorchのインストール方法
TensorFlowを入れた後に以下コマンドを実行しましょう。
$ wget https://nvidia.box.com/shared/static/veo87trfaawj5pfwuqvhl6mzc5b55fbj.whl -O torch-1.1.0a0+b457266-cp36-cp36m-linux_aarch64.whl $ pip3 install numpy torch-1.1.0a0+b457266-cp36-cp36m-linux_aarch64.whl公式情報ままです。最新のバージョンや動作確認に関しては、公式情報参照下さい。
Jetson Nanoでディープラーニングを使った応用例
StayleGANを動かす
以下記事参照下さい。
Jetson Nano上でStyleGANを使って無限に人物画像生成するデモを行う方法
Jetson Nanoでリアルタイムに物体検出する
以下記事参照下さい。
Jetson Nanoで骨格検出「tf-pose-estimation」
Jetson Nanoで「tf-pose-estimation」をセットアップする方法
Jetson Nanoとディープラーニングを使って身体を楽器にする「Skeleton Sequencer」を作ってみた
関連記事
Jetson Nano関係のTIPSまとめ
Jetson Nano関係の情報はこちらにまとめています
- 投稿日:2019-07-24T10:00:59+09:00
Swift for TensorFlowでVAE
オフィシャルのswift-modelsリポジトリにautoencoderのサンプルが掲載されています。
https://github.com/tensorflow/swift-models/blob/2fa11ba1d28ef09454af9da77e22b585cf3e5b7b/Autoencoder/main.swiftですがVAEのサンプルはなかったので上コードを改造して実装してみました。
以下S4TF及びVAEの基本的なことは知っているものとして書きます。
またコードの一部はkerasの実装を参考にしました。
https://keras.io/examples/variational_autoencoder/完成したコードはこちらです。v0.4.0-rc2にて動作確認しています。
https://gist.github.com/t-ae/3cd33e4f0535b98c2df9bfeef49645e5モデル定義
struct Encoder: Layer { typealias Input = Tensor<Float> typealias Output = Encoded var encoder1 = Dense<Float>(inputSize: imageHeight * imageWidth, outputSize: 128, activation: relu) var encoder2 = Dense<Float>(inputSize: 128, outputSize: 64, activation: relu) var encoder3 = Dense<Float>(inputSize: 64, outputSize: 12, activation: relu) var encoderMean = Dense<Float>(inputSize: 12, outputSize: 4, activation: identity) var encoderLogVar = Dense<Float>(inputSize: 12, outputSize: 4, activation: identity) @differentiable func callAsFunction(_ input: Input) -> Output { let intermediate = input.sequenced(through: encoder1, encoder2, encoder3) let mean = encoderMean(intermediate) let logVar = encoderLogVar(intermediate) return Encoded(mean: mean, logVar: logVar) } } struct Encoded: Differentiable { var mean: Tensor<Float> var logVar: Tensor<Float> } struct Decoder: Layer { typealias Input = Tensor<Float> typealias Output = Tensor<Float> var decoder1 = Dense<Float>(inputSize: 4, outputSize: 12, activation: relu) var decoder2 = Dense<Float>(inputSize: 12, outputSize: 64, activation: relu) var decoder3 = Dense<Float>(inputSize: 64, outputSize: 128, activation: relu) var decoder4 = Dense<Float>(inputSize: 128, outputSize: imageHeight * imageWidth, activation: tanh) @differentiable func callAsFunction(_ input: Input) -> Output { return input.sequenced(through: decoder1, decoder2, decoder3, decoder4) } } struct VAE: Layer { typealias Input = Tensor<Float> typealias Output = VAEResult var encoder = Encoder() var decoder = Decoder() @differentiable func callAsFunction(_ input: Input) -> Output { let encoded = encoder(input) let mean = encoded.mean let logVar = encoded.logVar let gaussian = Tensor<Float>(randomNormal: mean.shape) let std = exp(logVar/2) let images = decoder(gaussian * std + mean) return VAEResult(image: images, mean: mean, logVar: logVar) } } struct VAEResult: Differentiable { var image: Tensor<Float> var mean: Tensor<Float> var logVar: Tensor<Float> }もともとあった
Autoencoderの代わりにVAEを定義しています。
Autoencoderではエンコーダとデコーダが結合した形でしたが、ここでは分割し、それをVAEにて統合しています。これはPythonのフレームワークを使うときにも言えますが、分割しておくとエンコーダ/デコーダ単体で使いたいときに便利です。VAEはサンプリングと損失の計算にエンコーダーから得られるmean, logVarを使うため、
Encoderはこの2つを出力する必要があります。named tupleで出したいところですが@differentiableな関数の入出力はDifferentiableである必要があるため、ここではEncodedを定義しています。VAEResultについても同様です。画像が[0, 1]範囲なのに
Decoderの出力がtanhになっていますが、これは元のコードでもそうなっており、v0.4.0-rc2の時点ではsigmoidの勾配の実装にバグがあって正しく学習できないのでそのままにしているだけです。
https://github.com/tensorflow/swift-models/issues/179損失関数
@differentiable func loss(result: VAEResult, original: Tensor<Float>) -> Tensor<Float> { let reconstrcutionLoss = (result.image - original).squared().sum(alongAxes: 1) let klLoss = (1 + result.logVar - result.mean.squared() - exp(result.logVar)) .sum(alongAxes: 1) * -0.5 return (reconstrcutionLoss + klLoss).mean() }損失関数の実装は
VAEResultと元画像のTensor<Float>を取ります。
var klLoss = (1 + result.logVar - result.mean.squared() - exp(result.logVar)); klLoss = klLoss.sum(alongAxes: 1); klLoss *= -0.5のようにvarに操作を加えていく書き方は@differentiableではできないようなので一文で書いています。毎回新しい変数を定義していけば分割はできますが……
(追記:0.4.0-rc4ではvarの操作できました。)学習部分
let ?model = vae.gradient { vae -> Tensor<Float> in let result = vae(x) return loss(result: result, original: x) } optimizer.update(&vae.allDifferentiableVariables, along: ?model)損失関数は定義できているのであとは置きかえるだけです。
結果
50エポックやって最後の方の出力はこんなかんじになりました。
左が入力で右が出力です。Swift for TensorFlowについて
まだ触りはじめたばかりですが、Pythonのフレームワークを使う場合と比べ圧倒的に書きやすいと感じます。
PythonのほうではPyCharmで開発していますが、補完で候補が出ないことがよくあるため、ドキュメントを検索しながらコードを書くということが多いです。一方S4TFではだいたいこんな名前だろ〜というのを打ったらちゃんと候補に出てくれるので楽です(Xcode/Swiftでの開発に慣れているというのも大きいかもしれませんが)。
さらに静的型付けのおかげで引数に何を渡せばいいかも明確なので、実装して走らせて初めて間違いに気付くというようなこともないです。S4TFの正式リリースがいつになるかはわかりませんが、現状最も期待できる候補の一つなので、今後とも注視していきたいです。
後日GANも書いてこちらは本家に入れてもらいました。
https://github.com/tensorflow/swift-models/tree/master/GAN
- 投稿日:2019-07-24T02:38:36+09:00
Google Colabでローカルファイルを読み込む方法
Google Colabratoty
機械学習を実装するためにGoogle Colabratotyを使っています.
今回やること
完全にクラウドで実行されるColaboratoryで,ローカルpcに保存されている機械学習に用いたいデータを参照する方法を紹介します.
実装コード
新しいファイルを作成したら,はじめに次の2行を追加します.
from google.colab import files uploaded = files.upload()すると次のようにしてローカルファイルを選択するように指示されます.
ここでは例として,機械学習に用いるためのデータファイル”2d-example.dat”を選択しています.



