簡體   English   中英

驗證准確性低且訓練准確度高-keras imagedatagenerator flow_from_directory類別分類

[英]Low validation accuracy with good training accuracy - keras imagedatagenerator flow_from_directory categorical classification

我正在嘗試使用Keras和ResNet50將Kaggle 10k狗圖像分類為120個品種。 由於Kaggle(14gb ram)的內存限制,我必須使用ImageDataGenerator,該ImageDataGenerator將圖像實時饋送到模型,並且還允許數據擴充。

基本的卷積ResNet50模型:

conv_base = ResNet50(weights='imagenet', include_top=False, input_shape=(224,224, 3))

我的模特:

model = models.Sequential()
model.add(conv_base)
model.add(layers.Flatten())
model.add(layers.Dense(256, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(120, activation='softmax'))

確保只有我最后添加的圖層是可訓練的-因此ResNet50原始權重在訓練過程和編譯模型中不會被修改:

conv_base.trainable = False
model.compile(optimizer=optimizers.Adam(), loss='categorical_crossentropy',metrics=['accuracy'])

Num trainable weights BEFORE freezing the conv base: 216
Num trainable weights AFTER freezing the conv base: 4

最后的模型摘要:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
resnet50 (Model)             (None, 1, 1, 2048)        23587712  
_________________________________________________________________
flatten_1 (Flatten)          (None, 2048)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 256)               524544    
_________________________________________________________________
dropout_1 (Dropout)          (None, 256)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 120)               30840     
=================================================================
Total params: 24,143,096
Trainable params: 555,384
Non-trainable params: 23,587,712
_________________________________________________________________

訓練和驗證目錄每個都有120個子目錄-每個犬種一個。 在這些文件夾中是狗的圖像。 Keras應該使用這些目錄為每個圖像獲取正確的標簽:因此Keras會自動對“ beagle”子目錄中的圖像進行分類-無需進行一次熱編碼或類似的編碼。

train_dir = '../input/dogs-separated/train_dir/train_dir/'
validation_dir = '../input/dogs-separated/validation_dir/validation_dir/'

train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
train_dir,target_size=(224, 224),batch_size=20, shuffle=True)
validation_generator = test_datagen.flow_from_directory(
validation_dir,target_size=(224, 224),batch_size=20, shuffle=True)

Found 8185 images belonging to 120 classes.
Found 2037 images belonging to 120 classes.

為了確保這些類正確且順序正確,我比較了它們的train_generator.class_indices和validation_generator.class_indices-它們是相同的。 訓練模型:

history = model.fit_generator(train_generator,
steps_per_epoch=8185 // 20,epochs=10,
validation_data=validation_generator,
validation_steps=2037 // 20)

請注意,在下面的圖表中,雖然訓練精度按預期提高了-驗證很快就設置在0.008左右,這是1/120 ... RANDOM預測?!

在此處輸入圖片說明

在此處輸入圖片說明

我還用驗證替換了火車,反之亦然-並遇到了同樣的問題:訓練准確性提高了,而驗證准確性卻停留在大約0.008 = 1/120。

任何想法將不勝感激。

我使用了批處理大小 ,發現batch_size = 120(火車中的目錄數以及有效目錄)可以消除上述問題。 現在,我可以愉快地使用數據擴充技術,而不會因為內存問題而使我的Kaggle內核崩潰。 我還是想知道...

在分類分類模式(深度或廣度)下,Keras ImageDataGenerator如何從目錄中采樣圖像?

如果深度是明智的-而不是批處理大小為20,它將進入第一個目錄,例如100張照片(五次),然后移至下一個目錄,以20批為單位,移至下一個目錄...還是廣度?

廣度-最初的20張將是前20個目錄中的一張照片,然后是接下來20個目錄中的一張照片? 當在flow_from _directory和fit_generator中使用時,我在文檔中找不到Keras ImageDataGenerator如何與批處理一起使用。

暫無
暫無

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

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