20190724のTensorFlowに関する記事は3件です。

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 keras

officialの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でリアルタイムに物体検出する方法

Jetson Nanoで骨格検出「tf-pose-estimation」

Jetson Nanoで「tf-pose-estimation」をセットアップする方法

Jetson Nanoとディープラーニングを使って身体を楽器にする「Skeleton Sequencer」を作ってみた

関連記事

Jetson Nano関係のTIPSまとめ
Jetson Nano関係の情報はこちらにまとめています

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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エポックやって最後の方の出力はこんなかんじになりました。
左が入力で右が出力です。

VAE出力

Swift for TensorFlowについて

まだ触りはじめたばかりですが、Pythonのフレームワークを使う場合と比べ圧倒的に書きやすいと感じます。
PythonのほうではPyCharmで開発していますが、補完で候補が出ないことがよくあるため、ドキュメントを検索しながらコードを書くということが多いです。一方S4TFではだいたいこんな名前だろ〜というのを打ったらちゃんと候補に出てくれるので楽です(Xcode/Swiftでの開発に慣れているというのも大きいかもしれませんが)。
さらに静的型付けのおかげで引数に何を渡せばいいかも明確なので、実装して走らせて初めて間違いに気付くというようなこともないです。

S4TFの正式リリースがいつになるかはわかりませんが、現状最も期待できる候補の一つなので、今後とも注視していきたいです。


後日GANも書いてこちらは本家に入れてもらいました。
https://github.com/tensorflow/swift-models/tree/master/GAN

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Google Colabでローカルファイルを読み込む方法

Google Colabratoty

機械学習を実装するためにGoogle Colabratotyを使っています.

今回やること

完全にクラウドで実行されるColaboratoryで,ローカルpcに保存されている機械学習に用いたいデータを参照する方法を紹介します.

実装コード

新しいファイルを作成したら,はじめに次の2行を追加します.

from google.colab import files
uploaded = files.upload()

すると次のようにしてローカルファイルを選択するように指示されます.
スクリーンショット 2019-07-24 2.34.17.png

ここでは例として,機械学習に用いるためのデータファイル”2d-example.dat”を選択しています.

次のように出力されます.
スクリーンショット 2019-07-24 2.35.02.png

lsコマンドを実行すると,正常に読み込まれていることが確認できます.スクリーンショット 2019-07-24 2.35.13.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む