def train( self, training_data: Dataset, validation_data: Optional[Dataset] = None, num_workers: Optional[int] = None, num_prefetch: Optional[int] = None, shuffle_buffer_length: Optional[int] = None, **kwargs, ) -> Predictor: has_negative_data = any(np.any(d["target"] < 0) for d in training_data) low = -10.0 if has_negative_data else 0 high = 10.0 bin_centers = np.linspace(low, high, self.num_bins) bin_edges = np.concatenate( [[-1e20], (bin_centers[1:] + bin_centers[:-1]) / 2.0, [1e20]] ) logging.info( f"using training windows of length = {self.train_window_length}" ) transformation = self.create_transformation( bin_edges, pred_length=self.train_window_length ) # ensure that the training network is created within the same MXNet # context as the one that will be used during training with self.trainer.ctx: params = self._get_wavenet_args(bin_centers) params.update(pred_length=self.train_window_length) trained_net = WaveNet(**params) input_names = get_hybrid_forward_input_names(trained_net) training_data_loader = TrainDataLoader( dataset=training_data, transform=transformation + SelectFields(input_names), batch_size=self.batch_size, stack_fn=partial(batchify, ctx=self.trainer.ctx, dtype=self.dtype), num_workers=num_workers, num_prefetch=num_prefetch, shuffle_buffer_length=shuffle_buffer_length, **kwargs, ) validation_data_loader = None if validation_data is not None: validation_data_loader = ValidationDataLoader( dataset=validation_data, transform=transformation, batch_size=self.batch_size, stack_fn=partial( batchify, ctx=self.trainer.ctx, dtype=self.dtype ), num_workers=num_workers, num_prefetch=num_prefetch, **kwargs, ) self.trainer( net=trained_net, train_iter=training_data_loader, validation_iter=validation_data_loader, ) # ensure that the prediction network is created within the same MXNet # context as the one that was used during training with self.trainer.ctx: return self.create_predictor( transformation, trained_net, bin_centers )
def __init__( self, freq: str, prediction_length: int, trainer: Trainer = Trainer( learning_rate=0.01, epochs=200, num_batches_per_epoch=50, hybridize=False, ), cardinality: List[int] = [1], seasonality: Optional[int] = None, embedding_dimension: int = 5, num_bins: int = 1024, hybridize_prediction_net: bool = False, n_residue=24, n_skip=32, dilation_depth: Optional[int] = None, n_stacks: int = 1, train_window_length: Optional[int] = None, temperature: float = 1.0, act_type: str = "elu", num_parallel_samples: int = 200, train_sampler: Optional[InstanceSampler] = None, validation_sampler: Optional[InstanceSampler] = None, batch_size: int = 32, negative_data: bool = False, ) -> None: super().__init__(trainer=trainer, batch_size=batch_size) self.freq = freq self.prediction_length = prediction_length self.cardinality = cardinality self.embedding_dimension = embedding_dimension self.num_bins = num_bins self.hybridize_prediction_net = hybridize_prediction_net self.n_residue = n_residue self.n_skip = n_skip self.n_stacks = n_stacks self.train_window_length = ( train_window_length if train_window_length is not None else prediction_length ) self.temperature = temperature self.act_type = act_type self.num_parallel_samples = num_parallel_samples self.train_sampler = ( train_sampler if train_sampler is not None else ExpectedNumInstanceSampler( num_instances=1.0, min_future=self.train_window_length ) ) self.validation_sampler = ( validation_sampler if validation_sampler is not None else ValidationSplitSampler(min_future=self.train_window_length) ) self.negative_data = negative_data low = -10.0 if self.negative_data else 0 high = 10.0 bin_centers = np.linspace(low, high, self.num_bins) bin_edges = np.concatenate( [[-1e20], (bin_centers[1:] + bin_centers[:-1]) / 2.0, [1e20]] ) self.bin_centers = bin_centers.tolist() self.bin_edges = bin_edges.tolist() seasonality = ( get_seasonality( self.freq, { "H": 7 * 24, "D": 7, "W": 52, "M": 12, "B": 7 * 5, "min": 24 * 60, }, ) if seasonality is None else seasonality ) goal_receptive_length = max( 2 * seasonality, 2 * self.prediction_length ) if dilation_depth is None: d = 1 while ( WaveNet.get_receptive_field( dilation_depth=d, n_stacks=n_stacks ) < goal_receptive_length ): d += 1 self.dilation_depth = d else: self.dilation_depth = dilation_depth self.context_length = WaveNet.get_receptive_field( dilation_depth=self.dilation_depth, n_stacks=n_stacks ) self.logger = logging.getLogger(__name__) self.logger.info( f"Using dilation depth {self.dilation_depth} and receptive field length {self.context_length}" )
def __init__( self, freq: str, prediction_length: int, trainer: Trainer = Trainer( learning_rate=0.01, epochs=200, num_batches_per_epoch=50, hybridize=False, ), cardinality: List[int] = [1], seasonality: Optional[int] = None, embedding_dimension: int = 5, num_bins: int = 1024, hybridize_prediction_net: bool = False, n_residue=24, n_skip=32, dilation_depth: Optional[int] = None, n_stacks: int = 1, train_window_length: Optional[int] = None, temperature: float = 1.0, act_type: str = "elu", num_parallel_samples: int = 200, train_sampler: InstanceSampler = ExpectedNumInstanceSampler(1.0), batch_size: int = 32, ) -> None: """ Model with Wavenet architecture and quantized target. :param freq: :param prediction_length: :param trainer: :param num_eval_samples: :param cardinality: :param embedding_dimension: :param num_bins: Number of bins used for quantization of signal :param hybridize_prediction_net: :param n_residue: Number of residual channels in wavenet architecture :param n_skip: Number of skip channels in wavenet architecture :param dilation_depth: number of dilation layers in wavenet architecture. If set to None, dialation_depth is set such that the receptive length is at least as long as 2 * seasonality for the frequency and at least 2 * prediction_length. :param n_stacks: Number of dilation stacks in wavenet architecture :param train_window_length: Length of windows used for training. This should be longer than prediction length. Larger values result in more efficient reuse of computations for convolutions. :param temperature: Temparature used for sampling from softmax distribution. For temperature = 1.0 sampling is according to estimated probability. :param act_type: Activation type used after before output layer. Can be any of 'elu', 'relu', 'sigmoid', 'tanh', 'softrelu', 'softsign' """ super().__init__(trainer=trainer, batch_size=batch_size) self.freq = freq self.prediction_length = prediction_length self.cardinality = cardinality self.embedding_dimension = embedding_dimension self.num_bins = num_bins self.hybridize_prediction_net = hybridize_prediction_net self.n_residue = n_residue self.n_skip = n_skip self.n_stacks = n_stacks self.train_window_length = ( train_window_length if train_window_length is not None else prediction_length ) self.temperature = temperature self.act_type = act_type self.num_parallel_samples = num_parallel_samples self.train_sampler = train_sampler seasonality = ( get_seasonality( self.freq, { "H": 7 * 24, "D": 7, "W": 52, "M": 12, "B": 7 * 5, "min": 24 * 60, }, ) if seasonality is None else seasonality ) goal_receptive_length = max( 2 * seasonality, 2 * self.prediction_length ) if dilation_depth is None: d = 1 while ( WaveNet.get_receptive_field( dilation_depth=d, n_stacks=n_stacks ) < goal_receptive_length ): d += 1 self.dilation_depth = d else: self.dilation_depth = dilation_depth self.context_length = WaveNet.get_receptive_field( dilation_depth=self.dilation_depth, n_stacks=n_stacks ) self.logger = logging.getLogger(__name__) self.logger.info( f"Using dilation depth {self.dilation_depth} and receptive field length {self.context_length}" )
def __init__( self, freq: str, prediction_length: int, trainer: Trainer = Trainer( learning_rate=0.01, epochs=200, num_batches_per_epoch=50, hybridize=False, ), cardinality: List[int] = [1], embedding_dimension: int = 5, num_bins: int = 1024, hybridize_prediction_net: bool = False, n_residue=24, n_skip=32, dilation_depth: Optional[int] = None, n_stacks: int = 1, temperature: float = 1.0, act_type: str = "elu", num_parallel_samples: int = 200, ) -> None: super().__init__(trainer=trainer) self.freq = freq self.prediction_length = prediction_length self.cardinality = cardinality self.embedding_dimension = embedding_dimension self.num_bins = num_bins self.hybridize_prediction_net = hybridize_prediction_net self.n_residue = n_residue self.n_skip = n_skip self.n_stacks = n_stacks self.temperature = temperature self.act_type = act_type self.num_parallel_samples = num_parallel_samples seasonality = _get_seasonality(self.freq, { "H": 7 * 24, "D": 7, "W": 52, "M": 12, "B": 7 * 5 }) goal_receptive_length = max(seasonality, 2 * self.prediction_length) if dilation_depth is None: d = 1 while (WaveNet.get_receptive_field(dilation_depth=d, n_stacks=n_stacks) < goal_receptive_length): d += 1 self.dilation_depth = d else: self.dilation_depth = dilation_depth self.context_length = WaveNet.get_receptive_field( dilation_depth=self.dilation_depth, n_stacks=n_stacks) self.logger = logging.getLogger(__name__) self.logger.info( f"Using dilation depth {self.dilation_depth} and receptive field length {self.context_length}" )