수색…


소개

Tensorflow가 어떻게 텐서로 인덱싱을 지원하는지, 가능한 경우 num 피 같은 인덱싱과의 차이점 및 유사점을 강조 표시하는 다양한 예가 나와 있습니다.

텐서에서 슬라이스 추출

자세한 정보는 tf.slice(input, begin, size) 문서를 참조하십시오.

인수 :

  • input : Tensor
  • begin : input 각 차원에 대한 시작 위치
  • size : 각 차원의 요소 수 input , 사용이 -1 남아있는 모든 요소를 포함

너피 같은 슬라이스 :

# x has shape [2, 3, 2]
x = tf.constant([[[1., 2.], [3., 4. ], [5. , 6. ]],
                 [[7., 8.], [9., 10.], [11., 12.]]])

# Extracts x[0, 1:2, :] == [[[ 3.,  4.]]]
res = tf.slice(x, [0, 1, 0], [1, 1, -1])

음수 인덱싱을 사용하여 세 번째 차원의 마지막 요소를 검색합니다.

# Extracts x[0, :, -1:] == [[[2.], [4.], [6.]]]
last_indice = x.get_shape().as_list()[2] - 1
res = tf.slice(x, [0, 1, last_indice], [1, -1, -1])

텐서의 첫 번째 차원에서 비 인접 슬라이스 추출

일반적으로 tf.gather 는 텐서의 첫 번째 차원에있는 요소 (예 : 2 차원 텐서의 행 1, 3 및 7)에 대한 액세스를 제공합니다. 첫 번째 차원 이외의 다른 차원에 대한 액세스가 필요하거나 전체 슬라이스가 필요하지는 않지만 첫 번째, 세 번째 및 일곱 번째 행의 다섯 번째 항목 만 필요한 경우 tf.gather_nd 사용하는 것이 tf.gather_nd (향후 예정 참조). 이에 대한 예).

tf.gather 인수 :

  • params : 값을 추출하려는 텐서입니다.
  • indices : params 가리키는 인덱스를 지정하는 텐서

자세한 정보는 tf.gather (params, indices) 문서를 참조하십시오.


우리는 2 차원 텐서에서 1 행과 4 행을 추출하고자합니다.

# data is [[0, 1, 2, 3, 4, 5],
#          [6, 7, 8, 9, 10, 11],
#          ...
#          [24, 25, 26, 27, 28, 29]]
data = np.reshape(np.arange(30), [5, 6])
params = tf.constant(data)
indices = tf.constant([0, 3])
selected = tf.gather(params, indices)

selected 모양이 [2, 6] 이고 그 값을 인쇄하면

[[ 0  1  2  3  4  5]
 [18 19 20 21 22 23]]

indices 는 스칼라 일 수도 있습니다 (단, 음수 인덱스는 포함 할 수 없습니다). 예 : 위의 예 :

tf.gather(params, tf.constant(3))

인쇄 할 것이다.

[18 19 20 21 22 23]

indices 는 모양을 가질 수 있지만 indices 저장된 요소는 항상 params첫 번째 차원 만 참조합니다. 예를 들어, 첫 번째와 세 번째 행 두 번째와 네 번째 행을 동시에 검색하려면 다음과 같이하십시오.

indices = tf.constant([[0, 2], [1, 3]])
selected = tf.gather(params, indices)

이제 selected 모양은 [2, 2, 6] 이고 내용은 다음과 같습니다.

[[[ 0  1  2  3  4  5]
  [12 13 14 15 16 17]]

 [[ 6  7  8  9 10 11]
  [18 19 20 21 22 23]]]

tf.gather 를 사용하여 순열을 계산할 수 있습니다. 예를 들어, 다음은 params 모든 행을 뒤집습니다.

indices = tf.constant(list(range(4, -1, -1)))
selected = tf.gather(params, indices)

지금 selected

[[24 25 26 27 28 29]
 [18 19 20 21 22 23]
 [12 13 14 15 16 17]
 [ 6  7  8  9 10 11]
 [ 0  1  2  3  4  5]]

첫 번째 차원 이외의 다른 요소에 액세스해야하는 경우 tf.transpose 를 사용 tf.transposetf.transpose . 예를 들어 행 대신 열을 수집하려면 다음을 수행 할 수 있습니다.

indices = tf.constant([0, 2])
selected = tf.gather(tf.transpose(params, [1, 0]), indices)
selected_t = tf.transpose(selected, [1, 0]) 

selected_t 는 모양이 [5, 2] 이고 읽음 :

[[ 0  2]
 [ 6  8]
 [12 14]
 [18 20]
 [24 26]]

그러나 tf.transpose 는 다소 비싸 tf.gather_nd 사용 사례에서는 tf.gather_nd 를 사용하는 것이 좋습니다.

텐서 (tensors)를 사용한 울프와 같은 인덱싱

이 예제는이 게시물을 기반으로합니다 : TensorFlow - numpy-like tensor indexing .

Numpy에서는 배열을 사용하여 배열에 색인을 생성 할 수 있습니다. 예를 들어 2 차원 배열에서 (1, 2)(3, 2) 의 원소를 선택하려면 다음과 같이하면됩니다 :

# data is [[0, 1, 2, 3, 4, 5],
#          [6, 7, 8, 9, 10, 11],
#          [12 13 14 15 16 17],
#          [18 19 20 21 22 23],
#          [24, 25, 26, 27, 28, 29]]
data = np.reshape(np.arange(30), [5, 6])
a = [1, 3]
b = [2, 2]
selected = data[a, b]
print(selected)

그러면 다음과 같이 인쇄됩니다.

[ 8 20]

tf.gather_nd 에서 동일한 동작을 얻으려면 tf.gather_nd 를 사용하면됩니다. tf.gathertf.gather 의 확장입니다. 위의 예는 다음과 같이 작성할 수 있습니다.

x = tf.constant(data)
idx1 = tf.constant(a)
idx2 = tf.constant(b)
result = tf.gather_nd(x, tf.stack((idx1, idx2), -1))
        
with tf.Session() as sess:
    print(sess.run(result))

그러면 다음과 같이 인쇄됩니다.

[ 8 20]

tf.stacknp.asarray 와 동일하며,이 경우 두 인덱스 벡터를 마지막 차원 (이 경우에는 1st)과 np.asarray 생성합니다.

[[1 2]
 [3 2]]

tf.gather_nd를 사용하는 방법

tf.gather_nd 의 확장 tf.gather 당신이 텐서의 1 차원에 액세스 할뿐만 아니라 수 있다는 점에서, 그러나 잠재적으로 그들 모두.

인수 :

  • params : 인덱스하고자하는 텐서를 나타내는 랭크 P 의 텐서
  • indices : 액세스하려는 params 대한 인덱스를 나타내는 순위 Q 의 Tensor

함수의 출력은 indices 의 모양에 따라 다릅니다. indices 의 가장 안쪽의 차원이 길이 P 이면 params 로부터 단일 요소를 수집합니다. P 보다 작 으면 tf.gather 와 마찬가지로 조각을 수집하지만 1 차원 만 액세스 할 수 있다는 제한은 없습니다.


순위 2의 텐서 (tensor)로부터 원소를 모으는 것

행렬에서 (1, 2) 의 요소에 액세스하려면 다음을 사용할 수 있습니다.

# data is [[0, 1, 2, 3, 4, 5],
#          [6, 7, 8, 9, 10, 11],
#          [12 13 14 15 16 17],
#          [18 19 20 21 22 23],
#          [24, 25, 26, 27, 28, 29]]
data = np.reshape(np.arange(30), [5, 6])
x = tf.constant(data)
result = tf.gather_nd(x, [1, 2])

result 는 예상대로 8 일뿐입니다. 이것이 tf.gather 와 다른 점에 유의하십시오. tf.gather(x, [1, 2]) 전달 된 동일한 색인은 data 에서 두 번째 및 세 번째 으로 제공 data .

동시에 두 개 이상의 요소를 검색하려면 색인 쌍 목록을 전달하십시오.

result = tf.gather_nd(x, [[1, 2], [4, 3], [2, 5]])

[ 8 27 17]


텐서 2에서 행 수거하기

위 예제에서 요소 대신 행 (즉, 슬라이스)을 수집하려는 경우 다음과 같이 indices 매개 변수를 조정하십시오.

data = np.reshape(np.arange(30), [5, 6])
x = tf.constant(data)
result = tf.gather_nd(x, [[1], [3]])

이렇게하면 data 의 두 번째 및 네 번째 행, 즉

[[ 6  7  8  9 10 11]
 [18 19 20 21 22 23]]

텐서 3에서 원소를 모으기

랭크 -2 텐서에 액세스하는 방법의 개념은 더 높은 차원의 텐서로 직접 변환됩니다. 따라서 순위 3 텐서의 요소에 액세스하려면 indices 의 가장 안쪽 차원이 길이 3이어야합니다.

# data is [[[ 0  1]
#          [ 2  3]
#          [ 4  5]]
#
#         [[ 6  7]
#          [ 8  9]
#          [10 11]]]
data = np.reshape(np.arange(12), [2, 3, 2])
x = tf.constant(data)
result = tf.gather_nd(x, [[0, 0, 0], [1, 2, 1]])

result 는 이제 다음과 같이 보일 것입니다 : [ 0 11]


순위 3의 텐서에서 배치 된 행 수집

랭크 3 텐서를 행렬 형태의 배치 (batch_size, m, n) 생각해 봅시다. 일괄 처리의 모든 요소에 대해 첫 번째 및 두 번째 행을 수집하려면 다음을 사용할 수 있습니다.

# data is [[[ 0  1]
#          [ 2  3]
#          [ 4  5]]
#
#         [[ 6  7]
#          [ 8  9]
#          [10 11]]]
data = np.reshape(np.arange(12), [2, 3, 2])
x = tf.constant(data)
result = tf.gather_nd(x, [[[0, 0], [0, 1]], [[1, 0], [1, 1]]])

이 결과는 다음과 같습니다.

[[[0 1]
  [2 3]]

 [[6 7]
  [8 9]]]

indices 의 형태가 출력 텐서의 형태에 어떤 영향을 미치는지 주목하십시오. indices 인자에 대해 rank-2 tensor를 사용했다면 :

result = tf.gather_nd(x, [[0, 0], [0, 1], [1, 0], [1, 1]])

출력은

[[0 1]
 [2 3]
 [6 7]
 [8 9]]


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow