Подтвердить что ты не робот

Преобразование между NHWC и NCHW в TensorFlow

Каков наилучший способ преобразования тензора из формата NHWC в формат NCHW и наоборот?

Есть ли конкретный способ, который делает это, или мне нужно использовать некоторую комбинацию операций split/concat?

4b9b3361

Ответ 1

Все, что вам нужно сделать, это перестановка размеров от NHWC до NCHW (или наоборот).

Значение каждой буквы может помочь понять:

  • N: количество изображений в партии
  • H: высота изображения
  • W: ширина изображения
  • C: количество каналов изображения (например: 3 для RGB, 1 для оттенков серого...)

От NHWC до NCHW

Форма изображения (N, H, W, C), и мы хотим, чтобы на выходе была форма (N, C, H, W). Поэтому нам нужно применить tf.transpose с хорошо подобранной подстановкой perm.

Возвращаемое значение тензора i будет соответствовать входному размеру perm[i]

perm[0] = 0  # output dimension 0 will be 'N', which was dimension 0 in the input
perm[1] = 3  # output dimension 1 will be 'C', which was dimension 3 in the input
perm[2] = 1  # output dimension 2 will be 'H', which was dimension 1 in the input
perm[3] = 2  # output dimension 3 will be 'W', which was dimension 2 in the input

На практике:

images_nhwc = tf.placeholder(tf.float32, [None, 200, 300, 3])  # input batch
out = tf.transpose(x, [0, 3, 1, 2])
print(out.get_shape())  # the shape of out is [None, 3, 200, 300]

От NCHW до NHWC

Форма изображения (N, C, H, W), и мы хотим, чтобы на выходе была форма (N, H, W, C). Поэтому нам нужно применить tf.transpose с хорошо подобранной подстановкой perm.

Возвращаемое значение тензора i будет соответствовать входному размеру perm[i]

perm[0] = 0  # output dimension 0 will be 'N', which was dimension 0 in the input
perm[1] = 2  # output dimension 1 will be 'H', which was dimension 2 in the input
perm[2] = 3  # output dimension 2 will be 'W', which was dimension 3 in the input
perm[3] = 1  # output dimension 3 will be 'C', which was dimension 1 in the input

На практике:

images_nchw = tf.placeholder(tf.float32, [None, 3, 200, 300])  # input batch
out = tf.transpose(x, [0, 2, 3, 1])
print(out.get_shape())  # the shape of out is [None, 200, 300, 3]