CNNのトレーニングの精度はトレーニング中に向上しますが、テストの精度は約40%のままです。

wohe1

そのため、過去数か月間、TensorflowとKerasを使用したニューラルネットワークについて多くのことを学んできたので、CIFAR10データセット(以下のコード)のモデルを作成してみたかったのです。

ただし、トレーニングプロセス中、精度は向上します(1エポック後の約35%から5エポック後の約60-65%)が、val_accは同じままであるか、わずかに増加します。印刷結果は次のとおりです。

Epoch 1/5
50000/50000 [==============================] - 454s 9ms/step - loss: 1.7761 - acc: 0.3584 - val_loss: 8.6776 - val_acc: 0.4489
Epoch 2/5
50000/50000 [==============================] - 452s 9ms/step - loss: 1.3670 - acc: 0.5131 - val_loss: 8.9749 - val_acc: 0.4365
Epoch 3/5
50000/50000 [==============================] - 451s 9ms/step - loss: 1.2089 - acc: 0.5721 - val_loss: 7.7254 - val_acc: 0.5118
Epoch 4/5
50000/50000 [==============================] - 452s 9ms/step - loss: 1.1140 - acc: 0.6080 - val_loss: 7.9587 - val_acc: 0.4997
Epoch 5/5
50000/50000 [==============================] - 452s 9ms/step - loss: 1.0306 - acc: 0.6385 - val_loss: 7.4351 - val_acc: 0.5321
10000/10000 [==============================] - 27s 3ms/step
loss:  7.435152648162842 
accuracy:  0.5321

インターネットを見て回ったところ、モデルが過剰適合していると思われるので、いくつかのレイヤーを削除し、ドロップアウトレイヤーを追加してフィルターの数を減らしてみましたが、何も向上していませんでした。

最も奇妙なことは、しばらく前に、いくつかのチュートリアルに基づいて非常に類似したモデルを作成したことです。これは、8エポック後に80%の最終精度を持っていました。(私はそのファイルを失いましたが)

これが私のモデルのコードです:

model = Sequential()
model.add(Conv2D(filters=256,
                 kernel_size=(3, 3),
                 activation='relu',
                 data_format='channels_last',
                 input_shape=(32, 32, 3)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(filters=128,
                 kernel_size=(2, 2),
                 activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(1024, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))


model.compile(optimizer=adam(),
              loss=categorical_crossentropy,
              metrics=['accuracy'])

model.fit(train_images, train_labels,
          batch_size=1000,
          epochs=5,
          verbose=1,
          validation_data=(test_images, test_labels))

loss, accuracy = model.evaluate(test_images, test_labels)
print('loss: ', loss, '\naccuracy: ', accuracy)

train_imagestest_imagesnumpy arraysサイズ(50000,32,32,3)(10000,32,32,3)train_labelsありtest_labelsnumpy arraysサイズ(50000,10)(10000,10)です。

私の質問:これを引き起こす原因と私はそれについて何ができますか?

マキシムの答えの後に編集する:

モデルを次のように変更しました。

model = Sequential()
model.add(Conv2D(filters=64,
                 kernel_size=(3, 3),
                 activation='relu',
                 kernel_initializer='he_normal',    # better for relu based networks
                 input_shape=(32, 32, 3)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(filters=256,
                 kernel_size=(3, 3),
                 activation='relu',
                 kernel_initializer='he_normal'))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(10, activation='softmax'))

出力は次のようになります。

Epoch 1/10
50000/50000 [==============================] - 326s 7ms/step - loss: 1.4916 - acc: 0.4809 - val_loss: 7.7175 - val_acc: 0.5134
Epoch 2/10
50000/50000 [==============================] - 338s 7ms/step - loss: 1.0622 - acc: 0.6265 - val_loss: 6.9945 - val_acc: 0.5588
Epoch 3/10
50000/50000 [==============================] - 326s 7ms/step - loss: 0.8957 - acc: 0.6892 - val_loss: 6.6270 - val_acc: 0.5833
Epoch 4/10
50000/50000 [==============================] - 324s 6ms/step - loss: 0.7813 - acc: 0.7271 - val_loss: 5.5790 - val_acc: 0.6474
Epoch 5/10
50000/50000 [==============================] - 327s 7ms/step - loss: 0.6690 - acc: 0.7668 - val_loss: 5.7479 - val_acc: 0.6358
Epoch 6/10
50000/50000 [==============================] - 320s 6ms/step - loss: 0.5671 - acc: 0.8031 - val_loss: 5.8720 - val_acc: 0.6302
Epoch 7/10
50000/50000 [==============================] - 328s 7ms/step - loss: 0.4865 - acc: 0.8319 - val_loss: 5.6320 - val_acc: 0.6451
Epoch 8/10
50000/50000 [==============================] - 320s 6ms/step - loss: 0.3995 - acc: 0.8611 - val_loss: 5.3879 - val_acc: 0.6615
Epoch 9/10
50000/50000 [==============================] - 320s 6ms/step - loss: 0.3337 - acc: 0.8837 - val_loss: 5.6874 - val_acc: 0.6432
Epoch 10/10
50000/50000 [==============================] - 320s 6ms/step - loss: 0.2806 - acc: 0.9033 - val_loss: 5.7424 - val_acc: 0.6399
10000/10000 [==============================] - 19s 2ms/step
loss:  5.74234927444458 
accuracy:  0.6399

これまでに得た助けを借りてモデルを変更したのに、私は再び過剰適合しているようです...説明やヒントはありますか?

入力画像は、に(32,32,3)正規化されたnumpy配列です。(0,1)

マキシム

データの準備方法は含まれていません。このネットワークの学習を大幅に改善した追加機能が1つあります。

x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255

このようにデータの正規化を行う場合、ネットワークは正常です。5エポック後に約65〜70%のテスト精度に達します。これは良い結果です。5エポックはほんの始まりに過ぎないことに注意してください。データを実際によく学習し、最先端に近い結果を表示するには、約30〜50エポックが必要です。

以下は、私が気付いたいくつかのマイナーな改善点であり、追加のパフォーマンスポイントを得ることができます。

  • ReLuベースのネットワークを使用しているため、he_normal初期化子glorot_uniform(Conv2Dのデフォルト)より優れています。
  • ネットワークの奥深くに行くにつれて、フィルターの数を減らすのは奇妙です。あなたは正反対のことをすべきです。変更256 -> 64128 -> 256て精度が向上しました。
  • ドロップアウトを少し減らしました0.5 -> 0.4
  • カーネルサイズ3x3はより一般的です2x22番目のコンバージョンレイヤーでも試してみるべきだと思います。実際、すべてのハイパーパラメータ試して、最適な組み合わせを見つけることができます。

最終的なコードは次のとおりです。

(x_train, y_train), (x_test, y_test) = cifar10.load_data()
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)

model = Sequential()
model.add(Conv2D(filters=64,
                 kernel_size=(3, 3),
                 activation='relu',
                 kernel_initializer='he_normal',
                 input_shape=(32, 32, 3)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(filters=256,
                 kernel_size=(2, 2),
                 kernel_initializer='he_normal',
                 activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(1024, activation='relu'))
model.add(Dropout(0.4))
model.add(Dense(10, activation='softmax'))

model.compile(optimizer=adam(),
              loss=categorical_crossentropy,
              metrics=['accuracy'])

x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255

model.fit(x_train, y_train,
          batch_size=500,
          epochs=5,
          verbose=1,
          validation_data=(x_test, y_test))

loss, accuracy = model.evaluate(x_test, y_test)
print('loss: ', loss, '\naccuracy: ', accuracy)

5エポック後の結果:

loss:  0.822134458447 
accuracy:  0.7126

ちなみに、あなたのアプローチをkerasの例CIFAR-10 convnetと比較することに興味があるかもしれません

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

トレーニングの精度は積極的に向上し、テストの精度は落ち着きます

分類Dev

このCNNをトレーニングするときに精度が向上しないのはなぜですか?

分類Dev

トレーニングの精度が向上しないのはなぜですか?

分類Dev

署名検証のためのRNNが続くCNNのトレーニングとテストの精度は向上しません

分類Dev

CaffeはPythonで常に同じ予測を行いますが、トレーニングの精度は良好です

分類Dev

CNN-トレーニングの精度は1.0で、検証の精度は1.0です。0.0を返す予測

分類Dev

検証精度は常にKerasのトレーニング精度よりも優れています

分類Dev

同じ精度で2つのステップでデータをトレーニングしますか?

分類Dev

トレーニング精度が向上する一方で検証精度が変動しますか?

分類Dev

ランダムフォレストは、トレーニングとテストで98%の精度を取得しますが、それ以外の場合は常に同じクラスを予測します

分類Dev

ランダムフォレストは、トレーニングとテストで98%の精度を取得しますが、それ以外の場合は常に同じクラスを予測します

分類Dev

Keras CNN + Google Colabは常にクラス1を予測します(高トレーニング+検証精度)

分類Dev

Kerasは、マルチクラス分類問題の検証精度とトレーニング精度をどのように計算しますか?

分類Dev

トレーニング中に精度と損失がまったく同じままであるのはなぜですか?

分類Dev

完全なトレーニングフィットに達した後、トレーニングの精度が低下するのはなぜですか?

分類Dev

CNNのトレーニング後の精度が低い

分類Dev

トレーニングモデルの文字認識で精度が向上しない

分類Dev

トレーニングは100%であり、動画から抽出した画像をディープラーニングモデルにフィードする方法にもかかわらず、検証の精度を向上させることはできません

分類Dev

Tensorflowの二項分類トレーニングの損失は減少せず、精度は約50%に留まります

分類Dev

トレーニングの精度が大幅に向上し、エポック間で損失が発生する原因は何ですか?

分類Dev

Wekaでのテスト精度とトレーニング時間

分類Dev

トレーニングの精度は良いが検証の精度は低い

分類Dev

私はMNISTを99.2%の精度でトレーニングしましたが、予測が間違っています

分類Dev

Keras分類器の精度は、トレーニング中に着実に増加し、その後0.25(極小値?)に低下します。

分類Dev

トレーニング時にKerasモデルの精度が常に0になるのはなぜですか?

分類Dev

トレーニング時にKerasモデルの精度が常に0になるのはなぜですか?

分類Dev

トレーニング時にKerasモデルの精度が常に0になるのはなぜですか?

分類Dev

検証の損失と検証の精度はトレーニング中に変更されません

分類Dev

TensorFlow LSTM:テストの精度が低くなるのに、トレーニングが行われないのはなぜですか?

Related 関連記事

  1. 1

    トレーニングの精度は積極的に向上し、テストの精度は落ち着きます

  2. 2

    このCNNをトレーニングするときに精度が向上しないのはなぜですか?

  3. 3

    トレーニングの精度が向上しないのはなぜですか?

  4. 4

    署名検証のためのRNNが続くCNNのトレーニングとテストの精度は向上しません

  5. 5

    CaffeはPythonで常に同じ予測を行いますが、トレーニングの精度は良好です

  6. 6

    CNN-トレーニングの精度は1.0で、検証の精度は1.0です。0.0を返す予測

  7. 7

    検証精度は常にKerasのトレーニング精度よりも優れています

  8. 8

    同じ精度で2つのステップでデータをトレーニングしますか?

  9. 9

    トレーニング精度が向上する一方で検証精度が変動しますか?

  10. 10

    ランダムフォレストは、トレーニングとテストで98%の精度を取得しますが、それ以外の場合は常に同じクラスを予測します

  11. 11

    ランダムフォレストは、トレーニングとテストで98%の精度を取得しますが、それ以外の場合は常に同じクラスを予測します

  12. 12

    Keras CNN + Google Colabは常にクラス1を予測します(高トレーニング+検証精度)

  13. 13

    Kerasは、マルチクラス分類問題の検証精度とトレーニング精度をどのように計算しますか?

  14. 14

    トレーニング中に精度と損失がまったく同じままであるのはなぜですか?

  15. 15

    完全なトレーニングフィットに達した後、トレーニングの精度が低下するのはなぜですか?

  16. 16

    CNNのトレーニング後の精度が低い

  17. 17

    トレーニングモデルの文字認識で精度が向上しない

  18. 18

    トレーニングは100%であり、動画から抽出した画像をディープラーニングモデルにフィードする方法にもかかわらず、検証の精度を向上させることはできません

  19. 19

    Tensorflowの二項分類トレーニングの損失は減少せず、精度は約50%に留まります

  20. 20

    トレーニングの精度が大幅に向上し、エポック間で損失が発生する原因は何ですか?

  21. 21

    Wekaでのテスト精度とトレーニング時間

  22. 22

    トレーニングの精度は良いが検証の精度は低い

  23. 23

    私はMNISTを99.2%の精度でトレーニングしましたが、予測が間違っています

  24. 24

    Keras分類器の精度は、トレーニング中に着実に増加し、その後0.25(極小値?)に低下します。

  25. 25

    トレーニング時にKerasモデルの精度が常に0になるのはなぜですか?

  26. 26

    トレーニング時にKerasモデルの精度が常に0になるのはなぜですか?

  27. 27

    トレーニング時にKerasモデルの精度が常に0になるのはなぜですか?

  28. 28

    検証の損失と検証の精度はトレーニング中に変更されません

  29. 29

    TensorFlow LSTM:テストの精度が低くなるのに、トレーニングが行われないのはなぜですか?

ホットタグ

アーカイブ