Загрузчик данных (несбалансированные классы) для многозадачного обучения - один и тот же ввод, несколько выходов - PullRequest
0 голосов
/ 08 апреля 2020

Я работаю над разработкой модели MTL. В модели есть три задачи: задача1, задача2 и задача3. Классы в этих задачах несбалансированы, и я застрял в том, как я должен выбирать из них, чтобы модель не подходила / не соответствовала.

Задача 1:

Задача 1 имеет 10 классы, которые несбалансированы. enter image description here

Задача 2:

Задача 2 имеет 5 классов, также несбалансированных enter image description here

Task3:

enter image description here

Task3 имеет семь классов, несбалансированных.

Ввод:

Все данные являются входными данными, и одно изображение имеет один класс из задачи 1 и один из задачи 2.

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

def get_data_generator(data, split ,batch_size=16):
data = data.sample(frac=1).reset_index(drop=True)
imagePath = ''
df =''

if split == 'train':
    imagePath = '../MTLData/train/'
    df = data[data.dir == 'train']
elif split == 'test':
    imagePath = '../MTLData/test/'
    df = data[data.dir == 'test']
elif split == 'vald':
    imagePath = '../MTLData/vald/'
    df = data[data.dir == 'vald']

pfrID = len(data.PFRType.unique())
ftID = len(data.FuelType.unique())
noxID = len(data.NOx.unique())
images, pfrs,fts, noxs = [], [], [], []
while True:
    for i in range(0,df.shape[0]):
        r = df.iloc[i]
        file, pfr, ft, nox = r['Image'], r['PFRType'], r['FuelType'], r['NOx']

        im = Image.open(imagePath+file)
        im = im.resize((224, 224))
        im = np.array(im) / 255.0
        images.append(im)

        pfrs.append(to_categorical(pfr, pfrID))
        fts.append(to_categorical(ft, ftID))
        noxs.append(to_categorical(nox, noxID))
        if len(images) >= batch_size:
            yield np.array(images), [np.array(pfrs), np.array(fts),np.array(noxs)]
            images, pfrs, fts, noxs = [], [], [], []

Архитектура:

Я использую VGG16 для этой классификации, и в модели нет выпадающих слоев.

Текущая производительность:

В настоящее время потери при проверке меньше, чем потери при обучении, а точность проверки выше, чем точность при обучении, и результаты не имеют смысла, поскольку к концу обучения места потери при проверке и потери при обучении меняются, что означает потерю при проверке начинает увеличиваться. Вот график тренировок:

enter image description here

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