簡體   English   中英

進行多類分類時 model 表現不佳

[英]Poor model performances when doing multi-class classification

語境

我有一個醫學 X 射線數據集( 示例)。 我想訓練一個 model 來識別咬合 潛在值可以是:

  • 普通的
  • 1-2mm
  • 2-4mm
  • [...]
  • 8mm+

試驗結果

我建立了一個 CNN 來處理圖像。 我的問題是,在比較多類圖像時,驗證准確性極低。 我嘗試了不同的組合,結果如下:

| Image       | Val Accuracy |
| ----------- | ------------ |
| A -> B      | 56%          |
| B -> C      | 33%          |
| A -> C      | 75%          |
| A -> B -> C | 17%          |

當我將圖像 1-1 相互比較時,ML 似乎比其他情況下訓練得更好。 為什么會這樣? 我總共有:

  • A 的 1368 張圖片
  • B的1651張圖片
  • C的449張圖片

(我意識到 3.5K 圖像的數據量並不大,但我試圖在下載和訓練更多數據之前先弄清楚 model 的基本原理。我的數據庫只有 17K 圖像)

代碼

我有一個自定義輸入管道並生成一個tf.data.Dataset

print(train_ds)
==> <ParallelMapDataset element_spec=(TensorSpec(shape=(512, 512, 1), dtype=tf.float32, name=None), TensorSpec(shape=(3,), dtype=tf.uint8, name=None))>

這是 CNN 架構:

input_shape = (None, IMG_SIZE, IMG_SIZE, color_channels)
num_classes = len(class_names)

# Pre-processing layers
RESIZED_IMG = 256
resize_and_rescale = tf.keras.Sequential([
  layers.Resizing(RESIZED_IMG, RESIZED_IMG),
  layers.Rescaling(1./255)
])

medium = 0.2
micro = 0.10
data_augmentation = tf.keras.Sequential([
  layers.RandomContrast(medium),
  layers.RandomBrightness(medium),
  layers.RandomRotation(micro, fill_mode="constant"),
  layers.RandomTranslation(micro, micro, fill_mode="constant"),
  layers.RandomZoom(micro, fill_mode="constant"),
])

# Hidden layers
model = Sequential([
  data_augmentation,
  resize_and_rescale,

  Conv2D(16, 3, padding='same', activation='relu'),
  Conv2D(24, 5, padding='same', activation='relu'),
  MaxPooling2D(),

  Flatten(),
  Dense(128, activation='relu'),
  Dense(num_classes, activation='softmax'), 
])

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

model.build(input_shape)
model.summary()

# Start training
epochs = 15
early_stopping_monitor = tf.keras.callbacks.EarlyStopping(
    monitor='val_accuracy',
    restore_best_weights=True,
    patience=7
)
mcp_save = tf.keras.callbacks.ModelCheckpoint(
    '.mdl_wts.hdf5', 
    save_best_only=True, 
    monitor='val_accuracy'
)

history = model.fit(
  batch_train_ds,
  validation_data=batch_val_ds,
  epochs=epochs,
  class_weight=class_weights,
  callbacks=[early_stopping_monitor, mcp_save]
)

我在兩次運行之間唯一改變的是將哪些圖像加載到我的輸入管道中,然后記錄它們的准確性。 我故意讓 CNN 變小,因為我沒有很多數據。

問題

  • 為什么我的 model 在訓練更多課程時表現更差?
  • 我的數據有誤嗎?圖像沒有足夠的決定性信息?
  • 為了訓練像樣的 ML model,我的圖像數量是否太少?
  • 我的 CNN 不夠深,無法進行多類分類嗎?

Model容量

model 過於簡單(只有兩個卷積層)無法處理這些具有復雜結構的圖像。 這兩個卷積層可能能夠識別像線這樣的簡單結構,沒有比這更復雜的了。

model 沒有能力 model 更復雜的結構,例如牙齒和頭骨的不同部分,來決定覆合。 它根本不理解圖像。 將 model 的大小與 ResNet 等模型進行比較。 你會發現它明顯變大了。

數據

正如您所說,您的數據集相對較小。 即使您使用具有足夠能力理解圖像的 model,您的數據集也可能不足以讓 model 進行泛化,反而會過度擬合您的數據。 您可以通過觀察訓練和驗證數據的指標來識別這一點:訓練分數會不斷增加,而驗證分數不會。 這就是所謂的過度擬合。

實際觀點

我建議你使用預訓練的 model。這些模型是在具有數百萬圖像的海量數據集上訓練的,因此它們的泛化能力非常高。 您下載 model 並在您的數據集上對其進行 f.netune。 請參閱Tensorflow 教程,了解如何使用預訓練的 model 並對其進行微調。

從預訓練的 model 開始總是比從頭開始要好。 只有在結果不佳的情況下,我才會繼續訓練自定義 model。

結論

我相信如果您使用預訓練的 model 並對其進行微調,數據集大小就足夠了。 但如果你有更多可用數據,我會考慮使用它。 model 會給你更好的結果。

model 可以執行它的執行可能有很多其他原因,但關於您的第一個問題,我們可能會說您的 model 執行不佳,因為由於數據量,它無法學習多個類的所有復雜性正在提供給它。 對於多 class 分類器,如果您添加更多數據會更好,以便它可以學習增加的復雜性。

當你制作一個二元分類器時,model 更容易學習彼此的區別特征,而多 class 分類器則不能這樣說。

您擁有的數據圖像數量可能不足以進行多分類 model。model 可能在訓練數據集上過度擬合,這就是您在驗證數據集上獲得如此糟糕准確性的原因。 此外,解決方案不僅僅是繼續在數據集中添加圖像,而是要平衡您的數據集,數據集中幾乎沒有不平衡可能會給您的 model 一些改進空間。

model 架構非常小,不適合多 class 分類器。 您深入 model 的數據越多,就需要越大的架構來從數據集中捕獲更多復雜的特征,特別是在多分類 model 中。

  1. 為什么我的 model 在訓練更多課程時表現更差?

答:不,更多的類不會影響 model 的性能

  1. 我的數據有誤嗎?圖像沒有足夠的決定性信息?

回答:是的,你需要平衡你的數據,因為你的數據是不平衡的,你可以這樣做:隨機欠采樣,隨機過采樣,(合成少數)(合並樣本)

  1. 為了訓練像樣的 ML model,我的圖像數量是否太少?

答:是的,考慮數據論證

  1. 我的 CNN 不夠深,無法進行多類分類嗎?

答:你可以go deep,它會提高准確率,然后准確率會再次降低。 所以考慮使用Transfer learning with Re.net

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM