はじめに
KerasのF.Cholletの本を読むと、Concatenate Layerの説明がされている部分がある。下記の絵で表現されているが、この中でどんな演算が行われているかさっぱりしたまなであった。
ところで、U-NET, ResnetなどにConcatenate Layerが重要な役割をしていることから、これ以上にConcatenate Layerを理解せず放置することは良くない判断で、簡単なテンソルを利用し、Concatenate Layerの挙動を確認することにした。
理解
Excelで、文字列結合の時に、Concatenate関数を使ったことがあったので、何となく複数の配列を何の演算もせず、くっつけるイメージは持っていたが、Teratailにわかりやすい図があったので、ここで紹介する。
ここで、青と緑二つの行列がある。
これらの行列は2次元(2D)テンソルで、これらの行列のShapeは(3,3)である。
axisとは、テンソルの次元(Dimension)を言う。[テンソル(Tensor)の理解(2) : Shape]
axisは、テンソルの次元の軸も指す。(物理でのモーメントを表記するときのベクトルを考えるといいかもしれない。)
2次元テンソルの場合、axis = 0が垂直方向、 axis = 1が水平方向を意味する。
ただし、axis = -1とした場合は、一番最後の軸を意味する。Pythonのリストのスライスを考えるといい。
そして、Concatenate Layerの時、結合方向を指定することが可能である。
(1) axis = 0の場合、垂直方向に結合する。
(2) axis = 1の場合、水平方向に結合する。(ただし、2次元の場合、axis = -1も同じ意味)
プログラムコード
import tensorflow as tf
import numpy as np
# 2D Tensorの準備
x1 = np.array([[1,3,3],
[5,2,1],
[0,9,5]])
x2 = np.array([[3,2,3],
[8,7,4],
[0,1,1]])
print('x1=',x1)
print('x2=',x2)
Concatenate Layer
垂直結合
# Concantenate Layer
# axis = 0, 垂直方向結合
y1 = tf.keras.layers.Concatenate(axis=0)([x1,x2])
print('y1=',y1)
y1= tf.Tensor(
[[1 3 3]
[5 2 1]
[0 9 5]
[3 2 3]
[8 7 4]
[0 1 1]], shape=(6, 3), dtype=int32)
水平結合
# axis = 1 (or axis = -1) 水平方向結合
y2 = tf.keras.layers.Concatenate(axis=-1)([x1,x2])
print('y2=',y2)
y2= tf.Tensor(
[[1 3 3 3 2 3]
[5 2 1 8 7 4]
[0 9 5 0 1 1]], shape=(3, 6), dtype=int32)
まとめ
やっとConcatenate Layerの動作を理解した。(気がする。)
ただし、Concatenateのスペリングがなかなか頭に入らない。(涙)