![](/img/trans.png)
[英]High training accuracy, low validation accuracy CNN binary classification keras
[英]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.