Tips for improving multitask learning based on multiple outputs

I'm currently trying to use multi-task learning based on a multi-output model that both allows to get an output for classification and regression. However, at the moment it's staying at around 20% accuracy. I tried out multiple things including choosing multiple loss functions, weighting loss with loss_weights in keras. Further I tried to adapt my Adam optimizer to for different beta_1 and beta_2 values. Since I read that it's better to share more in case of overfitting I tried out the following architecture:

def multitask_model(optimizer='rmsprop', init='glorot_uniform'): 
    ampl_signal = Input(shape=(X_train.shape[1:]))
    phase_signal = Input(shape=(X_train_phase.shape[1:]))
    temp = Input(shape=(1,))
    moist = Input(shape=(1,))
    weight = Input(shape=(1,))    
    
    reg = Concatenate()([ampl_signal, phase_signal])
    clf = Concatenate()([ampl_signal, phase_signal])
    
    concat_signal = Concatenate()([reg,clf])


    x = Permute(dims=(1,2))(concat_signal)
        #x = BatchNormalization()(x)
    
    x = Conv1D(128, 3, activation='LeakyReLU', kernel_initializer='he_uniform')(x) #, input_shape=(None, 3750, n_features)
    x = Conv1D(128, 3, activation='LeakyReLU',  kernel_initializer='he_uniform')(x)
    x = MaxPooling1D(3)(x)
    x = Dropout(0.3)(x)
    
    x = Conv1D(128, 3, activation='LeakyReLU', kernel_initializer='he_uniform')(x) #, input_shape=(None, 3750, n_features)
    x = Conv1D(128, 3, activation='LeakyReLU',  kernel_initializer='he_uniform')(x)
    x = MaxPooling1D(3)(x)
    x = Dropout(0.3)(x)

    x = Conv1D(64, 3, activation='LeakyReLU', kernel_initializer='he_uniform')(x) #, input_shape=(None, 3750, n_features)
    x = Conv1D(64, 3, activation='LeakyReLU',  kernel_initializer='he_uniform')(x)
    x = MaxPooling1D(3)(x)
    x = Dropout(0.3)(x)

    x = Conv1D(64, 3, activation='LeakyReLU', kernel_initializer='he_uniform')(x) #, input_shape=(None, 3750, n_features)
    x = Conv1D(64, 3, activation='LeakyReLU',  kernel_initializer='he_uniform')(x)
    x = MaxPooling1D(3)(x)
    x = Dropout(0.3)(x)
    
    x = Conv1D(32, 3, activation='LeakyReLU', kernel_initializer='he_uniform')(x) #, input_shape=(None, 3750, n_features)
    x = Conv1D(32, 3, activation='LeakyReLU',  kernel_initializer='he_uniform')(x)
    x = MaxPooling1D(3)(x)
    x = Dropout(0.3)(x)
    
    x = Conv1D(32, 3, activation='LeakyReLU', kernel_initializer='he_uniform')(x) #, input_shape=(None, 3750, n_features)
    x = Conv1D(32, 3, activation='LeakyReLU',  kernel_initializer='he_uniform')(x)
    x = MaxPooling1D(3)(x)
    x = Dropout(0.3)(x)
    
    x = GlobalAveragePooling1D()(x)
    concatenated_features = Concatenate()([x,temp,moist, weight])#inputD
    x = Permute(dims=(1,))(concatenated_features)
activation='elu',kernel_initializer='glorot_normal')(x)
    

    classifier=Dense(1,activation='softmax')(x)
    regression=Dense(1,activation='linear')(x)
        
    mdl_classifier = Model(inputs=[ampl_signal, phase_signal, moist,temp, weight], outputs=classifier)
    mdl_regression = Model(inputs=[ampl_signal, phase_signal, moist,temp, weight], outputs=regression)
    mdl = Model(inputs=[mdl_classifier.inputs], outputs=[classifier,regression])

    
    mdl.compile(loss=['binary_crossentropy', 'logcosh'],
              optimizer = Adam(lr=0.0005,clipnorm = 1.,beta_1=0.9, beta_2=0.999, epsilon=0.00000001, amsgrad=True), 

    return mdl #mdl_classifier, mdl_regression

Do you have any other idea what else I could do?

Best regards,

Topic keras tensorflow multitask-learning deep-learning

Category Data Science


There are standard ways to improve any model:

  • More data
  • Better data
  • Hyperparameter search (architecture, loss function, optimizer, different initialization conditions)

About

Geeks Mental is a community that publishes articles and tutorials about Web, Android, Data Science, new techniques and Linux security.