Overview
Concrete tool for constructing the DoppelGANger Generator and Discriminator neural networks provided by the gretel-synthetics library.
Description
The DGAN._build() method constructs all neural network components of the model. It creates: (1) additional attribute Output metadata for per-example midpoint/half-range via create_additional_attribute_outputs(), (2) a Generator containing attribute MLP, additional attribute MLP, and feature LSTM sub-networks, (3) a Discriminator for features with 5 layers of 200 units, (4) an optional Discriminator for attributes with the same architecture, (5) noise sampling lambda functions for both attribute and feature noise, and (6) optional LSTM forget gate bias initialization when forget_bias=True.
The Generator class (in torch_modules.py) uses _make_attribute_generator() to build MLP sub-networks with configurable layers of Linear + ReLU + BatchNorm1d + OutputDecoder. The feature generator is an LSTM followed by a SelectLastCell layer and a Merger of sample_len OutputDecoders. The Discriminator class is a straightforward MLP of Linear + ReLU layers ending in a single linear output.
Usage
_build() is called internally either during DGAN.__init__() (when both output params are provided), during the first train_numpy() call (after Output metadata is created from data), or during DGAN.load(). It should not be called directly by users.
Code Reference
Source Location
- Repository: gretel-synthetics
- File:
src/gretel_synthetics/timeseries_dgan/dgan.py
- Lines: 665-777 (_build)
- File:
src/gretel_synthetics/timeseries_dgan/torch_modules.py
- Lines: 166-372 (Generator), 378-408 (Discriminator)
Signature
def _build(
self,
attribute_outputs: Optional[List[Output]],
feature_outputs: List[Output],
):
class Generator(torch.nn.Module):
def __init__(
self,
attribute_outputs: Optional[List[Output]],
additional_attribute_outputs: Optional[List[Output]],
feature_outputs: List[Output],
max_sequence_len: int,
sample_len: int,
attribute_noise_dim: Optional[int],
feature_noise_dim: int,
attribute_num_units: Optional[int],
attribute_num_layers: Optional[int],
feature_num_units: int,
feature_num_layers: int,
):
class Discriminator(torch.nn.Module):
def __init__(self, input_dim: int, num_layers: int = 5, num_units: int = 200):
Import
from gretel_synthetics.timeseries_dgan.dgan import DGAN
from gretel_synthetics.timeseries_dgan.torch_modules import Generator, Discriminator
I/O Contract
Inputs (_build)
| Name |
Type |
Required |
Description
|
| attribute_outputs |
Optional[List[Output]] |
Yes |
Output metadata for attribute variables; None if no attributes
|
| feature_outputs |
List[Output] |
Yes |
Output metadata for feature (time series) variables
|
Inputs (Generator constructor)
| Name |
Type |
Required |
Description
|
| attribute_outputs |
Optional[List[Output]] |
Yes |
Metadata for attribute variables to generate
|
| additional_attribute_outputs |
Optional[List[Output]] |
Yes |
Metadata for additional attribute variables (midpoint/half-range)
|
| feature_outputs |
List[Output] |
Yes |
Metadata for feature variables to generate
|
| max_sequence_len |
int |
Yes |
Length of time series sequences
|
| sample_len |
int |
Yes |
Time steps generated per LSTM cell
|
| attribute_noise_dim |
Optional[int] |
Yes |
Size of attribute noise vector
|
| feature_noise_dim |
int |
Yes |
Size of feature noise vector
|
| attribute_num_units |
Optional[int] |
Yes |
Units per layer in attribute MLP
|
| attribute_num_layers |
Optional[int] |
Yes |
Number of layers in attribute MLP
|
| feature_num_units |
int |
Yes |
Units per LSTM layer
|
| feature_num_layers |
int |
Yes |
Number of LSTM layers
|
Inputs (Discriminator constructor)
| Name |
Type |
Required |
Description
|
| input_dim |
int |
Yes |
Size of input vector (sum of all attribute dims + flattened features)
|
| num_layers |
int |
No (default 5) |
Number of MLP layers
|
| num_units |
int |
No (default 200) |
Units per MLP layer
|
Outputs
| Name |
Type |
Description
|
| (side effects) |
None |
_build sets self.generator, self.feature_discriminator, self.attribute_discriminator, self.attribute_noise_func, self.feature_noise_func, and self.is_built=True on the DGAN instance
|
Usage Examples
Basic Example
import numpy as np
from gretel_synthetics.timeseries_dgan.dgan import DGAN
from gretel_synthetics.timeseries_dgan.config import DGANConfig
# Model is built automatically during first train call
config = DGANConfig(max_sequence_len=20, sample_len=5, epochs=10)
model = DGAN(config)
features = np.random.rand(1000, 20, 2)
model.train_numpy(features=features)
# model.is_built is now True
# model.generator, model.feature_discriminator are now initialized
Pre-built Model Example
from gretel_synthetics.timeseries_dgan.dgan import DGAN
from gretel_synthetics.timeseries_dgan.config import DGANConfig
from gretel_synthetics.timeseries_dgan.transformations import ContinuousOutput
from gretel_synthetics.timeseries_dgan.config import Normalization
config = DGANConfig(max_sequence_len=20, sample_len=5, epochs=10)
# Pre-define outputs to build the model at initialization
attribute_outputs = [
ContinuousOutput("attr0", Normalization.ZERO_ONE,
apply_feature_scaling=True,
apply_example_scaling=False,
global_min=0.0, global_max=1.0)
]
feature_outputs = [
ContinuousOutput("feat0", Normalization.ZERO_ONE,
apply_feature_scaling=True,
apply_example_scaling=True,
global_min=0.0, global_max=100.0)
]
model = DGAN(config, attribute_outputs=attribute_outputs, feature_outputs=feature_outputs)
# model.is_built is True immediately
Related Pages
Implements Principle
Requires Environment
Uses Heuristic