1

私は深く学ぶのが初めてです。そして、私はちょうどTensorflowでCNNを実装し、CIFAR-10(オブジェクト認識ベンチマーク、画像はの10種類の異なるクラスにあります)で試してみました。私のCNNはなぜ学ばないのですか?

訓練の過程で、訓練の損失は最初(100000から3まで)に急速に減少しましたが、それは常に(これはおよそlog(1/10)です)で立ち往生しました。私はクロスエントロピーを損失関数として使用しているので、2.30の損失は私のモデルが約10%の精度を持っていることを意味します - ランダムに推測すると正確に同じです(モデルの実際の出力を確認しました各クラス)。

私のモデルがオーバーフィットするほど「強く」ないので、モデルのサイズを増やそうとしました。しかし、モデルのサイズをどのように増減させても、トレーニングの損失は常に約2.30で減少しなくなることが判明しました。

私のモデルはMNIST(手書き数字認識)のような簡単な作業のために正しく実装されていると確信しています。だから私は本当に問題が何であるか疑問に思います。どうもありがとう。 enter image description here

CONV1:relu有する畳み込み層

pooling1:最大プーリング層

FC1:reluと完全に接続された層

出力:ソフトマックスと完全に接続された層

コード:

nn = NeuralNetwork(optimizer=Adam(0.001), log_dir='logs') 
nn.add(Input('input', [32, 32, 3],)) 
nn.add(Convolution2D(name='conv1', filter_height=3, filter_width=3, 
        n_output_channels=256, activation_fn='relu')) 
nn.add(Pooling2D('pooling1', mode='max', pool_shape=(3, 3), padding='SAME')) 
nn.add(Convolution2D(name='conv2', filter_height=3, filter_width=3, 
        n_output_channels=128, activation_fn='relu')) 
nn.add(Pooling2D('pooling2', mode='max', pool_shape=(3, 3), padding='SAME')) 
nn.add(FullyConnected('fc1', 384, activation_fn='relu', 
         weight_init=truncated_normal(), bias_init=constant(0.1))) 
nn.add(FullyConnected('fc2', 192, activation_fn='relu', 
         weight_init=truncated_normal(), bias_init=constant(0.1))) 
nn.add(Output(loss_fn='sparse_softmax_cross_entropy', output_fn='softmax', 
       name='output', target_shape=[], target_dtype=tf.int64, 
       output_shape=10)) 
nn.build() 

編集:私が述べたように

。私はより多くのレイヤーを追加してモデルの複雑さを増やそうとしましたが、ノーマルレイヤー(conv1、pooling1、conv2、pooling2、fc1、fc2、softmax)とホワイトニングのような前処理がないことを除けばチュートリアルでほぼ試しました。わかりやすくするために、私のパフォーマンスを86%から10%にまで深刻なものにすることはないでしょう。

私が助けてくれるかもしれないもう一つの手がかりは、レイヤーfc1の出力が非常にまばらであることです(ほぼ99%の要素はゼロです)。私はReLUを起動機能として使用しているので、fc1のユニットはほとんどが死んでいるということです。私はそれで何ができるの?

+1

ラベルを2回確認しましたか?データをシャッフルしている間に何か問題が起きましたか? – natschz

+0

MNISTにはより単純な機能があったので、1つのコンバレイヤーで十分でした。 CIFAR-10のような実際の画像のデータセットで学習を開始するには、少なくとも別のコンバージョンレイヤーを追加する必要があります。すなわちconv2およびpool2。 は、この例は、次のとおりです。 https://github.com/tensorflow/tensorflow/blob/master/tensorflow/models/image/cifar10/cifar10.py – iratzhash

+0

はい、私はまた、2つのCONV層と2プールでそれを試してみました層。まだ約2.3で立ち往生しています –

答えて

5

このタスクで妥当な結果を得るために必要なアーキテクチャを真剣に過小評価している可能性があります。あなたが記述したモデル(input-> conv1-> pooling1-> fc1-> output)はMNISTには適しているかもしれませんが、実際のカラー画像を含む画像分類タスクではランダムな結果よりも優れているとは限りません。

現実には、より具体的な推奨事項を提供するための実際のコードを提供する必要がありますが、この問題を解決できる他のモデルを検討することをおすすめします。たとえば、Tensorflowにはexample CNNがあり、CIFAR-10で約86%の精度を達成できますが、このモデルはより複雑です。また、畳み込みと完全接続のレイヤー、正規化、入力前処理(ホワイトニング、データ拡張など)、チューニングされたハイパーパラメータを使用しても、優れた結果を得るには強力なGPUで数時間のトレーニングが必要です。

とにかく短い話ですが、私はモデルのモデルを見直して、必要なアーキテクチャの種類を感じてください。黒と白の数のセットに対して、ランダムなカラーイメージでオブジェクトを識別することがどれほど複雑であるかを過小評価するのは簡単です。

+0

あなたの答えをありがとうが、私が述べたように。私はもっ​​と多くのレイヤーを追加することでモデルの複雑さを増やそうとしました。**ほとんどのチュートリアルで試しましたが、ノルムレイヤー(conv1、pooling1、conv2、pooling2、fc1、fc2、softmax)とpreprocessiong単純化のためにホワイトニングのように、これは私のパフォーマンスを86%から10%にまで深刻化させないかもしれないと思いますか? –

+0

より複雑なモデルではど​​のようなハイパーパラメータ最適化を試しましたか? NNのアーキテクチャにおけるわずかな違いでさえ、ランダム精度よりも優れた性能を達成するためには、実質的な超パラメータ最適化を必要とする可能性がある。 – Aenimated1

+0

こんにちは、@Aenimated、私は自分のコードを掲載しました。ところで、私はそれをもっと複雑にしたが、それほど進歩はなかったので、最初のバージョンと少し違っていた。 –

関連する問題