2017-11-02 16 views
1

これは私の最初の投稿ですので、ガイドラインを遵守し、自分以外の人にとっても面白いと思っています。オートエンコーダの再構築損失にカスタム損失を追加してください

私はCNNオートエンコーダーを構築しています。これは、固定サイズの入力マトリックスとして低次元の表現を得る目的で用意されています(ここではハッシュと呼んでいます)。私は行列が似ている場合、これらのハッシュを同様にしたい。私のデータのほんの一部にラベルが付いているので、私は損失関数を2つの別々の関数の組み合わせにしたいと考えています。 1つの部分は自動エンコーダーの再構成エラーです(この部分は正しく機能しています)。もう1つの部分は、ラベル付きデータ用にしたいものです。私は3つの異なるクラスを持つので、それぞれのバッチで同じクラスに属するハッシュ値の間の距離を計算したい(これは実装に問題があります)。これまで

私の努力:

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) 

。私は現在、クラスの最初のハッシュとそのクラスの他のハッシュとの違いについてのみ実装していますが、現在の実装には満足していません。だから、

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つの質問/問題があります。

  1. をテンソル内の他のすべてのRAWですべての生の距離を計算するための簡単な方法はありますか?
  2. クラスの距離内でcalculateを実行すると、他の要素を持つ最初の要素だけであっても、最適化しようとすると 'nan'が返されます。あなたの時間と助けを

感謝:)のサンプルコードで

+0

'class?_hashes'の形は何ですか? –

+0

申し訳ありません。私はこの質問に関連すると思ったコードの一部のみを投稿しました。ハッシュの形状は[None、256]なので、クラス_ _hashesは現在のバッチでそのクラスのインデックスの数に応じて形状[?、256]を持ちます。 –

答えて

0

は、あなたがポイント間Eucledian距離の合計を計算しています。このため

、あなたは、データセット全体をループに持つとO(n^2 * m)計算を行うとO(n^2 * m)スペース、すなわちTensorflowグラフ操作を持っています。 ここで、nはベクトルの数であり、次に、あなたのオブジェクトを変更することができればmは、しかしすなわち、256

ハッシュのサイズである:

を次に、あなたがすることができますnifty relationship between the squared Euclidean distance and the varianceを使用して

mu_kと同じ計算を書き換えますクラスタの座標kの平均値です。

これにより、O(n * m)時間とO(n * m)テンソルフローの値を計算できます。

これは、この変更(つまり、ユークリッド距離から2乗ユークリッド距離まで)は、あなたの損失関数に悪影響を与えません。

関連する問題