簡體   English   中英

當數據集用於驗證和訓練時,為什么它的准確性很差?

[英]Why there's a bad accuracy on dataset when it's used both for validation and training?

我使用 ResNet50 訓練了一個模型,並在訓練集上獲得了 95% 的驚人准確率。 我采用了相同的訓練集進行驗證,但准確率似乎很差。(<0.05%)

from keras.preprocessing.image import ImageDataGenerator

train_set = ImageDataGenerator(horizontal_flip=True,rescale=1./255,shear_range=0.2,zoom_range=0.2).flow_from_directory(data,target_size=(256,256),classes=['airplane','airport','baseball_diamond',
                                                                    'basketball_court','beach','bridge',
                                                                  'chaparral','church','circular_farmland',
                                                                  'commercial_area','dense_residential','desert',
                                                                  'forest','freeway','golf_course','ground_track_field',
                                                                  'harbor','industrial_area','intersection','island',
                                                                  'lake','meadow','medium_residential','mobile_home_park',
                                                                  'mountain','overpass','parking_lot','railway','rectangular_farmland',
                                                                  'roundabout','runway'],batch_size=31)

from keras.applications import ResNet50 
from keras.applications.resnet50 import preprocess_input
from keras import layers,Model

conv_base = ResNet50(
    include_top=False,
    weights='imagenet')


for layer in conv_base.layers:
    layer.trainable = False

x = conv_base.output
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dense(128, activation='relu')(x) 
predictions = layers.Dense(31, activation='softmax')(x)
model = Model(conv_base.input, predictions)

# here you will write the path for train data or if you create your val data then you can test using that too. 
# test_dir = ""
test_datagen = ImageDataGenerator(rescale=1. / 255) 
test_generator = test_datagen.flow_from_directory( 
    data, 
    target_size=(256, 256), classes=['airplane','airport','baseball_diamond',
                                                                    'basketball_court','beach','bridge',
                                                                  'chaparral','church','circular_farmland',
                                                                  'commercial_area','dense_residential','desert',
                                                                  'forest','freeway','golf_course','ground_track_field',
                                                                  'harbor','industrial_area','intersection','island',
                                                                  'lake','meadow','medium_residential','mobile_home_park',
                                                                  'mountain','overpass','parking_lot','railway','rectangular_farmland',
                                                                  'roundabout','runway'],batch_size=1,shuffle=True)

model.compile(loss='categorical_crossentropy',optimizer='Adam',metrics=['accuracy'])
model.fit_generator(train_set,steps_per_epoch=1488//31,epochs=10,verbose=True,validation_data = test_generator, 

驗證步驟 = test_generator.samples // 31)

Epoch 1/10
48/48 [==============================] - 27s 553ms/step - loss: 1.9631 - acc: 0.4825 - val_loss: 4.3134 - val_acc: 0.0208
Epoch 2/10
48/48 [==============================] - 22s 456ms/step - loss: 0.6395 - acc: 0.8212 - val_loss: 4.7584 - val_acc: 0.0833
Epoch 3/10
48/48 [==============================] - 23s 482ms/step - loss: 0.4325 - acc: 0.8810 - val_loss: 5.3852 - val_acc: 0.0625
Epoch 4/10
48/48 [==============================] - 23s 476ms/step - loss: 0.2925 - acc: 0.9153 - val_loss: 6.0963 - val_acc: 0.0208
Epoch 5/10
48/48 [==============================] - 23s 477ms/step - loss: 0.2275 - acc: 0.9341 - val_loss: 5.6571 - val_acc: 0.0625
Epoch 6/10
48/48 [==============================] - 23s 478ms/step - loss: 0.1855 - acc: 0.9489 - val_loss: 6.2440 - val_acc: 0.0208
Epoch 7/10
48/48 [==============================] - 23s 483ms/step - loss: 0.1704 - acc: 0.9543 - val_loss: 7.4446 - val_acc: 0.0208
Epoch 8/10
48/48 [==============================] - 23s 487ms/step - loss: 0.1828 - acc: 0.9476 - val_loss: 7.5198 - val_acc: 0.0417

可能是什么原因?!

您以不同的方式分配了 train_set 和 test_datagen。 特別是一個被翻轉和縮放,而另一個則沒有。 正如我在評論中提到的,如果它是相同的數據,它將具有相同的准確性。 當您正確使用驗證並使用未見過的數據進行驗證時,您會看到模型過度擬合。 使用相同的數據將始終為訓練和驗證提供相同的准確性

不知道到底出了什么問題,但這不是過度擬合的問題。 很明顯,您的驗證數據(與訓練數據相同)沒有正確輸入。 一方面,您將驗證批量大小設置為 =1,但將驗證步驟設置為 validation_steps = test_generator.samples // 31) 。 如果 test_generator,samples = 1488 則您有 48 個步驟,但批量大小為 1 時,您將僅驗證 48 個樣本。 您希望設置批次大小和步驟,以便 batch_size X validation_steps 等於樣本總數。 這樣你就可以通過一次驗證集。 我還建議您為測試生成器設置 shuffle=False。 還有你為什么要輸入所有的類名。 如果您將類目錄標記為“飛機”、“機場”、“baseball_diamond”等,那么您不需要專門定義來自目錄的類流會自動為您執行此操作。 請參閱下面的文檔。

classes:類子目錄的可選列表(例如 ['dogs', 'cats'])。 默認值:無。 如果未提供,將自動從目錄下的子目錄名稱/結構推斷類列表,其中每個子目錄將被視為不同的類(並且將映射到標簽索引的類的順序將是字母數字)。 包含從類名到類索引的映射的字典可以通過屬性 class_indices 獲得。

您的訓練數據實際上與您的測試數據不同,因為您在生成器中使用了數據增強。 沒關系,它可能會導致您的測試和驗證准確度之間存在微小差異,但是一旦您正確輸入驗證數據,您的驗證准確度應該非常接近

暫無
暫無

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

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