2017-12-29 2 views
1

3000 개의 이미지 (320 * 320) 모양과 촬영 시간 및 라벨이 있습니다. 이제이 두 가지 유형의 데이터 (이미지 및 시간)를 사용하여 라벨을 예측하고 싶습니다. 주요 코드는 다음과 같이케라 (keras) 있음, 다른 유형의 여러 입력 데이터를 맞추는 방법

model.fit([main_input, additional_data], [labels], 
     epochs=50, batch_size=32) 

그러나, 어떻게 데이터 augumention를 사용하기 때문에 두 fit_generator를 사용하고도 시간 기능을 사용하려면 :

num_classes=10 
image_out=GlobalMaxPooling2D()(x) 
x=keras.layers.advanced_activations.LeakyReLU(alpha=0.3)(x) 

#add time 
time_input = Input(shape=(1,), name='time_input') 
x = keras.layers.concatenate([image_out, time_input],axis=-1) 
x=Dense(num_classes, activation='sigmoid')(x) 
predictions = Dense(num_classes,activation='softmax',name='main_output')(x) 

은 내가 모델을 양성하는 코드를 다음 사용할 수 있습니다 알고 모델 훈련? 이런 새로운 발전기를 정의해야합니까?

def generator_for2img(X1, X2, Y,batch_size): 
    datagen = ImageDataGenerator(featurewise_center=False, # set input mean to 0 over the dataset 
           samplewise_center=False, # set each sample mean to 0 
           featurewise_std_normalization=False, # divide inputs by std of the dataset 
           samplewise_std_normalization=False, # divide each input by its std 
           zca_whitening=False, # apply ZCA whitening 
           rotation_range=0, # randomly rotate images in the range (degrees, 0 to 180) 
           width_shift_range=0.1, # randomly shift images horizontally (fraction of total width) 
           height_shift_range=0.1, # randomly shift images vertically (fraction of total height) 
           horizontal_flip=True, # randomly flip images 
           vertical_flip=False) # randomly flip image 
    time_generator=Generator() 
    datagen.fit(X1) 
    genX1 = datagen.flow(X1,Y,batch_size=batch_size) 
    genX2 = time_generator.flow(X2,batch_size=batch_size) 
    while True: 
      X1i = genX1.next() 
      X2i = genX2.next() 
      yield [X1i[0], X2i ], X1i[1] 

model.fit_generator(generator_for2img(X_train_cv, X_train_time, y_train_cv,batch_size), 
            epochs=epochs, 
            validation_data=([X_valid,X_valid_time],y_valid), 
            workers=4, 

답변

0

나는 최근에 매우 비슷한 문제에 직면했다. CNN에서 이미지를 분류하고 있었지만 분류 프로세스에서 이미지의 전체적인 기능을 포함하고자했습니다. 필자는 이러한 기능을 사전 계산 한 다음 늦게 융합 (즉, softmax 계층에서 병합)하여 네트워크에 포함하려고했습니다. Keras의 ImageDataGenerator를 사용하는 것 외에도 3 개의 생성기 (실제로는 2로 줄일 수 있음)를 작성해야한다는 것을 알게되었습니다. 다음은 이러한 생성기를 포함하는 기능입니다. x_train_feat 및 x_test_feat는 전역 ("normal") 피쳐를 나타내는 반면 입력 x_train 및 x_test는 이미지 입력입니다.

def train_model(model, x_train, x_train_feat, y_train, x_test, x_test_feat, y_test, train_batch_size, test_batch_size, epochs, model_dir, model_name, num_classes, patience=5, monitor='val_acc'): 

    ''' 
    Training function 
    ''' 

    train_datagen = ImageDataGenerator(
     featurewise_center=False, # also use in test gen if activated AND fit test_gen on train data 
     samplewise_center=False, 
     featurewise_std_normalization=False, # also use in test gen if activated AND fit test_gen on train data 
     samplewise_std_normalization=False, 
     zca_whitening=False, 
     zca_epsilon=0, 
     rotation_range=0.05, 
     width_shift_range=0.05, 
     height_shift_range=0.05, 
     channel_shift_range=0, 
     fill_mode='nearest', 
     cval=0, 
     vertical_flip=False, 
     rescale=1./255, 
     shear_range=0., 
     zoom_range=0., 
     horizontal_flip=False) 

    train_datagen.fit(x_train) 

    test_datagen = ImageDataGenerator(
     rescale=1./255, 
     featurewise_std_normalization=False, 
     featurewise_center=False) 

    #test_datagen.fit(x_train) 

    train_generator = train_datagen.flow(
     x_train, 
     y_train, 
     batch_size=train_batch_size, 
     shuffle=False) 

    def train_feat_gen(x_train_feat, train_batch_size): 
     while True: 
      for batch in range(len(x_train_feat) // train_batch_size + 1): 
       if batch > max(range(len(x_train_feat) // train_batch_size)): 
        yield x_train_feat[batch*train_batch_size:] 
       else: 
        yield x_train_feat[batch*train_batch_size:(1+batch)*train_batch_size] 

    def val_feat_gen(x_val_feat, test_batch_size): 
     while True: 
      for batch in range(len(x_val_feat) // test_batch_size + 1): 
       if batch > max(range(len(x_val_feat) // test_batch_size)): 
        yield x_val_feat[batch*test_batch_size:] 
       else: 
        yield x_val_feat[batch*test_batch_size:(1+batch)*test_batch_size] 

    def merge_generator(gen1, gen2): 
     while True: 
      X1 = gen1.__next__() 
      X2 = gen2.__next__() 
      yield [X1[0], X2], X1[1] 

    validation_generator = test_datagen.flow(
     x_test, 
     y_test, 
     batch_size=test_batch_size) 

    final_train_gen = merge_generator(train_generator, train_feat_gen(x_train_feat, train_batch_size)) 
    final_val_gen = merge_generator(validation_generator, val_feat_gen(x_val_feat, test_batch_size)) 

    callbacks = [ModelCheckpoint(MODEL_DIR+model_name+'.h5', 
           monitor=monitor, 
           save_best_only=True), 
       EarlyStopping(monitor=monitor, patience=patience), 
       TensorBoard(LOG_DIR+model_name+'_'+str(time())), 
       ReduceLROnPlateau(monitor='val_loss', factor=0.75, patience=2)] 

    model.fit_generator(
     final_train_gen, 
     steps_per_epoch=len(x_train) // train_batch_size, 
     epochs=epochs, 
     validation_data=final_val_gen, 
     validation_steps=len(y_test) // test_batch_size, 
     callbacks=callbacks,) 

발전기 train_feat_gen, val_feat_gen 및 merge_generator에 주목하십시오. 처음 두 개는 훈련 및 유효성 검사 데이터의 일괄 처리를 처리하는 반면 후자는 두 개의 생성기 (train_feat_gen 및 train_datagen, val_feat_gen 및 test_datagen)를 래핑하여 다른 유형의 두 입력을 제공하는 하나의 생성기를 생성합니다. 물론 train_feat_gen과 val_feat_gen을 모두 갖는 것은 본질적으로 동일하지만 다른 매개 변수로 인스턴스화되기 때문에 여기서 중복됩니다. 그러나, 나는이 사건이 그것을 더 명백하게 만든다고 생각한다. 희망이 도움이됩니다.

관련 문제