TensorFlowでは頻繁に配列の形を変換しますが、結構混乱して理解するのに時間がかかります。Numpy.reshapeとかNumpy.transposeの動きをシンプルな配列で確認してみます。
これから操作する配列は、下記のようなCifar10の画像データの構造をイメージしてます。 最初の4個は赤。次の4個は緑、最後の4個は青。 最初は上記が一次元の配列に格納されている状態にして、最終的にはこれを下記の並びにしたいです。縦、横、チャンネルの3次元配列にしたいということです。
[縦、横、チャンネル]
4個ずつ赤・緑・青があるとういことは、2x2の画像サイズになります。よって、配列のshapeは、[2, 2, 3]になることを想定しております。このshapeになりつつ、配列データの構造に不整合がなければ形の変換が成功したことになります。
コード
import numpy as np arr = np.array([1, 2, 3, 4, 11, 12, 13, 14, 21, 22, 23, 24]) print('これだとダメ') arr2 = arr.reshape(2, 2, 3) print(arr2) print('----------------------') print('引数の順番に全体を分割していくと考えたら良さそう') print('今は赤、緑、青の順に並んでるので、最初にチャンネル数で分けるしかない') print('最初に全体を3つに分割して、次に2つ(縦)に分割して、最初に2つ(横)に分割する') arr3 = arr.reshape(3, 2, 2) print(arr3) print('----------------------') print('最終的に縦、横、チャンネルの順にしたいのでtransposeで順番変える') arr4 = arr3.transpose(1, 2, 0) print(arr4)
結果
これだとダメ [[[ 1 2 3] [ 4 11 12]] [[13 14 21] [22 23 24]]] ---------------------- 引数の順番に全体を分割していくと考えたら良さそう 今は赤、緑、青の順に並んでるので、最初にチャンネル数で分けるしかない 最初に全体を3つに分割して、次に2つ(縦)に分割して、最初に2つ(横)に分割する [[[ 1 2] [ 3 4]] [[11 12] [13 14]] [[21 22] [23 24]]] ---------------------- 最終的に縦、横、チャンネルの順にしたいのでtransposeで順番変える [[[ 1 11 21] [ 2 12 22]] [[ 3 13 23] [ 4 14 24]]]