Объединение или объединение моделей в NASNetMobile - PullRequest
0 голосов
/ 27 февраля 2020

Набор данных имеет номера c и данные изображения, и попытка объединения двух сетей глубокого обучения.

Рабочий код

def get_model_classif_nasnet():
    inputs = Input((128, 128, 3))
    base_model = NASNetMobile(include_top=False)#, input_shape=inputs)#, weights=None
    x = base_model(inputs)
    out1 = GlobalMaxPooling2D()(x)
    out2 = GlobalAveragePooling2D()(x)
    out3 = Flatten()(x)
    out = Concatenate(axis=-1)([out1, out2, out3])
    out = Dropout(0.5)(out)
    out = Dense(6, activation="sigmoid", name="3_")(out)
    model = Model(inputs, out)
    model.compile(optimizer=Adam(0.0001), loss=binary_crossentropy, metrics=['acc'])
    model.summary()    
    return model

def data_gen(list_files, id_label_map, batch_size, augment=False):
    seq = get_seq()
    while True:
        shuffle(list_files)
        for batch in chunker(list_files, batch_size):
            X = [_read(train_images_dir+x+'.dcm', (128,128,3) ) for x in batch ] # [cv2.imread(x) for x in batch]
            Y = [id_label_map.get(x) for x in batch]#[id_label_map[get_id_from_file_path(x)] for x in batch]
            if augment:
                X = seq.augment_images(X)
            X = [preprocess_input(x) for x in X]
            #Z = [ (x[3][3],x[2][2],x[1][1]) for x in batch] # Or SomeLogic

            yield np.array(X), np.array(Y) #,np.array(Z)

модель = get_model_classif_na snet ()

batch_size=64
h5_path = "EPOC_1_Feb_25_model.h5"
checkpoint = ModelCheckpoint(h5_path, monitor='val_acc',save_weights_only=True, verbose=1, save_best_only=True, mode='max')

history = model.fit_generator(
    data_gen(train, id_label_map, batch_size, augment=True),
    validation_data=data_gen(train, id_label_map, batch_size),
    epochs=1, verbose=1,
    callbacks=[checkpoint],
    steps_per_epoch=len(train) // batch_size,
    validation_steps=len(train) // batch_size)
model.load_weights(h5_path)

Код попытки

def get_model_classif_nasnet_2():
    inputs = Input((128, 128, 3))
    base_model = NASNetMobile(include_top=False)#, input_shape=inputs)#, weights=None
    x = base_model(inputs)
    out1 = GlobalMaxPooling2D()(x)
    out2 = GlobalAveragePooling2D()(x)
    out3 = Flatten()(x)
    aux_model = Sequential()
    aux_model.add(Dense(3, input_dim=3))
    aux_model.add(Dense(18,activation='relu'))
    aux_model.add(Dropout(0.2))   
    #aux_model=Flatten()(aux_model)
    #out3 = Concatenate([out3,aux_model])
    out = Concatenate()([out1, out2, out3,aux_model]) #aux_model])
    #out = Concatenate([out,aux_model],axis=1) #aux_model])#axis=1
    out = Dropout(0.2)(out)
    out = Dense(6, activation="sigmoid", name="3_")(out)
    model = Model([inputs,numbers], out)

    model.compile(optimizer=Adam(0.0001), loss=binary_crossentropy, metrics=['acc',weighted_loss])#metrics=['acc',weighted_loss]
    model.summary()

    return model
model = get_model_classif_nasnet_2()

Ошибка:

ValueError: Слой flatten_8 был вызван с вводом, который не является символом c тензор. Полученный тип:. Полный ввод: []. Все входы в слой должны быть тензорами

...