S4TFの基本のき
この前の続き。あとあと更新する予定
Tensorの宣言
PyTorch と S4TFのTensorの宣言を比較しながら見ていきます。
- PyTorch
import torch a = torch.tensor([1, 2, 3, 4, 5]) np_a = a.numpy() # NumPy配列にする。
- Swift for TensorFlow
import TensorFlow import Python // PythonObjectを使う際は PythonLibrary.useVersion(3, 6) // これが必須みたい var a: Tensor<Float> = Tensor<Float>([1, 2, 3, 4, 5]) // var a = Tensor<Float>([1, 2, 3, 4, 5]) // こっちでもOK var np_a: PythonObject = a.makeNumpyArray() // NumPy配列にする。
Swiftは静的型付け言語なので型宣言をします。なお、var
で宣言した場合、変数、 let
は定数です。
Tensorを宣言する際、Tensor<Float>
以外にも Tensor<Double>
や Tensor<Int32>
等が可能。
自動微分
Swift for TensorFlowで自動微分を行うには以下のような手段がある。
@differentiable(wrt: x) func f(x: Float) -> Float { return x * x } let df = gradient(of: f) print(f(x: 5.0)) // 25.0 print("関数f を微分した結果: \(df(5.0))") // 10.0
さっき見たらなんか、TensorFlowの公式ページかっこよくなって、TF 2.0のチュートリアルもPyTorchのそれ見たく色々書いてあって良くなってる!
Swift for TensorFlowを触る
すっごい久しぶりのブログ更新です。最近になって、Swift for TensorFlowのmacOS向けpre-builtパッケージが一応リリース扱いになったり、Colabで利用できるようになったり、今週予定されているTensorFlow Dev Summit 2019の初日のトリにSwift for TensorFlowが予定されていたりと最近開発が活発化してきているので、自称 日本で唯一Swift4TFを最初期から追っかけてきた人間 としては嬉しい限りです。
この記事の目的は、Swift for TensorFlowを簡単に触れてみたり、自分がぶち当たった問題等をまとめておくことです。
Swift for TensorFlowとは
GoogleがSwiftの始祖 Chris Lattner氏をとっ捕まえてきてAppleの Swift言語を拡張する形でTensorFlowを統合した新しいプログラミング言語。
Swift for TensorFlow is a next-generation platform for machine learning, incorporating the latest research across: machine learning, compilers, differentiable programming, systems design, and beyond.
と宣言してるのかなり野心的なプロジェクト。
続きを読むKerasとCartPoleでDQN (Deep Q-Network)
つりながら学ぶ!深層強化学習 PyTorchによる実践プログラミング 良い
マイナビ出版からPyTorchを使って深層強化学習を作りながら学ぶという本が出てて、発売日にすぐ買って、今日もまだ読んでる途中なんだけれど、いかんせんディープラーニング関係はKerasと時々生TensorFlowぐらいしか弄ってないから、PyTorchが今ひとつ分からない。
そこで勉強ついでに、ネットの記事を調べつつ、本のソースコードを元にDQNをKerasを使って実装するってのが今日のお話。
使うライブラリ
- OpenAi Gym
- TensorFlow 1.9.0
- Keras (tf.keras)
まず前提として、DQNの実装で重要なのは以下の通り。
DQN で重要な4つのポイント
- Experience Replay
- Fixed Target Q-Network
- Reward Clipping
- Huber Loss
Huber Loss
は TensorFlowの損失関数の中に実装されているのでそれを使うことにします。
作成した時刻を取得して、圧縮したファイルのフォルダ名にするBashコード
#!/bin/bash format="%Y_%m_%d_%H_%M" cmd=`date +${format}` eval echo ${cmd} tar -zcvf file_${cmd}.tar.gz TARGET_DIRECTORY/
実行した時の時刻を yyyy/mm/dd/hh/mm で取得して、その結果を元に対象の圧縮ファイルを生成する。
Twitterの生年月日いじったらロックされた。ツライ(涙)
Bashで実数で計算する時のメモ(awkを使う)
某Qiitaで記事がない
自分も、Qiita時々参考にしたりしますよ。記事によっては、とても参考になるから。 でも、結構多くの記事がまったく参考にならない数行で終わるポエムとか多々あるんですよ。ここのブログの内容で人のこと言えるのか怪しいけど。 今回の内容がそんな例。今日は、某Qiitaの記事を真似て超短く記事を書くのがテーマ。
やりたい事
整数と実数を格納した変数を2つ用意して、結果を新たな変数に格納する。(シェルスクリプトで)
某Qii(ry では bc
を使った方法が転がってるんで、そっちに興味がある方は勝手に参考にしてもらって、コッチでは、 awk
にパイプラインで繋げて、結果を 変数 に格納する方法を取ります。(bc
コマンド は桁数設定してやらないといけないから面倒い)
例のコードでは、 半径 x = 5 、 π = 3.14 として計算するヤツ。
#/bin/bash x=5 readonly pi=3.14 ans=`echo ${x} ${pi} | awk '{print $1 ^ 2 * $2}'` echo ${ans}
Qiitaってアレ、いくら記事が💩でも、SEOに強いから検索結果の上位に来られるからホント困る。(別にQiitaを嫌ってるわけではないんです。すっごい参考になる記事はある。ただ、それに対してホント💩なページが多すぎるのが問題なだけ。)