Нет детерминизма с более чем 2 скрытым слоем - PullRequest
0 голосов
/ 10 апреля 2020

Я надеюсь, что вы можете помочь мне с моей проблемой!

Я использую tenorflow 2.1 в сочетании с тензорной доской для GridSearch.

Это конфигурация гиперпараметра и для визуализации в тензорной доске:

# Setup for Hyperparameters (tensorboard)
HP_NUM_UNITS_1 = hp.HParam('num_units_1', hp.Discrete([1600]))
HP_ACTIVATION_1 = hp.HParam('activation_1', hp.Discrete(['relu']))
HP_NUM_UNITS_2 = hp.HParam('num_units_2', hp.Discrete([800]))
HP_ACTIVATION_2 = hp.HParam('activation_2', hp.Discrete(['tanh']))
HP_NUM_UNITS_3 = hp.HParam('num_units_3', hp.Discrete([400]))
HP_ACTIVATION_3 = hp.HParam('activation_3', hp.Discrete(['elu']))

for num_seeds in HP_SEEDS.domain.values:
  for batch_size in HP_BS_PER_GPU.domain.values: 
    for num_units_1 in HP_NUM_UNITS_1.domain.values:
        for activation_1 in HP_ACTIVATION_1.domain.values:
            for num_units_2 in HP_NUM_UNITS_2.domain.values:
                for activation_2 in HP_ACTIVATION_2.domain.values:
                    for num_units_3 in HP_NUM_UNITS_3.domain.values:
                        for activation_3 in HP_ACTIVATION_3.domain.values:
                            for l2_reg_term in HP_L2REG.domain.values:
                                for optimizer in HP_OPTIMIZER.domain.values:
                                    hparams = {    
                                                HP_SEEDS: num_seeds,
                                                HP_BS_PER_GPU: batch_size,
                                                HP_NUM_UNITS_1: num_units_1,
                                                HP_ACTIVATION_1: activation_1,
                                                HP_NUM_UNITS_2: num_units_2,
                                                HP_ACTIVATION_2: activation_2,
                                                HP_NUM_UNITS_3: num_units_3,
                                                HP_ACTIVATION_3: activation_3,
                                                HP_NUM_UNITS_4: num_units_4,
                                                HP_ACTIVATION_4: activation_4,
                                                HP_L2REG: l2_reg_term,
                                                HP_OPTIMIZER: optimizer
                                                }
                                     run_name = "log_run-%s" %(session_num)
                                     print('--- Starting trial: %s' % run_name)                                   
                                     # Define model
                                     model = create_model(hparams)
                                     print({h.name: hparams[h] for h in hparams})
                                     run_dir = os.path.join(log_dir,run_name)
                                     run(model,run_dir, hparams, session_num)

                                     session_num += 1

create_model построить модель в соответствии с приведенными выше hparams:

create_model(hparams):

reset_random_seeds(hparams[HP_SEEDS])

layers = [hparams[HP_NUM_UNITS_1],hparams[HP_NUM_UNITS_2],
          hparams[HP_NUM_UNITS_3]]
activations = [hparams[HP_ACTIVATION_1], hparams[HP_ACTIVATION_2],
               hparams[HP_ACTIVATION_3]]

model = Sequential()    
for i, nodes in enumerate(layers):
        if i == 0:
            model.add(BatchNormalization(axis=1,input_shape=(3200,)))
            model.add(Dense(nodes, activation= activations[i],
                            activity_regularizer= l2(hparams[HP_L2REG])))

        else:
            model.add(BatchNormalization(axis=1))
            model.add(Dense(nodes,activation= activations[i],
                            activity_regularizer= l2(hparams[HP_L2REG]))) 


model.add(BatchNormalization(axis=1))  
model.add(Dense(3,activation= 'softmax',
                activity_regularizer= l2(hparams[HP_L2REG])))


model.compile(optimizer= hparams[HP_OPTIMIZER],
              loss= 'categorical_crossentropy', metrics =['accuracy'])
return model

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

1. Run and 2. Run:
Epoch 00001: val_accuracy improved from -inf to 0.92257, saving model to E:\user\seed_test\20200410- 
140710_checkpoint_test1\checkpoint_run-0\cp.ckpt
383/383 - 11s - loss: 0.2929 - accuracy: 0.8974 - val_loss: 0.2247 - val_accuracy: 0.9226

Когда я запускаю свой код с более чем 2 слоями, например 3 слоями, детерминизм не работает:

1. Run
Epoch 00001: val_accuracy improved from -inf to 0.92308, saving model to E:\user\seed_test\20200410- 
141307_checkpoint_test1\checkpoint_run-0\cp.ckpt
383/383 - 12s - loss: 0.2939 - accuracy: 0.8963 - val_loss: 0.2240 - val_accuracy: 0.9231

2. Run
Epoch 00001: val_accuracy improved from -inf to 0.92217, saving model to E:\user\seed_test\20200410- 
141352_checkpoint_test1\checkpoint_run-0\cp.ckpt
383/383 - 11s - loss: 0.2939 - accuracy: 0.8963 - val_loss: 0.2239 - val_accuracy: 0.9222

Кто-нибудь знает, почему возникает эта проблема?

Если вам нужна дополнительная информация или фрагменты кода, дайте мне знать.

Спасибо!

...