Как я могу точно настроить с новым набором данных точно настроенную сеть с Keras? Вход 0 несовместим со слоем выравнивания: ожидаемый min_ndim = 3, найденный ndim = 2 - PullRequest
0 голосов
/ 24 мая 2019

Я испытываю трудности с тонкой настройкой сети, которую я обучал в предварительно подготовленной сети imagnet с помощью keras.

Во-первых, я настроил сеть из 10 классов на предварительно обученный imagenet. Затем я хочу обучить 3 разные сети (каждая с разным выходным размером классов (2,2,6)) на отлаженной модели с 3 классами. И, наконец, объедините эти 3 модели в конечную модель, которая содержит 10 выходных классов. Этакая иерархия для повышения точности.

Я пытался изменить выходные слои, загрузить новую модель и веса, но все равно застрял

def generator(train_data_dir, img_size, batch_size, val_split):

    train_datagen = ImageDataGenerator(validation_split=val_split,rescale=1./255)

    train_generator = train_datagen.flow_from_directory(train_data_dir,target_size=(img_size, img_size),batch_size=batch_size,color_mode='rgb',shuffle=True,subset='training') # set as training data

    validation_generator = train_datagen.flow_from_directory(train_data_dir,target_size=(img_size, img_size),color_mode='rgb',shuffle=False,subset='validation') # set as validation data

    return train_generator, validation_generator

def main():
    IMG_SIZE = 224
    BATCH_SIZE = 32
    VAL_SPLIT = 0.1


    testdir = 'data'
    train_gen, val_gen = generator(testdir,IMG_SIZE, BATCH_SIZE,VAL_SPLIT)
    STEPS_PER_EPOCH = 513 // BATCH_SIZE # SAMPLE SIZE ADD
    VALIDATION_STEPS = 56 // BATCH_SIZE # SAMPLE SIZE ADD


    lr_rate = 0.001
    EPOCHS = 10


    WEIGHT_DECAY = 0.0005

    #Model save
    model_save_file = 'content/weights.009-0.029-0.018.hdf5/base_model_1.h5'


    model = load_model('/content/base_model_1.h5') #this model is trained on different size of classes(trained for 10 classes on pretrained imagenet model)
    model.load_weights('/content/weights.009-0.029-0.018.hdf5') 

    model._layers.pop()

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

    mod_1 = model.layers[-1].output
    mod_1 = Flatten(name='flatten')(mod_1)
    mod_1 = Dropout(0.2)(mod_1)
    mod_1 = Dense(15, activation='relu')(mod_1)
    predictions = Dense(3, activation='softmax', name='pred_age')(mod_1)

    top_model = Model(inputs=model.input, outputs=predictions)

    opt = get_optimizer('adam', lr_rate)
    top_model.compile(loss=['categorical_crossentropy'],
              optimizer=opt,
              metrics=['accuracy','mae'])


    hist = top_model.fit_generator(generator=train_gen,
                               epochs=EPOCHS,
                               steps_per_epoch = STEPS_PER_EPOCH,
                               validation_data=val_gen,
                               validation_steps = VALIDATION_STEPS,
                               verbose=1,
                               callbacks=callbacks)

    top_model.save(model_save_file)



Я получаю следующую ошибку: ValueError: Ввод 0 несовместим с выравниванием слоя: ожидаемый min_ndim = 3, найденный ndim = 2.

Я впервые тренировал 3 разных модели:

model 1 = 3 labels (8,9,10)
model 2 = 2 labels (30,31)
model 3 = 4 labels (80,81,82,83)

Я хотел бы объединить эти 3 модели в окончательную модель с 1 выходом, содержащим 9 меток (8,9,10,30,31,80,81,82,83). Окончательный ввод должен получить 1 входное изображение вместо 3 изображений. Но я все еще застреваю. Я строю некую иерархию, чтобы улучшить точность.

...