Я хотел бы выполнить поиск по сетке для набора гиперпараметров простой 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: