Skip to content

Commit 83e17f1

Browse files
authored
update generation abstract model
1 parent 9b1a746 commit 83e17f1

103 files changed

Lines changed: 3472 additions & 2272 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎CHANGELOG.md‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# Release notes
22

3+
34
## v0.0.22
45

56
- Add typed spatial arrangements and topology inputs to ``TimeSeriesBatch``.
@@ -8,6 +9,18 @@
89
- Preserve shared graph metadata across Keras/``tf.data`` boundaries without
910
copying static topology into every training window.
1011
- Add documented graph builders and a runnable spatial forecasting example.
12+
- Introduce a shared time-axis generation pipeline, typed `GenStep` hooks,
13+
parameter and value processors, stopping criteria, and sample aggregation.
14+
- Resolve decoder capabilities when task models are built. RNN forecasts now
15+
honor declared padding masks for variable-length histories.
16+
- **Checkpoint break:** Transformer causal cached decoding uses decoder format 2.
17+
Legacy decoder checkpoints require migration or retraining; config-based
18+
loaders reject missing or incompatible format markers before loading weights.
19+
This change must ship as a minor release (at least 0.1.0).
20+
- Custom rollout strategies are runtime instances; serialized configs support
21+
only the implemented built-in strategies. Remove unused generation quantiles.
22+
- Use `PointSampler` (`sampler="point"`), `TeacherForcingPolicy`, and
23+
`TimeAxisEngine`.
1124

1225

1326
## v.0.0.15

‎Makefile‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
.PHONY: style test test-warnings docs pre-release help
1+
.PHONY: style test test-coverage test-warnings docs pre-release help
22

33
# Directories to run style checks on
44
CHECK_DIRS := tfts examples tests
@@ -21,6 +21,10 @@ TEST_ENV := TF_ENABLE_ONEDNN_OPTS=0 TF_CPP_MIN_LOG_LEVEL=3 PYTHONWARNINGS=ignore
2121
test: ## Run unit tests without routine TensorFlow/Python warnings
2222
$(TEST_ENV) $(UV_RUN) python -m unittest discover
2323

24+
test-coverage: ## Run unit tests and report branch coverage for the package
25+
$(TEST_ENV) $(UV_RUN) coverage run --branch --source=tfts -m unittest discover
26+
$(UV_RUN) coverage report -m
27+
2428
test-warnings: ## Run unit tests with all warnings and TensorFlow info logs
2529
$(UV_RUN) python -m unittest discover
2630

‎README.md‎

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ predict_sequence_length = 8
6565

6666
model_name_or_path = 'seq2seq' # 'wavenet', 'transformer', 'rnn', 'tcn', 'bert', 'dlinear', 'nbeats', 'informer', 'autoformer'
6767
config = AutoConfig.for_model(model_name_or_path)
68-
model = AutoModelForForecasting.from_config(config, prediction_length=predict_sequence_length)
68+
model = AutoModelForForecasting.from_config(config, output_chunk_length=predict_sequence_length)
6969
trainer = KerasTrainer(model)
7070
trainer.train(
7171
(x_train, y_train),
@@ -80,7 +80,7 @@ trainer.save_model(model_dir)
8080

8181
# Load the model
8282
restored_model = AutoModel.from_pretrained(model_dir, sample_batch=x_valid[:1])
83-
pred = restored_model(x_valid, training=False).numpy()
83+
pred = restored_model(x_valid, training=False).predictions.numpy()
8484
trainer.plot(history=x_valid, true=y_valid, pred=pred)
8585
plt.show()
8686
```
@@ -109,14 +109,14 @@ x_valid = np.random.rand(1, train_length, n_feature)
109109
y_valid = np.random.rand(1, predict_sequence_length, 1)
110110

111111
config = AutoConfig.for_model('rnn')
112-
model = AutoModelForForecasting.from_config(config, prediction_length=predict_sequence_length)
112+
model = AutoModelForForecasting.from_config(config, output_chunk_length=predict_sequence_length)
113113
trainer = KerasTrainer(model)
114114
trainer.train(train_dataset=(x_train, y_train), valid_dataset=(x_valid, y_valid), epochs=1)
115115

116116
model_dir = "./outputs/encoder_only"
117117
trainer.save_model(model_dir)
118118
restored_model = AutoModel.from_pretrained(model_dir, sample_batch=x_valid[:1])
119-
inference = restored_model(x_valid[:1], training=False).numpy()
119+
inference = restored_model(x_valid[:1], training=False).predictions.numpy()
120120
print(inference.shape)
121121
```
122122

@@ -147,14 +147,14 @@ x_valid = {
147147
y_valid = np.random.rand(1, predict_sequence_length, 1)
148148

149149
config = AutoConfig.for_model("seq2seq")
150-
model = AutoModelForForecasting.from_config(config, prediction_length=predict_sequence_length)
150+
model = AutoModelForForecasting.from_config(config, output_chunk_length=predict_sequence_length)
151151
trainer = KerasTrainer(model)
152152
trainer.train((x_train, y_train), (x_valid, y_valid), epochs=1)
153153

154154
model_dir = "./outputs/encoder_decoder"
155155
trainer.save_model(model_dir)
156156
restored_model = AutoModel.from_pretrained(model_dir, sample_batch=x_valid)
157-
inference = restored_model(x_valid, training=False).numpy()
157+
inference = restored_model(x_valid, training=False).predictions.numpy()
158158
print(inference.shape)
159159
```
160160

@@ -203,15 +203,15 @@ valid_loader = tf.data.Dataset.from_generator(
203203
valid_loader = valid_loader.batch(batch_size=1)
204204

205205
config = AutoConfig.for_model("seq2seq")
206-
model = AutoModelForForecasting.from_config(config, prediction_length=predict_sequence_length)
206+
model = AutoModelForForecasting.from_config(config, output_chunk_length=predict_sequence_length)
207207
trainer = KerasTrainer(model)
208208
trainer.train(train_dataset=train_loader, valid_dataset=valid_loader, epochs=1)
209209

210210
model_dir = "./outputs/encoder_decoder_tfdata"
211211
trainer.save_model(model_dir)
212212
inference_inputs = next(iter(valid_loader.take(1)))[0]
213213
restored_model = AutoModel.from_pretrained(model_dir, sample_batch=inference_inputs)
214-
inference = restored_model(inference_inputs, training=False).numpy()
214+
inference = restored_model(inference_inputs, training=False).predictions.numpy()
215215
print(inference.shape)
216216
```
217217

@@ -224,7 +224,7 @@ config = AutoConfig.for_model('rnn')
224224
print(config)
225225
config.rnn_hidden_size = 128
226226

227-
model = AutoModelForForecasting.from_config(config, prediction_length=7)
227+
model = AutoModelForForecasting.from_config(config, output_chunk_length=7)
228228
```
229229

230230
**Build your own model**
@@ -259,12 +259,18 @@ num_train_features = 15
259259
predict_sequence_length = 8
260260

261261
def build_model():
262-
inputs = Input([train_length, num_train_features])
263-
config = AutoConfig.for_model("seq2seq")
264-
backbone = AutoBackbone.from_config(config, prediction_length=predict_sequence_length)
265-
outputs = backbone(inputs)
266-
outputs = Dense(1, activation="sigmoid")(outputs)
267-
model = tf.keras.Model(inputs=inputs, outputs=outputs)
262+
class CustomForecaster(tf.keras.Model):
263+
def __init__(self):
264+
super().__init__()
265+
config = AutoConfig.for_model("seq2seq")
266+
self.backbone = AutoBackbone.from_config(config, output_chunk_length=predict_sequence_length)
267+
self.projection = Dense(1, activation="sigmoid")
268+
269+
def call(self, inputs, training=None):
270+
output = self.backbone(inputs, training=training)
271+
return self.projection(output.native_forecast)
272+
273+
model = CustomForecaster()
268274
model.compile(loss="mse", optimizer="rmsprop")
269275
return model
270276
```

‎README_CN.md‎

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ predict_sequence_length = 8
6868

6969
model_name_or_path = 'seq2seq' # 'wavenet', 'transformer', 'rnn', 'tcn', 'bert', 'dlinear', 'nbeats', 'informer', 'autoformer'
7070
config = AutoConfig.for_model(model_name_or_path)
71-
model = AutoModelForForecasting.from_config(config, prediction_length=predict_sequence_length)
71+
model = AutoModelForForecasting.from_config(config, output_chunk_length=predict_sequence_length)
7272
trainer = KerasTrainer(model)
7373
trainer.train(
7474
(x_train, y_train),
@@ -80,7 +80,7 @@ trainer.train(
8080
model_dir = "./outputs/quickstart_forecasting"
8181
trainer.save_model(model_dir)
8282
restored_model = AutoModel.from_pretrained(model_dir, sample_batch=x_valid[:1])
83-
pred = restored_model(x_valid, training=False).numpy()
83+
pred = restored_model(x_valid, training=False).predictions.numpy()
8484
trainer.plot(history=x_valid, true=y_valid, pred=pred)
8585
plt.show()
8686
```
@@ -108,14 +108,14 @@ x_valid = np.random.rand(1, train_length, n_feature)
108108
y_valid = np.random.rand(1, predict_sequence_length, 1)
109109

110110
config = AutoConfig.for_model("rnn")
111-
model = AutoModelForForecasting.from_config(config, prediction_length=predict_sequence_length)
111+
model = AutoModelForForecasting.from_config(config, output_chunk_length=predict_sequence_length)
112112
trainer = KerasTrainer(model)
113113
trainer.train(train_dataset=(x_train, y_train), valid_dataset=(x_valid, y_valid), epochs=1)
114114

115115
model_dir = "./outputs/encoder_only"
116116
trainer.save_model(model_dir)
117117
restored_model = AutoModel.from_pretrained(model_dir, sample_batch=x_valid[:1])
118-
inference = restored_model(x_valid[:1], training=False).numpy()
118+
inference = restored_model(x_valid[:1], training=False).predictions.numpy()
119119
print(inference.shape)
120120
```
121121

@@ -145,14 +145,14 @@ x_valid = {
145145
y_valid = np.random.rand(1, predict_sequence_length, 1)
146146

147147
config = AutoConfig.for_model("seq2seq")
148-
model = AutoModelForForecasting.from_config(config, prediction_length=predict_sequence_length)
148+
model = AutoModelForForecasting.from_config(config, output_chunk_length=predict_sequence_length)
149149
trainer = KerasTrainer(model)
150150
trainer.train((x_train, y_train), (x_valid, y_valid), epochs=1)
151151

152152
model_dir = "./outputs/encoder_decoder"
153153
trainer.save_model(model_dir)
154154
restored_model = AutoModel.from_pretrained(model_dir, sample_batch=x_valid)
155-
inference = restored_model(x_valid, training=False).numpy()
155+
inference = restored_model(x_valid, training=False).predictions.numpy()
156156
print(inference.shape)
157157
```
158158

@@ -201,15 +201,15 @@ valid_loader = tf.data.Dataset.from_generator(
201201
valid_loader = valid_loader.batch(batch_size=1)
202202

203203
config = AutoConfig.for_model("seq2seq")
204-
model = AutoModelForForecasting.from_config(config, prediction_length=predict_sequence_length)
204+
model = AutoModelForForecasting.from_config(config, output_chunk_length=predict_sequence_length)
205205
trainer = KerasTrainer(model)
206206
trainer.train(train_dataset=train_loader, valid_dataset=valid_loader, epochs=1)
207207

208208
model_dir = "./outputs/encoder_decoder_tfdata"
209209
trainer.save_model(model_dir)
210210
inference_inputs = next(iter(valid_loader.take(1)))[0]
211211
restored_model = AutoModel.from_pretrained(model_dir, sample_batch=inference_inputs)
212-
inference = restored_model(inference_inputs, training=False).numpy()
212+
inference = restored_model(inference_inputs, training=False).predictions.numpy()
213213
print(inference.shape)
214214
```
215215

@@ -222,7 +222,7 @@ config = AutoConfig.for_model('rnn')
222222
print(config)
223223
config.rnn_hidden_size = 128
224224

225-
model = AutoModelForForecasting.from_config(config, prediction_length=7)
225+
model = AutoModelForForecasting.from_config(config, output_chunk_length=7)
226226
```
227227

228228
**搭建自己的模型**
@@ -252,12 +252,18 @@ num_train_features = 15
252252
predict_sequence_length = 8
253253

254254
def build_model():
255-
inputs = Input([train_length, num_train_features])
256-
config = AutoConfig.for_model("seq2seq")
257-
backbone = AutoBackbone.from_config(config, prediction_length=predict_sequence_length)
258-
outputs = backbone(inputs)
259-
outputs = Dense(1, activation="sigmoid")(outputs)
260-
model = tf.keras.Model(inputs=inputs, outputs=outputs)
255+
class CustomForecaster(tf.keras.Model):
256+
def __init__(self):
257+
super().__init__()
258+
config = AutoConfig.for_model("seq2seq")
259+
self.backbone = AutoBackbone.from_config(config, output_chunk_length=predict_sequence_length)
260+
self.projection = Dense(1, activation="sigmoid")
261+
262+
def call(self, inputs, training=None):
263+
output = self.backbone(inputs, training=training)
264+
return self.projection(output.native_forecast)
265+
266+
model = CustomForecaster()
261267
model.compile(loss="mse", optimizer="rmsprop")
262268
return model
263269
```

0 commit comments

Comments
 (0)