これは私の最初の投稿ですので、ガイドラインを遵守し、自分以外の人にとっても面白いと思っています。オートエンコーダの再構築損失にカスタム損失を追加してください
私は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つの質問/問題があります。
- をテンソル内の他のすべてのRAWですべての生の距離を計算するための簡単な方法はありますか?
- クラスの距離内でcalculateを実行すると、他の要素を持つ最初の要素だけであっても、最適化しようとすると 'nan'が返されます。あなたの時間と助けを
感謝:)のサンプルコードで
'class?_hashes'の形は何ですか? –
申し訳ありません。私はこの質問に関連すると思ったコードの一部のみを投稿しました。ハッシュの形状は[None、256]なので、クラス_ _hashesは現在のバッチでそのクラスのインデックスの数に応じて形状[?、256]を持ちます。 –