6

私は空間次元(〜ピクセル)の各位置の値がその位置のクラス確率として解釈される4D出力テンソルを生成するネットワークを持っています。つまり、出力は(num_batches, height, width, num_classes)です。私は実際のクラスがワンホットとしてコード化されている同じサイズのラベルを持っています。私はこれを使用してcategorical-crossentropyの損失を計算したいと思います。ケラスでポイント・ワイズのカテゴリカル・クロスエントロピー・ロスを行うには?

問題#1:K.softmax機能は2Dテンソル(num_batches, num_classes)

に問題#2を期待:私は、各位置からの損失は組み合わせるべきかどうかはわかりません。 reshapeテンソルを(num_batches * height * width, num_classes)に変更してから、K.categorical_crossentropyを呼び出すのは正しいですか?または、K.categorical_crossentropy(num_batches, num_classes)の高さ×幅の時間を呼び出して結果を平均しますか?

+0

どのバックエンドをお使いですか? –

+0

@MarcinMożejko私はTensorFlowを使用しています - KerasバックエンドAPIまたはTF独自の関数を使用することもできますが、いずれも問題ありません。ありがとう! –

+0

私はあなたの質問に答えました:-) –

答えて

2

出力を2Dテンソルのサイズ(num_batches, height * width * num_classes)にフラット化するだけです。 Flattenレイヤーでこれを行うことができます。 yが同じ方法で平らにされていることを確認してください(通常はy = y.reshape((num_batches, height * width * num_classes))と呼んでください)。すべてwidth*height予測上のカテゴリcrossentropyを使用して、2番目の質問については

は、基本的に(カテゴリcrossentropyの定義による)各 width*height予測のためのカテゴリcrossentropyを平均と同じです。

+0

ありがとう!私は(num_batches、height * width * num_classes)で混乱しています。それは本質的にクロスエントロピーを計算するのと同じように、num_batchesのサンプルに高さ*幅* num_classesのクラスがあるかのようですか?私はそれぞれの点を別々のサンプルとして数えたいと思うのですが、(num_batches * height * width、num_classes)に再整形するのと同じではありませんか?両者が数学的に同等であるかどうか教えてください。 –

+0

申し訳ありませんが、カテゴリクロスエントロピーだけでも、本質的に同じ数学的になります。しかし、ソフトマックスと一緒に使用することは、出力が正規化されているので、数学的には同じではありません。これは私の答えの欠点です。モデルの入力中点のバッチサイズを変更することはできないと思います。最善の方法は回避策を講じて、それぞれの 'height * width'セルの出力を正規化する独自のsoftmax起動関数を実装することです。 – oscfri

+0

ありがとう!私はそれを作業コードに変換する方法についてはまだ混乱しています。私は賞金を始めた:) –

2

私の直感を確認するためにthis issueが見つかりました。

要するに:softmaxは2Dまたは3D入力を受け取ります。彼らが3Dの場合、ケラスはこのような形(サンプル、時限、numclasses)を仮定し、最後にsoftmaxを適用します。いくつかの奇妙な理由のために、それは4Dテンソルのためにそれをしません。

解決策:

reshaped_output = Reshape((height*width, num_classes))(output_tensor) 

が続いて適用する画素の配列と、あなたの出力の形を変えるあなたのソフトマックス

new_output = Activation('softmax')(reshaped_output) 

そしてどちらか2Dにターゲットテンソルの形を変えるか、あなただけにその最後の層の形状を変更(幅、高さ、num_classes)。

そうでなければ、自分の携帯電話にいなかった場合、タイムディストリビュート(Activation( 'softmax'))を使用することです。しかし、それがうまくいくならば何のアイデアは...私はこれが:-)

2

あなたは可能性もないreshape何かを助け、自分でsoftmaxlossの両方を定義したいと考えています。後で

をしようとしませんここで(tfバックエンドのように)最後の入力ディメンションに適用されsoftmaxです:

def image_softmax(input): 
    label_dim = -1 
    d = K.exp(input - K.max(input, axis=label_dim, keepdims=True)) 
    return d/K.sum(d, axis=label_dim, keepdims=True) 

、ここであなたが(何かを再構築する必要はありません)lossを持っていない:

__EPS = 1e-5 
def image_categorical_crossentropy(y_true, y_pred): 
    y_pred = K.clip(y_pred, __EPS, 1 - __EPS) 
    return -K.mean(y_true * K.log(y_pred) + (1 - y_true) * K.log(1 - y_pred)) 

んが、さらに整形必要。

関連する問題