4

ネットワークの損失関数として 2 つのイメージ間で SSD を使用しようとしています。

# h_fc2 is my output layer, y_ is my label image.
ssd = tf.reduce_sum(tf.square(y_ - h_fc2))

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(ssd)

問題は、重みが発散し、エラーが発生することです

 ReluGrad input is not finite. : Tensor had Inf values

なぜですか?画像サイズでssdを正規化する(機能しなかった)、出力値を1にトリミングする(もうクラッシュしませんが、まだ評価する必要があります)など、他のことを試しました:

ssd_min_1 = tf.reduce_sum(tf.square(y_ - tf.minimum(h_fc2, 1)))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(ssd_min_1)

私の観察は期待されるべきですか?

編集:@mdaoustの提案は正しいことが証明されました。主なポイントは、バッチサイズで正規化することでした。これは、このコードを使用して、バッチ サイズに関係なく実行できます。

squared_diff_image = tf.square(label_image - output_img)
# Sum over all dimensions except the first (the batch-dimension).
ssd_images = tf.reduce_sum(squared_diff_image, [1, 2, 3])
# Take mean ssd over batch.
error_images = tf.reduce_mean(ssd_images)

この変更により、学習率をわずかに (0.0001 に) 下げるだけで済みました。

4

1 に答える 1

5

非限定的な結果になる方法はたくさんあります。

しかし、オプティマイザー、特に勾配降下のような単純なものは、学習率が「高すぎる」場合に発散する可能性があります。

単純に学習率を 10/100/1000 で割ってみましたか? またはpixels*batch_size、ピクセルあたりの平均エラーを取得するために正規化しますか?

それとも、より高度なオプティマイザの 1 つですか? たとえばtf.train.AdamOptimizer()、デフォルトのオプションを使用します。

于 2015-11-17T11:44:07.147 に答える