2017-11-02 2 views
1

이 여기 내 첫 번째 게시물에 사용자 정의 손실을 추가, 그래서는 지침을 준수하며 자신을 제외한 다른 사람에 대한 흥미 롭다 바랍니다.autoencoder 재건 손실

내가 그들의 낮은 차원 표현을지고의 목표로 고정 된 크기의 입력 행렬로 소요 CNN의 autoencoder 건물입니다 (나는 그들이 여기 해시 전화). 행렬이 비슷한 경우 이러한 해시를 비슷하게 만들고 싶습니다. 내 데이터 중 일부는 레이블이 붙어 있기 때문에 손실 기능을 두 개의 개별 기능을 조합하여 사용하고자합니다. 한 부분은 자동 인코딩 기의 재구성 오류입니다 (이 부분은 올바르게 작동합니다). 다른 부분은 레이블이 붙은 데이터를 원합니다. 세 가지 다른 클래스가 있으므로, 각 일괄 처리에서 동일한 클래스에 속한 해시 값 사이의 거리를 계산하기를 원합니다 (구현하는 데 문제가 있습니다). 지금까지

내 노력 :

calclulate_within_class_loss은 내가 만든 별도의 기능입니다
X = tf.placeholder(shape=[None, 512, 128, 1], dtype=tf.float32) 
class1_indices = tf.placeholder(shape=[None], dtype=tf.int32) 
class2_indices = tf.placeholder(shape=[None], dtype=tf.int32) 
hashes, reconstructed_output = self.conv_net(X, weights, biases_enc, biases_dec, keep_prob) 
class1_hashes = tf.gather(hashes, class1_indices) 
class1_cost = self.calculate_within_class_loss(class1_hashes) 
class2_hashes = tf.gather(hashes, class2_indices) 
class2_cost = self.calculate_within_class_loss(class2_hashes) 
loss_all = tf.reduce_sum(tf.square(reconstructed_output - X)) 
loss_labeled = class1_cost + class2_cost 
loss_op = loss_all + loss_labeled 
optimizer = tf.train.AdagradOptimizer(learning_rate=learning_rate) 
train_op = optimizer.minimize(loss_op) 

. 나는 현재는 같은 배치에서 그 클래스의 다른 해시와 클래스의 첫 번째 해시의 차이를 구현 한, 그러나 나는 나의 현재 구현되지 행복하고 그것이 작동하지 않는 보인다. 텐서의 다른 모든 RAWS와 모든 원시의 거리를 계산 할 수있는 쉬운 방법

  1. 있습니까 :

    def calculate_within_class_loss(self, hash_values): 
        first_hash = tf.slice(hash_values, [0, 0], [1, 256]) 
        total_loss = tf.foldl(lambda d, e: d + tf.sqrt(tf.reduce_sum(tf.square(tf.subtract(e, first_hash)))), hash_values, initializer=0.0) 
        return total_loss 
    

    그래서, 두 가지 질문/문제가? 그냥 다른 요소와의 첫 번째 요소에 대한 경우에도

  2. 클래스로 이동할 수있는 거리 계산의 나의 현재 구현, 나에게 줄 것이다 '유모'내가 그것을 최적화하려고 할 때.

시간 내 주셔서 감사하고 샘플 코드에서 :

+0

'class? _hashes'의 모양은 무엇입니까? –

+0

죄송합니다. 나는이 질문과 관련이 있다고 생각하는 코드의 일부만 게시했다. 해시의 모양은 [없음, 256]이므로 클래스 _hash도 현재 배치에서 해당 클래스의 색인 수에 따라 모양이 [?, 256]입니다. –

답변

0

도움, 당신은 점 사이 Eucledian 거리의 합을 계산합니다. 이를 위해

하면, 즉 Tensorflow 그래프 동작을 전체 셋 이상의 루프를 가지며 O(n^2 * m) 계산을 수행하고 O(n^2 * m) 공간을 가질 것이다. 다음, n는 벡터의 수는 당신이 다음에 개체를 변경할 수 있다면 m는, 그러나 즉, 256

해시의 크기 :

를 그리고, 당신은 할 수 있습니다 nifty relationship between the squared Euclidean distance and the variance을 사용하고

mu_k 같은 계산을 다시 작성 클러스터의 좌표 k의 평균값입니다.

이렇게하면 O(n * m) 시간의 값과 O(n * m) Tensorflow 작업의 값을 계산할 수 있습니다.

이이 변화를 생각하면 갈 수있는 방법이 될 것이다 (즉,유클리드 거리에서 제곱 유클리드 거리까지) 손실 함수에 나쁜 영향을 미치지 않습니다.