Обучение классификатора изображений с более чем 300 000 классов - PullRequest
0 голосов
/ 16 апреля 2020

Можно ли обучить сеть классификаторов изображений с помощью огромного количества классов? (скажем, 300 тыс. классов), при этом каждый класс имеет не менее 10 изображений, разделенных между поездом / тестом / проверкой (ie.> 3 миллиона 250x250x3 изображений).

Я попытался обучить набор данных с помощью ResNet50 смоделируйте и уменьшите размер партии до 1, но все еще сталкивались с проблемами OOM (2080 Ti). Я обнаружил, что OOM вызвано слишком большим количеством параметров и ... go Я прибег к попытке обучить сеть на чрезвычайно базовой c 10-слойной модели с размером пакета 1. Он работает, но скорость / точность неудивительно, что неудивительно.

Могу ли я в любом случае разделить тренировочные наборы на более мелкие секции классов, например:

1-е .h5 = классы 1 ~ 20 000 * 1007? *

2nd .h5 = классы 20,001 ~ 40,000

3-й .h5 = классы 40,001 ~ 60,000 и т. Д. c.

, а затем объединены в один файл h5, который можно загрузить распознать все 300 000 различных классов?


РЕДАКТИРОВАТЬ В АШИ SH ПРЕДЛОЖЕНИЕ:

Я (я думаю) успешно объединил 2 модели в одну, но объединенная модель имеет несколько увеличилось вдвое количество слоев ...

Исходный код:

model1 = load_model('001.h5')
model2 = load_model('002.h5')

for layer in model1.layers:
    layer._name = layer._name + "_1" # avoid duplicate layer names, which would otherwise throw an error
    layer.trainable = False

for layer in model2.layers:
    layer._name = layer._name + "_2"
    layer.trainable = False

x1 = model1.layers[-1].output
classes = x1.shape[1]
x1 = Dense(classes, activation='relu', name='out1')(x1)

x2 = model2.layers[-1].output
x2 = Dense(x2.shape[1], activation='relu', name='out2')(x2)
classes += x2.shape[1]

x = concatenate([x1, x2])
output_layer = Dense(classes, activation='softmax', name='combined_layer')(x)
new_model = Model(inputs=[model1.inputs, model2.inputs], outputs=output_layer)
new_model.summary()
new_model.save('new_model.h5', overwrite=True)

И полученная модель выглядит так:

Model: "model"
_________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
=========================================================================
input_1_1 (InputLayer)          [(None, 224, 224, 3) 0                                            
_________________________________________________________________________
input_1_2 (InputLayer)          [(None, 224, 224, 3) 0                                            
_________________________________________________________________________
conv1_pad_1 (ZeroPadding2D)     (None, 230, 230, 3)  0           input_1_1[0][0]                  
_________________________________________________________________________
conv1_pad_2 (ZeroPadding2D)     (None, 230, 230, 3)  0           input_1_2[0][0]                  
_________________________________________________________________________
conv1_conv_1 (Conv2D)           (None, 112, 112, 64) 9472        conv1_pad_1[0][0]                
_________________________________________________________________________
conv1_conv_2 (Conv2D)           (None, 112, 112, 64) 9472        conv1_pad_2[0][0]                

...

...

conv5_block3_out_1 (Activation) (None, 7, 7, 2048)   0           conv5_block3_add_1[0][0]         
_________________________________________________________________________
conv5_block3_out_2 (Activation) (None, 7, 7, 2048)   0           conv5_block3_add_2[0][0]         
_________________________________________________________________________
avg_pool_1 (GlobalAveragePoolin (None, 2048)         0           conv5_block3_out_1[0][0]         
_________________________________________________________________________
avg_pool_2 (GlobalAveragePoolin (None, 2048)         0           conv5_block3_out_2[0][0]         
_________________________________________________________________________
probs_1 (Dense)                 (None, 953)          1952697     avg_pool_1[0][0]                 
_________________________________________________________________________
probs_2 (Dense)                 (None, 3891)         7972659     avg_pool_2[0][0]                 
_________________________________________________________________________
out1 (Dense)                    (None, 953)          909162      probs_1[0][0]                    
_________________________________________________________________________
out2 (Dense)                    (None, 3891)         15143772    probs_2[0][0]                    
_________________________________________________________________________
concatenate (Concatenate)       (None, 4844)         0           out1[0][0]                       
                                                                 out2[0][0]                       
_________________________________________________________________________
combined_layer (Dense)          (None, 4844)         23469180    concatenate[0][0]                
=========================================================================
Total params: 96,622,894
Trainable params: 39,522,114
Non-trainable params: 57,100,780

Как видите, все слои были удвоены из-за модели (входы = [вход1, вход2 ]). Это вызовет у меня проблемы позже, когда я захочу использовать эту модель для прогнозирования изображений. Есть ли в любом случае я могу сделать это, не удваивая все предыдущие слои и просто добавить конечные плотные слои? С такой скоростью я буду перегружен количеством параметров даже быстрее, чем раньше ...

1 Ответ

0 голосов
/ 16 апреля 2020

технически это возможно, так что вы можете сделать, так как у вас есть 3 классификатора (1.h5,2.h5,3.h5), вы можете загрузить эти модели с их весами и затем использовать функциональный API в тензорном потоке https://www.tensorflow.org/guide/keras/functional, где API concatenate () объединит выходные данные трех классификаторов в один вектор, а затем использует несколько плотных сетей с функцией активации для окончательного прогноза.

...