私の深層学習モデルはトレーニングではありません。どうすればトレーニングできますか?

Nov 21 2020

私はKerasにかなり慣れていないので、根本的な誤りを犯した場合は失礼します。したがって、私のモデルには、3つの畳み込み(2D)レイヤーと4つの高密度レイヤーがあり、ドロップアウトレイヤーが点在しています。画像を使用して回帰モデルをトレーニングしようとしています。

X_train.shape =(5164、160、320、3)

y_train.shape =(5164)

from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, Flatten, Conv2D, Activation, MaxPooling2D, Dropout
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.losses import Huber
from tensorflow.keras.optimizers.schedules import ExponentialDecay

model = Sequential()
model.add(Conv2D(input_shape=(160, 320, 3), filters=32, kernel_size=3, padding="valid"))
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Activation('relu'))

model.add(Conv2D(filters=256, kernel_size=3, padding="valid"))
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Activation('relu'))

model.add(Conv2D(filters=512, kernel_size=3, padding="valid"))
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Activation('relu'))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Dense(256))
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Dense(1))

checkpoint = ModelCheckpoint(filepath="./ckpts/model.ckpt", monitor='val_loss', save_best_only=True)
stopper = EarlyStopping(monitor='val_acc', min_delta=0.0003, patience = 10)

lr_schedule = ExponentialDecay(initial_learning_rate=0.1, decay_steps=10000, decay_rate=0.9)
optimizer = Adam(learning_rate=lr_schedule)
loss = Huber(delta=0.5, reduction="auto", name="huber_loss")

model.compile(loss = loss, optimizer = optimizer, metrics=['accuracy'])
model.fit(X_train, y_train, validation_split = 0.2, shuffle = True, epochs = 100, 
          callbacks=[checkpoint, stopper])

model.save('model.h5')

このモデルを実行しようとすると、トレーニング損失は予想どおりに減少し、検証損失は同じ領域でホバリングし、検証精度はまったく同じままです。モデルを改善するための入力を求めているわけではありませんが(自分で行います)、モデルを解放するための支援が必要です。小数点以下第3位でも検証精度の変化を見たいのですが、増減は関係ありません。モデルのスタックを解除するにはどうすればよいですか?

モデルをトレーニングしようとするとどうなるかを示す画像を次に示します。

どんな解決策でも大歓迎です。

回答

Srikesh Nov 21 2020 at 16:04

あなたのモデルは不十分です。これは、密度の高い層とニューロンが不十分なために発生します。アンダーフィッティングを防ぐ方法はたくさんあります。

  1. 畳み込み層と高密度層の数を増やします。

  2. 既存の層のニューロンの数を増やす。

  3. ドロップアウト率を下げます。

  4. 入力レイヤーに入力を与える前に、入力画像のサイズを小さくしてみてください。

SuprateemBanerjee Nov 28 2020 at 02:06

このコードの主な問題はメトリックでした。分類メトリックである精度は、回帰モデルでは機能しません。初期学習率を0.0001に下げることも役に立ちました。

わずかに異なる実装は、ここでより決定的な答えを得ました