機械学習で大儲けしたいので、Tensorflow Scalaで遊んでいる。
前回はこちら。
Tensor Creation
公式ドキュメントの Tensor Creation をやってみる。
import org.platanios.tensorflow.api.tensors.Tensor import org.platanios.tensorflow.api.core.Shape def manyTensors: Seq[Tensor[Any]] = { val a = Tensor[Int](1, 2) // Creates a Tensor[Int] with shape [2] val b = Tensor[Long](1L, 2) // Creates a Tensor[Long] with shape [2] val c = Tensor[Float](3.0f) // Creates a Tensor[Float] with shape [1] val d = Tensor[Double](-4.0) // Creates a Tensor[Double] with shape [1] val e = Tensor.empty[Int] // Creates an empty Tensor[Int] with shape [0] val z = Tensor.zeros[Float](Shape(5, 2)) // Creates a zeros Tensor[Float] with shape [5, 2] val r = Tensor.randn(Double, Shape(10, 3)) // Creates a Tensor[Double] with shape [10, 3] and // elements drawn from the standard Normal distribution. Seq(a, b, c, d, e, z, r) } manyTensors.foreach(t => println(t.summarize()))
Tensor[Int, [2, 5]] [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] Tensor[Int, [2]] [1, 2] Tensor[Long, [2]] [1, 2] Tensor[Float, [1]] [3.0] Tensor[Double, [1]] [-4.0] Tensor[Int, [0]] [] Tensor[Float, [5, 2]] [[0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0]] Tensor[Double, [10, 3]] [[-1.704659271541884, -0.7368140789419086, -2.5774270334323988], [0.9257315413885189, 0.7833023665621829, -0.739324011543148], [-0.8234870302046149, 0.05817130171036232, -0.35570696512509636], ..., [-0.26539301490781003, 1.6292665683614356, -0.8068747650343884], [-0.3484799278328088, 0.16243631181361173, 1.1037220924897335], [-0.38437765182592104, -2.2757883751583075, -1.2440313607150602]] [success] Total time: 29 s, completed 2022/12/29 13:47:14
うまく動作した。テンソルを型付きで扱えるのは非常にイケてると感じる。
何も考えずに、テンソル同士の乗算ができるか試してみた:
val x = Tensor[Double](1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0) val xx = x * x.transpose() println(xx.summarize())
するとちゃんと計算できた。面白い。
Tensor[Double, [10]] [1.0, 4.0, 9.0, ..., 64.0, 81.0, 100.0]
勘でtranspose
とか*
とかを使ってみたけど、思っていた通りに動作した。型があるので、事前にどういう振舞いになるのか確認できるのが助かる。
Ones
便利機能として、全ての成分が 1であるようなテンソルを作るエイリアスがある。
ones
を使うことで、そうしたテンソルが得られる。
println(Tensor.ones[Int](Shape(3, 3)).summarize())
Tensor[Int, [3, 3]] [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
便利そう。たぶん単位行列ならぬ単位テンソル?も作れるのではないかと思っていじってみたけどそういうメソッドは無かった。ググってみるとtf.identity
というのがある。
これどう呼ぶのかな〜と思っていたけどこれは入力と同一のTensorを返すメソッドであって、単位テンソル?を返すものではない。
実際はtf.eye
を使う必要がありそう。
だけど今回はうまく対応するScala版のメソッドを見付けられなかった。
一旦今日はここまで。