Top View


Author Yasuaki Hamano

[論文読み] NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis

2020/03/29

...

何箇所か、 ... という書き方が出てきます。

import numpy as np
x = np.arange(8).reshape((2, 2, 2))
x.shape #=> (2, 2, 2)
x #=> array([
  #     [[0, 1],[2, 3]],
  #     [[4, 5],[6, 7]],
  #   ])
x[..., 1] #=> 
  # array([
  #  [1, 3],[5, 7]
  # ])
x[:, :, 1] #=> 
    # array([
    #  [1, 3],[5, 7]
    # ])

こちら、読み方は、Elipsisというものらしいです。x[..., 1] の意味は、x[:, :, 1] だそうです。: をたくさん書かなくて良いから便利!

ちなみに、 x[...,1,...] みたいな書き方はできません。次元が決まらないからでしょう。2x2x2 行列の場合、上記の書き方でも行けそうな気がしたのですが。。。

スライスの中のnp.newaxis や None

配列に次元を追加する書き方みたいです。論文中に、dirs[..., np.newaxis, :] みたいな書き方や rays_d[...,None,:] みたいな書き方が出てきます。

これらは同じ意味で、

import numpy as np
x = np.arange(8).reshape((2, 2, 2))
x[..., np.newaxis, :]
#=> array([
# [
#   [[0, 1]],
#   [[2, 3]]
# ],
# [
#   [[4, 5]],
#   [[6, 7]]]
# ])
x[..., np.newaxis, :].shape
#=> (2, 2, 1, 2)
x[..., None, :].shape
#=> (2, 2, 1, 2)

という感じらしいです。 reshapeでも同じことができますが、こちらのほうが直感的に書ける場合もあるなと感じました。

tf.meshgrid

中身が同じ行列を作成する方法みたいです。numpy にも同じメソッドがあるらしく、グラフの描画などに便利だそうです。知らなかった。。。

これ、説明が難しいので、以下の例を御覧くださいませ。

import numpy as np
import tensorflow as tf

a = np.arange(9).reshape((-3, 3))
b = np.arange(6).reshape((-3, 2)) + 100
c, d = tf.meshgrid(a, b)
c #=>
# <tf.Tensor: shape=(6, 9), dtype=int64, numpy=
# array([[0, 1, 2, 3, 4, 5, 6, 7, 8],
# [0, 1, 2, 3, 4, 5, 6, 7, 8],
# [0, 1, 2, 3, 4, 5, 6, 7, 8],
# [0, 1, 2, 3, 4, 5, 6, 7, 8],
# [0, 1, 2, 3, 4, 5, 6, 7, 8],
# [0, 1, 2, 3, 4, 5, 6, 7, 8]])>
d #=>
# <tf.Tensor: shape=(6, 9), dtype=int64, numpy=
# array([[100, 100, 100, 100, 100, 100, 100, 100, 100],
# [101, 101, 101, 101, 101, 101, 101, 101, 101],
# [102, 102, 102, 102, 102, 102, 102, 102, 102],
# [103, 103, 103, 103, 103, 103, 103, 103, 103],
# [104, 104, 104, 104, 104, 104, 104, 104, 104],
# [105, 105, 105, 105, 105, 105, 105, 105, 105]])>

tf.math.cumprod

累積積を計算するメソッドみたいです。こちらも numpy にあるらしいです。全然知りませんでした。。。。

一応注意ですが、TensorFlow と numpy で動作が違うので注意が必要です。

a #=> array([[0, 1, 2],
# [3, 4, 5],
# [6, 7, 8]])

tf.math.cumprod(a)
#=> <tf.Tensor: shape=(3, 3), dtype=int64, numpy=
# array([[ 0,  1,  2],
#        [ 0,  4, 10],
#        [ 0, 28, 80]])>

np.cumprod(a)
#=> array([0, 0, 0, 0, 0, 0, 0, 0, 0])

以上です。 とても面白かったので、実装が公開されている論文があったらまた記事を書こうと思います。

Yasuaki Hamano

Yasuaki Hamano

I'm a software engineer in Fukuoka, Japan. Recently, I am developing machine learning models using TensorFlow, and also developing Web services by using PHP.