2016-10-03 5 views
7

컨볼 루션 스파 스 자동 인코딩을 만들려고하고 있으며 값이 넉넉한 (형태가 [samples, N, N, D]) 4D 매트릭스를 스파 스 매트릭스로 변환해야합니다.밀도가 높은 스파 스 매트릭스 Tensorflow

각 샘플에 대해 D NxN 기능 맵이 있습니다. 최대 값을 1로 매핑하고 다른 모든 값을 0으로 매핑하여 각 NxN 기능 맵을 희소 행렬로 변환하고 싶습니다.

실행시에는 물론 그래프 선언 중에 (이 작업이 필요합니다. 그 결과 희박한 행렬을 다른 그래프 연산에 대한 입력으로 사용하는 방법). 그러나 인덱스를 가져 와서 희소 행렬을 만드는 방법을 이해하지 못합니다.

+0

당신이 Tensorflow 또는이 변환을 수행 하시겠습니까 파이썬? if in python이 함수는 밀도가 높은 행렬에서 희소 행렬로 변환하는 데 도움이됩니다 (http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.coo_matrix.html#scipy.sparse.coo_matrix). tf.SparseTensor (coo 형식 사용)를 사용하여 각 기능 맵을 저장하고 목록을 사용하여 모든 스파 스 테네시를 저장합니다. –

+0

특히 nonzero() (http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.coo_matrix.nonzero.html#scipy.sparse.coo_matrix.nonzero)는 0이 아닌 숫자에 대한 색인을 제공 할 수 있습니다. 집단. 이것이 런타임 접근법으로 간주되는지 확실하지 않습니다. 이것은 그래프 선언 전에 일부 데이터 전처리 일 수 있습니다. 런타임에 4D 조밀 한 행렬이 생성되었거나 단순히 주어진 입력 데이터입니까? –

+0

런타임시 (나는 numpy로 그 작업을 수행하는 방법을 알고 있습니다.) 그래프를 작성하는 동안 (Tensorflow를 사용하여) 이렇게하고 싶지 않습니다. – Cramer

답변

9
당신은 tf.where을 사용할 수 있습니다

tf.gather_nd 그렇게하기 :

import numpy as np 
import tensorflow as tf 

# Make a tensor from a constant 
a = np.reshape(np.arange(24), (3, 4, 2)) 
a_t = tf.constant(a) 
# Find indices where the tensor is not zero 
idx = tf.where(tf.not_equal(a_t, 0)) 
# Make the sparse tensor 
# Use tf.shape(a_t, out_type=tf.int64) instead of a_t.get_shape() 
# if tensor shape is dynamic 
sparse = tf.SparseTensor(idx, tf.gather_nd(a_t, idx), a_t.get_shape()) 
# Make a dense tensor back from the sparse one, only to check result is correct 
dense = tf.sparse_tensor_to_dense(sparse) 
# Check result 
with tf.Session() as sess: 
    b = sess.run(dense) 
np.all(a == b) 
>>> True 
+0

어떻게 이것을 텐손으로합니까? 마치 텐서를 희소 한 것으로 변환하고 싶습니다. –

+1

@RocketPingu 무슨 뜻인지 모르겠다. 이것은 조밀 한 텐서를 희소 한 것으로 변환하는 것이다. 여기서'a_t'는 정규 TensorFlow 텐서입니다 (이 경우'tf.constant' 연산에서 얻어 지지만 다른 연산의 출력이 될 수 있습니다). 명확성을 위해 몇 가지 의견을 추가했습니다. – jdehesa

+0

그냥 코드를 사용해 보았을 때 오류가 발생했습니다. 여기에 더 많은 내용이 있습니다. https://stackoverflow.com/questions/48201725/converting-tensor-to-a-sparsetensor –

1

간단한 코드를 tf.SparseTensor에 조밀 한 NumPy와 배열을 변환 :

def denseNDArrayToSparseTensor(arr): 
    idx = np.where(arr != 0.0) 
    return tf.SparseTensor(np.vstack(idx).T, arr[idx], arr.shape)