2017-12-05 10 views
2

私は2つの貴様DLライブラリ(カフェE Tensorflow)で2 CNNs(AlexNetのE GoogLeNet)を訓練しています。ネットワークは各ライブラリの開発チームによって実装されました(hereおよびhereCNNにはどのような高速損失の収束が示されていますか?

元のImagenetデータセットを1カテゴリの1024画像に縮小しましたが、ネットワーク上で分類するために1000カテゴリを設定しました。

処理単位(CPU/GPU)とバッチサイズを変更したCNNを訓練しました。このグラフ(Alexnetのように、1エポックが完了する前のほとんどの時間)では、 )Tensorflow上:ポルトガル語

、 'Épocasは' エポックであると 'Perdaは' 損失です。キーの番号はバッチサイズを参照しています。

重量が崩壊し、私がダウンロードしたモデルで使用されるような初期の学習率が同じで、私は唯一のデータセットとバッチサイズを変更しました。

なぜネットワークは、このように収束し、this wayが好きされていませんか?

+1

あなたのおもちゃのトレーニングの問題はちょっと単純すぎると思うので、あなたのネットワークは常に同じクラスを取得し、入力に関係なく常に最適なソリューションであることを常に予測することをすぐに知ります。あなたのデータセットにたくさんの画像を追加して2番目のクラスを追加し、損失の挙動がどのように変化するかを見てみましょう(2024の画像はまだAlexNetやGoogleNetのネットワークでは実際には小さなデータセットですが) – GPhilo

+1

要約すると、 。 ([Great post here](https://towardsdatascience.com/deep-learning-3-more-on-cnns-handling-overfitting-2bd5d99abe5d)) – rkellerm

答えて

2

損失関数は、通常よりもノイズが少ないといくつかの理由のために発振しません。

主なものは、あなたがこれだけ1カテゴリを持っているので、(ビットを簡単にするために)ネットワークだけで簡単にすべてのあなたの入力にそのカテゴリのスコアを向上させることによって、各段階での改善されています。

下記の(美しい!)画像を見てください:複数のクラスがある場合、1つのサンプルの良いステップは、別のサンプルのための良いステップです(異なるカテゴリを持つため)時にはローカルにアップ。カテゴリー1のサンプルに対して行われたネットワーク更新は、cat 2のすべてのサンプルに対して悪いステップですが、逆に2つのタイプのアップデートの合計が正しい方向に向いています(それらは悪い部分を補います。ステップは残ります)。あなたが1つのクラスを持っているならば、あなたはまっすぐに進み、「常にカテゴリ1を予測します」、2つ以上のカテゴリでは、「常に正確に予測する」ようにジグザグに収束します。

あなたは、多くの場合、それをテストしていない、と多分あなたは、いくつかの平滑化を持っていること、(それは学ぶために簡単ですので)データセットが比較的小さいという事実のように(あなたの損失計算され、いくつかの他の効果があります一般的なデータセットやバッチでは、通常、バッチ上にあり、通常の損失関数グラフに参加しています)。

あなたの曲線間の差も、通常、しかし、あなたがデータセット内に実際に存在する唯一の1クラスを持っているという事実を、まだ特徴です。最初は、CPUとGPUが同じ動作をしていることに注意してください。バッチサイズが1より大きい場合、ネットワーク内の更新は、サンプルのみで行ったすべての更新の平均です(もう少し単純化します)。だから、通常はよりスマートなアップデート(「常に正確に予測する」の方向に向かう可能性が高い)を得られるので、良いパフォーマンスに達するためにアップデートが少なくて済みます。このより速いコンバージェンスと、より大きなバッチが更新ごとにより多くのデータを使用するという事実との間にはトレードオフがあるため、どのカーブをより速く収束させるべきか事前に言うのは難しいです。サイズ> 1のminibatchを使用する必要があると広く考えられています(大きすぎず)。現在、データセットに実際にクラスが1つだけ存在する場合、すべての更新はほぼ同じ方向に「常に1を予測する」ので、ミニバッチの平均は基本的に同じですが、ほぼ同じ更新を得るためにはより多くのデータを消費します。同じ数の更新が必要なので、同じステップ数の後に収束するので、同じ結果に対してより多くのデータを消費します。

+0

私はチャートではっきりさせていないと思います。グラフ上のキーはCPUとGPUの量ではなく、バッチのサイズに関連しています。私はそれを残念に思っています(私は512 GPU haha​​hahaを持っていればいいと思います)。 あなたは彼がただ一つのクラスしか持たないので、彼はすぐに学ぶと書いています。実際には1つしかないのに、私はネットワークに1000種類のものがあると述べました。これは干渉しますか?宣言されたクラスを1つだけ使用してネットワークをトレーニングすることで、損失は決して変化しないことに気付きました。 – 648trindade

+1

私はそれがGPUの数であると思うほど馬鹿だとは思ってもらえませんでした。 ;)私は私の答えを更新しました。申し訳ありませんが非常に冗長ですが、私はまだそれがはっきりしていることを願っています。私が1クラスを言うとき、私は "データに実際に存在する1"を意味します。あなたが1クラスを持っていることをネットワークに伝えれば、あなたのコードの一部、特にsoftmaxが壊れてしまいます。他のクラスにまだ例がない場合、2または1000のクラスが存在すると、ネットワークの動作が大きく変わることはありません。 – gdelab

関連する問題