Почему плохая точность набора данных, когда он используется как для проверки, так и для обучения? - PullRequest
0 голосов
/ 14 марта 2020

Я тренировал модель с ResNet50 и получил удивительную точность 95% на тренировочном наборе. Я взял тот же тренировочный набор для проверки, и точность кажется очень плохой. (<0,05%) </p>

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, 

validation_steps = 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

В чем может быть причина?!

Ответы [ 2 ]

0 голосов
/ 15 марта 2020

не уверен, что именно не так, но это НЕ переусердствующая проблема. Ясно, что ваши данные проверки (такие же, как данные обучения) вводятся неправильно. Во-первых, вы устанавливаете размер пакета проверки = 1, но вы устанавливаете шаги проверки как validation_steps = test_generator.samples // 31). Если test_generator, samples = 1488, то у вас есть 48 шагов, но при размере пакета 1 вы будете проверять только 48 выборок. Вы хотите установить размер пакета и шаги так, чтобы batch_size X validation_steps равнялся общему количеству выборок. Таким образом, вы go через проверку установили ровно один раз. Я также рекомендую установить для тестового генератора shuffle = False. Кроме того, зачем вводить все имена классов? Если у вас есть каталоги ваших классов, помеченные как «самолет», «аэропорт», «baseball_diamond» и т. Д. c, то вам не нужно специально определять поток классов из каталога, что сделает это автоматически. См. Документацию ниже.

классы: Необязательный список подкаталогов классов (например, ['dogs', 'cats']). По умолчанию: нет. Если не предоставлен, список классов будет автоматически выведен из имен / структуры подкаталога в каталоге, где каждый подкаталог будет обрабатываться как отдельный класс (и порядок классов, которые будут сопоставляться с индексами меток, будет alphanumeri c). Словарь, содержащий сопоставление имен классов и индексов классов, можно получить с помощью атрибута class_indices.

Ваши тренировочные данные на самом деле отличаются от ваших тестовых данных, поскольку вы используете увеличение данных в генераторе. Это нормально, это может привести к небольшой разнице между вашим тестом и точностью валидации, но ваша точность валидации должна быть довольно близкой, как только вы получите данные валидации до go в правильном

0 голосов
/ 14 марта 2020

Вы назначили train_set и test_datagen по-разному. В частности, один переворачивается и масштабируется там, где другой нет. Как я уже упоминал в своем комментарии, если это те же данные, они будут иметь одинаковую точность. Вы можете видеть, что модель переоснащается, если вы правильно используете проверку и используете не проверенные данные для проверки. Использование одних и тех же данных всегда даст одинаковую точность для обучения и проверки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...