Lambdaカクテル

京都在住Webエンジニアの日記です

Tensorflow Scalaで遊んだ記録その2(テンソルを作る)

機械学習で大儲けしたいので、Tensorflow Scalaで遊んでいる。

前回はこちら。

blog.3qe.us

Tensor Creation

公式ドキュメントの Tensor Creation をやってみる。

platanios.org

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というのがある。

www.tensorflow.org

これどう呼ぶのかな〜と思っていたけどこれは入力と同一のTensorを返すメソッドであって、単位テンソル?を返すものではない。

実際はtf.eyeを使う必要がありそう。

www.tensorflow.org

だけど今回はうまく対応するScala版のメソッドを見付けられなかった。

一旦今日はここまで。

Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?