tensorflow
텐서 색인 생성
수색…
소개
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.transpose
를 tf.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.gather
는 tf.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.stack
은 np.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]]