Skip to content

[ENH] Avoid error when n_conv_per_layer results in kernel size 0 for InceptionNetwork #2925

@rc-ig

Description

@rc-ig

Describe the bug

Setting the InceptionTimeRegressor n_conv_per_layer parameter to a value greater than 6 causes an error relating to kernel_size to be raised.
Setting this parameter to a value between 1 and 6 seems to function as expected.

Steps/Code to reproduce the bug

from aeon.regression.deep_learning import InceptionTimeRegressor

from aeon.testing.data_generation import make_example_3d_numpy


X, y = make_example_3d_numpy(
    n_cases=10,
    n_channels=1,
    n_timepoints=12,
    return_y=True,
    regression_target=True,
    random_state=0
)

inctime = InceptionTimeRegressor(
    n_epochs=1,
    batch_size=4,
    n_conv_per_layer=7,
    verbose=1
) 

inctime.fit(X, y)  

Expected results

No error thrown and fitting to proceed.

Actual results

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[2], line 22
      6 X, y = make_example_3d_numpy(
      7     n_cases=10,
      8     n_channels=1,
   (...)     12     random_state=0
     13 )
     15 inctime = InceptionTimeRegressor(
     16     n_epochs=1,
     17     batch_size=4,
     18     n_conv_per_layer=7,
     19     verbose=1
     20 ) 
---> 22 inctime.fit(X, y)  

File .../.venv/lib/python3.11/site-packages/aeon/regression/base.py:100, in BaseRegressor.fit(self, X, y)
     62 """Fit time series regressor to training data.
     63 
     64 Parameters
   (...)     96 ending in "_" and sets is_fitted flag to True.
     97 """
     98 X, y = self._fit_setup(X, y)
--> 100 self._fit(X, y)
    102 # this should happen last
    103 self.is_fitted = True

File .../.venv/lib/python3.11/site-packages/aeon/regression/deep_learning/_inception_time.py:310, in InceptionTimeRegressor._fit(self, X, y)
    276 for n in range(0, self.n_regressors):
    277     rgs = IndividualInceptionRegressor(
    278         n_filters=self.n_filters,
    279         n_conv_per_layer=self.n_conv_per_layer,
   (...)    308         verbose=self.verbose,
    309     )
--> 310     rgs.fit(X, y)
    311     self.regressors_.append(rgs)
    312     gc.collect()

File .../.venv/lib/python3.11/site-packages/aeon/regression/base.py:100, in BaseRegressor.fit(self, X, y)
     62 """Fit time series regressor to training data.
     63 
     64 Parameters
   (...)     96 ending in "_" and sets is_fitted flag to True.
     97 """
     98 X, y = self._fit_setup(X, y)
--> 100 self._fit(X, y)
    102 # this should happen last
    103 self.is_fitted = True

File .../.venv/lib/python3.11/site-packages/aeon/regression/deep_learning/_inception_time.py:669, in IndividualInceptionRegressor._fit(self, X, y)
    667 else:
    668     mini_batch_size = self.batch_size
--> 669 self.training_model_ = self.build_model(self.input_shape_)
    671 if self.save_init_model:
    672     self.training_model_.save(self.file_path + self.init_file_name + ".keras")

File .../.venv/lib/python3.11/site-packages/aeon/regression/deep_learning/_inception_time.py:618, in IndividualInceptionRegressor.build_model(self, input_shape, **kwargs)
    616 self.random_state_ = rng.randint(0, np.iinfo(np.int32).max)
    617 tf.keras.utils.set_random_seed(self.random_state_)
--> 618 input_layer, output_layer = self._network.build_network(input_shape, **kwargs)
    620 output_layer = tf.keras.layers.Dense(1, activation=self.output_activation)(
    621     output_layer
    622 )
    624 model = tf.keras.models.Model(inputs=input_layer, outputs=output_layer)

File .../.venv/lib/python3.11/site-packages/aeon/networks/_inception.py:509, in InceptionNetwork.build_network(self, input_shape, **kwargs)
    506 else:
    507     _use_custom_filters = False
--> 509 x = self._inception_module(
    510     x,
    511     n_filters=self._nb_filters[d],
    512     dilation_rate=self._dilation_rate[d],
    513     kernel_size=self._kernel_size[d],
    514     padding=self._padding[d],
    515     strides=self._strides[d],
    516     activation=self._activation[d],
    517     use_bias=self._use_bias[d],
    518     use_max_pooling=self._use_max_pooling[d],
    519     max_pool_size=self._max_pool_size[d],
    520     n_conv_per_layer=self._nb_conv_per_layer[d],
    521     use_custom_filters=_use_custom_filters,
    522 )
    524 if self.use_residual and d % 3 == 2:
    525     x = self._shortcut_layer(input_res, x, padding=self._padding[d])

File .../.venv/lib/python3.11/site-packages/aeon/networks/_inception.py:317, in InceptionNetwork._inception_module(self, input_tensor, n_filters, dilation_rate, padding, strides, activation, use_bias, kernel_size, n_conv_per_layer, use_max_pooling, max_pool_size, use_custom_filters)
    313 conv_list = []
    315 for i in range(len(kernel_size_s)):
    316     conv_list.append(
--> 317         tf.keras.layers.Conv1D(
    318             filters=n_filters,
    319             kernel_size=kernel_size_s[i],
    320             strides=strides,
    321             dilation_rate=dilation_rate,
    322             padding=padding,
    323             activation="linear",
    324             use_bias=use_bias,
    325         )(input_inception)
    326     )
    328 if use_max_pooling:
    329     max_pool_1 = tf.keras.layers.MaxPool1D(
    330         pool_size=max_pool_size, strides=strides, padding=padding
    331     )(input_tensor)

File .../.venv/lib/python3.11/site-packages/keras/src/layers/convolutional/conv1d.py:115, in Conv1D.__init__(self, filters, kernel_size, strides, padding, data_format, dilation_rate, groups, activation, use_bias, kernel_initializer, bias_initializer, kernel_regularizer, bias_regularizer, activity_regularizer, kernel_constraint, bias_constraint, **kwargs)
     95 def __init__(
     96     self,
     97     filters,
   (...)    113     **kwargs,
    114 ):
--> 115     super().__init__(
    116         rank=1,
    117         filters=filters,
    118         kernel_size=kernel_size,
    119         strides=strides,
    120         padding=padding,
    121         data_format=data_format,
    122         dilation_rate=dilation_rate,
    123         groups=groups,
    124         activation=activation,
    125         use_bias=use_bias,
    126         kernel_initializer=kernel_initializer,
    127         bias_initializer=bias_initializer,
    128         kernel_regularizer=kernel_regularizer,
    129         bias_regularizer=bias_regularizer,
    130         activity_regularizer=activity_regularizer,
    131         kernel_constraint=kernel_constraint,
    132         bias_constraint=bias_constraint,
    133         **kwargs,
    134     )

File .../.venv/lib/python3.11/site-packages/keras/src/layers/convolutional/base_conv.py:117, in BaseConv.__init__(self, rank, filters, kernel_size, strides, padding, data_format, dilation_rate, groups, activation, use_bias, kernel_initializer, bias_initializer, kernel_regularizer, bias_regularizer, activity_regularizer, kernel_constraint, bias_constraint, lora_rank, lora_alpha, **kwargs)
    115 self.filters = filters
    116 self.groups = groups
--> 117 self.kernel_size = standardize_tuple(kernel_size, rank, "kernel_size")
    118 self.strides = standardize_tuple(strides, rank, "strides")
    119 self.dilation_rate = standardize_tuple(
    120     dilation_rate, rank, "dilation_rate"
    121 )

File .../.venv/lib/python3.11/site-packages/keras/src/utils/argument_validation.py:51, in standardize_tuple(value, n, name, allow_zero)
     46 if unqualified_values:
     47     error_msg += (
     48         f", including values {unqualified_values}"
     49         f" that do not satisfy `value {req_msg}`"
     50     )
---> 51     raise ValueError(error_msg)
     53 return value_tuple

ValueError: The `kernel_size` argument must be a tuple of 1 integers. Received kernel_size=0, including values {0} that do not satisfy `value > 0`

Versions

System: python: 3.11.11 (main, Jan 14 2025, 22:49:08) [Clang 19.1.6 ] executable: .../.venv/bin/python machine: Linux-5.15.146.1-microsoft-standard-WSL2-x86_64-with-glibc2.35 Python dependencies: aeon: 1.1.0 pip: None setuptools: 80.9.0 scikit-learn: 1.6.1 numpy: 1.26.4 numba: 0.61.2 scipy: 1.15.3 pandas: 2.2.3

Metadata

Metadata

Assignees

No one assigned

    Labels

    deep learningDeep learning relatedenhancementNew feature, improvement request or other non-bug code enhancementregressionRegression package

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions