Талос -> Повышение ошибки AssertionError в пятом раунде сканирования - PullRequest
0 голосов
/ 02 мая 2020

Я хотел бы выполнить поиск по сетке для набора гиперпараметров простой MLP с использованием Talos, но этот процесс вызывает ошибку AssertionError в пятом раунде. Из отчета об ошибке можно сказать, что это как-то связано с измерением массива в какой-то момент. Что не так с кодом ниже?

    p = {'first_neuron': [16, 32, 64, 128],
         'neurons': [0, 16, 32, 64, 128],
         'shapes': ['brick'],
         'batch_size': (20, 150, 10),
         'epochs': (20, 50, 10),
         'dropout': (0, 0.5, 0.1),
         'optimizer': ['Adam', 'Nadam', 'sgd'],
         'losses': [logcosh, binary_crossentropy],
         'activation':[relu, elu]}

    def get_model(x_train, y_train, x_val, y_val, params):

        model = Sequential()
        model.add(Dense(params['first_neuron'], input_dim=x_train.shape[1], activation=params['activation'], kernel_initializer='he_uniform'))
        model.add(BatchNormalization())
        Dropout(params['dropout'])

        model.add(Dense(params['neurons'], activation=params['activation'], kernel_initializer='he_uniform'))
        Dropout(params['dropout'])
        model.add(Dense(params['neurons'], activation=params['activation'], kernel_initializer='he_uniform'))
        Dropout(params['dropout'])

        model.add(Dense(units = 1, activation = 'sigmoid'))

        model.compile(optimizer=params['optimizer'], loss=params['losses'], metrics=['acc'])

        history = model.fit(x_train, y_train, batch_size=params['batch_size'], epochs=params['epochs'], 
                    verbose=0, class_weight=class_weights, validation_data=[x_val, y_val], 
                    callbacks=[early_stopper(epochs=params['epochs'], mode='moderate', monitor='val_loss')])

        return history, model


    parallel_gpu_jobs(0.5)

    search = talos.Scan(X_train, y_train, x_val=X_test, y_val=y_test, model=get_model,
                experiment_name='Trial', params=p, fraction_limit=0.5, round_limit=10)

Ниже приведен полный отчет об ошибке:

      0%|          | 0/12000 [00:00<?, ?it/s]

      0%|          | 1/12000 [00:02<7:13:55,  2.17s/it]

      0%|          | 2/12000 [00:06<9:22:54,  2.81s/it]

      0%|          | 3/12000 [00:16<16:57:41,  5.09s/it]

      0%|          | 4/12000 [00:19<14:22:29,  4.31s/it]

    AssertionError                            Traceback (most recent call last)
    <ipython-input-137-849fb2b77cd3> in <module>
        3 
        4 search = talos.Scan(X_train, y_train, x_val=X_test, y_val=y_test, model=get_model,
  ----> 5                     experiment_name='Trial', params=p, fraction_limit=0.5, round_limit=10)

      ~/anaconda3/lib/python3.7/site-packages/talos/scan/Scan.py in __init__(self, x, y, params, model, experiment_name, x_val, y_val, val_split, random_method, seed, performance_target, fraction_limit, round_limit, time_limit, boolean_limit, reduction_method, reduction_interval, reduction_window, reduction_threshold, reduction_metric, minimize_loss, disable_progress_bar, print_params, clear_session, save_weights)
    194         # start runtime
    195         from .scan_run import scan_run
--> 196         scan_run(self)

   ~/anaconda3/lib/python3.7/site-packages/talos/scan/scan_run.py in scan_run(self)
     24         # otherwise proceed with next permutation
     25         from .scan_round import scan_round
---> 26         self = scan_round(self)
     27         self.pbar.update(1)
     28 

    ~/anaconda3/lib/python3.7/site-packages/talos/scan/scan_round.py in scan_round(self)
     17     # fit the model
     18     from ..model.ingest_model import ingest_model
---> 19     self.model_history, self.round_model = ingest_model(self)
     20     self.round_history.append(self.model_history.history)
     21 

    ~/anaconda3/lib/python3.7/site-packages/talos/model/ingest_model.py in 
    ingest_model(self)
     8                       self.x_val,
     9                       self.y_val,
 --->   10                       self.round_params)

     <ipython-input-135-d170ed910301> in get_model(x_train, y_train, x_val, y_val, params)
     8     model.add(Dense(params['neurons'], activation=params['activation'], 
     kernel_initializer='he_uniform'))
     9     Dropout(params['dropout'])
   ---> 10     model.add(Dense(params['neurons'], activation=params['activation'], 
     kernel_initializer='he_uniform'))
    11     Dropout(params['dropout'])
    12 

     ~/anaconda3/lib/python3.7/site-packages/keras/engine/sequential.py in add(self, layer)
   180                 self.inputs = network.get_source_inputs(self.outputs[0])
   181         elif self.outputs:
   --> 182             output_tensor = layer(self.outputs[0])
   183             if isinstance(output_tensor, list):
   184                 raise TypeError('All layers in a Sequential model '

     ~/anaconda3/lib/python3.7/site-packages/keras/engine/base_layer.py in __call__(self, inputs, **kwargs)
   504             if all([s is not None
   505                     for s in to_list(input_shape)]):
 --> 506                 output_shape = self.compute_output_shape(input_shape)
   507             else:
   508                 if isinstance(input_shape, list):

     ~/anaconda3/lib/python3.7/site-packages/keras/layers/core.py in compute_output_shape(self, input_shape)
   915     def compute_output_shape(self, input_shape):
   916         assert input_shape and len(input_shape) >= 2
 --> 917         assert input_shape[-1]
   918         output_shape = list(input_shape)
   919         output_shape[-1] = self.units

     AssertionError: 
...