簡體   English   中英

用於二元分類的CNN模型

[英]CNN model for binary classification

我們是數據科學(和編程)的新手,我們正在嘗試建立一個用於二元分類(男性 - 女性)的 cnn 模型。 我們的准確度足夠好,為 0.97,但驗證准確度為 0.56(我們認為存在過度擬合)。 我們有 4706 張圖像——70% 用於訓練,30% 用於測試/驗證。

model = Sequential()
model.add(Conv2D(128, (3, 3), input_shape=x_data_np.shape[1:]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(16, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(64))
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

我們如何提高驗證准確性? 我們是否正確設置了模型參數? 非常感謝。

你似乎過度擬合了大量。 您的數據集非常小,而且您使用的層太多,既沒有 dropout 也沒有批量歸一化。

我建議四種方法來解決這個問題:

1. 使用Dropout

Dropout 以一定的概率隨機關閉神經元(通常值在 0.1-0.4 范圍內)。 這是減少過度擬合的好方法。

# The dropout probability should be tuned.
keras.layers.Dropout(0.3)

Dropout 層通常被添加到網絡的頂層(即,較晚的)層。 輟學概率本身是一個可以調整的超參數。

2. 執行數據增強

數據增強是一種人為地增加數據量的技術。 它執行諸如移位、剪切、旋轉和鏡像等變換。 Keras 提供了ImageDataGenerator類來非常輕松地處理這個問題。

將您的數據組織到訓練、驗證和測試目錄中。 每個目錄必須包含兩個類的子目錄 - 男性和女性。

目錄樹將如下所示(假設您正在對男性和女性進行二元分類):

.
├── test
│   ├── male
│   └── female
├── train
│   ├── male
│   └── female
└── validation
    ├── male
    └── female

然后初始化用於訓練和測試的數據生成器,如果需要,將圖像從 0-255 重新縮放到 0-1 范圍。

# Performing data augmentation only on the training set.
train_datagen = keras.preprocessing.image.ImageDataGenerator(
    rescale=1./255
    # Performing data augmentation
    rotation_range=20,
    width_shift_range=0.1,
    height_shift_range=0.1,
    shear_range=10,
    horizontal_flip=True, # Horizontally flipped version is still an image of a person.
)
# Data generator for validation and testing.
test_datagen = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)

然后從flow_from_directory方法批量讀取訓練、驗證和測試圖像。

train = train_datagen.flow_from_directory('data/train', target_size=(128, 128), batch_size=32)
validation = test_datagen.flow_from_directory('data/validation', target_size=(128, 128), batch_size=32)
test = test_datagen.flow_from_directory('data/test', target_size=(128, 128), batch_size=32)

一旦你執行了上面的代碼,確保它告訴你它找到了正確數量的圖像和正確數量的類。

然后,您可以將trainvalidationtest批次直接傳遞給 keras 模型中的fit方法。 確保在訓練時指定steps_per_epochvalidation_steps的數量 這是因為生成器永遠運行,不斷地生成圖像,所以fit需要知道什么時候停止。 出於同樣的原因,請確保您也為predict方法提供了steps參數。

參考: Keras 文檔

3.使用提前停止

當驗證准確性開始增加時,進行回調以停止。 還要制作學習曲線(訓練和驗證損失與 epoch 的關系圖)來檢查您的模型從哪里開始過度擬合。

callback = keras.callbacks.EarlyStopping()

您可以將參數傳遞給回調。 檢查文檔。

參考: Keras 文檔

將此回調與其他回調一起傳遞給列表中模型的fit方法。

4. 使用批量歸一化

添加批量歸一化層也有助於減少過度擬合。

我將首先在每個但最后一個激活層之后添加BatchNormalization層。 這將增強正則化,並有望提高驗證准確性。

看起來您的模型存在過度擬合的問題。 考慮為您的模型添加正則化。 嘗試在 Dense(64) 層之后添加 Dropout 層或向 Dense 層添加 l2 正則化。 如果這對嘗試數據增強沒有幫助,如果你還沒有這樣做的話。

此時,您可能應該通過調整超參數(最后一層的神經元數量、層數、內核大小、內核數量等)來迭代改進模型。

暫無
暫無

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

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