Skip to content

Commit

Permalink
fix: compatible with keras3
Browse files Browse the repository at this point in the history
  • Loading branch information
LongxingTan authored Jan 12, 2025
1 parent 6121307 commit 811d21b
Show file tree
Hide file tree
Showing 37 changed files with 1,483 additions and 316 deletions.
59 changes: 29 additions & 30 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,14 +59,14 @@ import tfts
from tfts import AutoModel, AutoConfig, KerasTrainer

train_length = 24
predict_length = 8
(x_train, y_train), (x_valid, y_valid) = tfts.get_data("sine", train_length, predict_length, test_size=0.2)
predict_sequence_length = 8
(x_train, y_train), (x_valid, y_valid) = tfts.get_data("sine", train_length, predict_sequence_length, test_size=0.2)

model_name_or_path = 'seq2seq'
model_name_or_path = 'seq2seq' # 'wavenet', 'transformer'
config = AutoConfig.for_model(model_name_or_path)
model = AutoModel.from_config(config, predict_length=predict_length)
model = AutoModel.from_config(config, predict_sequence_length=predict_sequence_length)
trainer = KerasTrainer(model)
trainer.train((x_train, y_train), (x_valid, y_valid), epochs=3)
trainer.train((x_train, y_train), (x_valid, y_valid), epochs=15)

pred = trainer.predict(x_valid)
trainer.plot(history=x_valid, true=y_valid, pred=pred)
Expand All @@ -85,17 +85,17 @@ Encoder only model inputs
import numpy as np
from tfts import AutoConfig, AutoModel, KerasTrainer

train_length = 49
predict_length = 10
train_length = 24
predict_sequence_length = 8
n_feature = 2

x_train = np.random.rand(1, train_length, n_feature) # inputs: (batch, train_length, feature)
y_train = np.random.rand(1, predict_length, 1) # target: (batch, predict_length, 1)
y_train = np.random.rand(1, predict_sequence_length, 1) # target: (batch, predict_sequence_length, 1)
x_valid = np.random.rand(1, train_length, n_feature)
y_valid = np.random.rand(1, predict_length, 1)
y_valid = np.random.rand(1, predict_sequence_length, 1)

config = AutoConfig.for_model('rnn')
model = AutoModel.from_config(config, predict_length=predict_length)
model = AutoModel.from_config(config, predict_sequence_length=predict_sequence_length)
trainer = KerasTrainer(model)
trainer.train(train_dataset=(x_train, y_train), valid_dataset=(x_valid, y_valid), epochs=1)
```
Expand All @@ -107,45 +107,46 @@ Encoder-decoder model inputs
import numpy as np
from tfts import AutoConfig, AutoModel, KerasTrainer

train_length = 49
predict_length = 10
train_length = 24
predict_sequence_length = 8
n_encoder_feature = 2
n_decoder_feature = 3

x_train = (
np.random.rand(1, train_length, 1), # inputs: (batch, train_length, 1)
np.random.rand(1, train_length, n_encoder_feature), # encoder_feature: (batch, train_length, encoder_features)
np.random.rand(1, predict_length, n_decoder_feature), # decoder_feature: (batch, predict_length, decoder_features)
np.random.rand(1, predict_sequence_length, n_decoder_feature), # decoder_feature: (batch, predict_sequence_length, decoder_features)
)
y_train = np.random.rand(1, predict_length, 1) # target: (batch, predict_length, 1)
y_train = np.random.rand(1, predict_sequence_length, 1) # target: (batch, predict_sequence_length, 1)

x_valid = (
np.random.rand(1, train_length, 1),
np.random.rand(1, train_length, n_encoder_feature),
np.random.rand(1, predict_length, n_decoder_feature),
np.random.rand(1, predict_sequence_length, n_decoder_feature),
)
y_valid = np.random.rand(1, predict_length, 1)
y_valid = np.random.rand(1, predict_sequence_length, 1)

config = AutoConfig.for_model("seq2seq")
model = AutoModel.from_config(config, predict_length=predict_length)
model = AutoModel.from_config(config, predict_sequence_length=predict_sequence_length)
trainer = KerasTrainer(model)
trainer.train((x_train, y_train), (x_valid, y_valid), epochs=1)
```

```python
# option2: tf.data.Dataset
import numpy as np
import tensorflow as tf
from tfts import AutoConfig, AutoModel, KerasTrainer

class FakeReader(object):
def __init__(self, predict_length):
train_length = 49
def __init__(self, predict_sequence_length):
train_length = 24
n_encoder_feature = 2
n_decoder_feature = 3
self.x = np.random.rand(15, train_length, 1)
self.encoder_feature = np.random.rand(15, train_length, n_encoder_feature)
self.decoder_feature = np.random.rand(15, predict_length, n_decoder_feature)
self.target = np.random.rand(15, predict_length, 1)
self.decoder_feature = np.random.rand(15, predict_sequence_length, n_decoder_feature)
self.target = np.random.rand(15, predict_sequence_length, 1)

def __len__(self):
return len(self.x)
Expand All @@ -161,38 +162,36 @@ class FakeReader(object):
for i in range(len(self.x)):
yield self[i]

predict_length = 10
train_reader = FakeReader(predict_length=predict_length)
predict_sequence_length = 10
train_reader = FakeReader(predict_sequence_length=predict_sequence_length)
train_loader = tf.data.Dataset.from_generator(
train_reader.iter,
({"x": tf.float32, "encoder_feature": tf.float32, "decoder_feature": tf.float32}, tf.float32),
)
train_loader = train_loader.batch(batch_size=1)
valid_reader = FakeReader(predict_length=predict_length)
valid_reader = FakeReader(predict_sequence_length=predict_sequence_length)
valid_loader = tf.data.Dataset.from_generator(
valid_reader.iter,
({"x": tf.float32, "encoder_feature": tf.float32, "decoder_feature": tf.float32}, tf.float32),
)
valid_loader = valid_loader.batch(batch_size=1)

config = AutoConfig.for_model("seq2seq")
model = AutoModel.from_config(config, predict_length=predict_length)
model = AutoModel.from_config(config, predict_sequence_length=predict_sequence_length)
trainer = KerasTrainer(model)
trainer.train(train_dataset=train_loader, valid_dataset=valid_loader, epochs=1)
```

**Prepare custom model config**

```python
import tensorflow as tf
import tfts
from tfts import AutoModel, AutoConfig

config = AutoConfig.for_model('rnn')
print(config)
config.rnn_hidden_size = 128

model = AutoModel.from_config(config, predict_length=7, )
model = AutoModel.from_config(config, predict_sequence_length=7)
```

**Build your own model**
Expand Down Expand Up @@ -222,11 +221,11 @@ from tfts import AutoModel, AutoConfig
def build_model():
train_length = 24
train_features = 15
predict_length = 16
predict_sequence_length = 8

inputs = Input([train_length, train_features])
config = AutoConfig.for_model("seq2seq")
backbone = AutoModel.from_config(config, predict_length=predict_length)
backbone = AutoModel.from_config(config, predict_sequence_length=predict_sequence_length)
outputs = backbone(inputs)
outputs = Dense(1, activation="sigmoid")(outputs)
model = tf.keras.Model(inputs=inputs, outputs=outputs)
Expand Down
60 changes: 30 additions & 30 deletions README_CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,18 +61,19 @@ import tfts
from tfts import AutoModel, KerasTrainer, Trainer, AutoConfig

train_length = 24
predict_length = 8
predict_sequence_length = 8

# 其中,train是包含(x_train, y_train)的tuple, valid包含(x_valid, y_valid)
train, valid = tfts.get_data('sine', train_length, predict_length, test_size=0.2)
config = AutoConfig.for_model("seq2seq")
model = AutoModel.from_config(config, predict_length)
train, valid = tfts.get_data('sine', train_length, predict_sequence_length, test_size=0.2)
config = AutoConfig.for_model("seq2seq") # 'wavenet', 'transformer'
model = AutoModel.from_config(config, predict_sequence_length)

trainer = KerasTrainer(model)
trainer.train(train, valid)
trainer.train(train, valid, epochs=15)

pred = trainer.predict(valid[0])
trainer.plot(history=valid[0], true=valid[1], pred=pred)
plt.show()
```

**训练自己的数据**
Expand All @@ -87,17 +88,17 @@ trainer.plot(history=valid[0], true=valid[1], pred=pred)
import numpy as np
from tfts import AutoConfig, AutoModel, KerasTrainer

train_length = 49
predict_length = 10
train_length = 24
predict_sequence_length = 8
n_feature = 2

x_train = np.random.rand(1, train_length, n_feature)
y_train = np.random.rand(1, predict_length, 1)
y_train = np.random.rand(1, predict_sequence_length, 1)
x_valid = np.random.rand(1, train_length, n_feature)
y_valid = np.random.rand(1, predict_length, 1)
y_valid = np.random.rand(1, predict_sequence_length, 1)

config = AutoConfig.for_model("rnn")
model = AutoModel.from_config(config, predict_length=predict_length)
model = AutoModel.from_config(config, predict_sequence_length=predict_sequence_length)
trainer = KerasTrainer(model)
trainer.train(train_dataset=(x_train, y_train), valid_dataset=(x_valid, y_valid), epochs=1)
```
Expand All @@ -109,44 +110,45 @@ trainer.train(train_dataset=(x_train, y_train), valid_dataset=(x_valid, y_valid)
import numpy as np
from tfts import AutoConfig, AutoModel, KerasTrainer

train_length = 49
predict_length = 10
train_length = 24
predict_sequence_length = 8
n_encoder_feature = 2
n_decoder_feature = 3

x_train = (
np.random.rand(1, train_length, 1),
np.random.rand(1, train_length, n_encoder_feature),
np.random.rand(1, predict_length, n_decoder_feature),
np.random.rand(1, predict_sequence_length, n_decoder_feature),
)
y_train = np.random.rand(1, predict_length, 1)
y_train = np.random.rand(1, predict_sequence_length, 1)
x_valid = (
np.random.rand(1, train_length, 1),
np.random.rand(1, train_length, n_encoder_feature),
np.random.rand(1, predict_length, n_decoder_feature),
np.random.rand(1, predict_sequence_length, n_decoder_feature),
)
y_valid = np.random.rand(1, predict_length, 1)
y_valid = np.random.rand(1, predict_sequence_length, 1)

config = AutoConfig.for_model("seq2seq")
model = AutoModel.from_config(config, predict_length=predict_length)
model = AutoModel.from_config(config, predict_sequence_length=predict_sequence_length)
trainer = KerasTrainer(model)
trainer.train((x_train, y_train), (x_valid, y_valid), epochs=1)
```

```python
# option2
import numpy as np
import tensorflow as tf
from tfts import AutoConfig, AutoModel, KerasTrainer

class FakeReader(object):
def __init__(self, predict_length):
train_length = 49
def __init__(self, predict_sequence_length):
train_length = 24
n_encoder_feature = 2
n_decoder_feature = 3
self.x = np.random.rand(15, train_length, 1)
self.encoder_feature = np.random.rand(15, train_length, n_encoder_feature)
self.decoder_feature = np.random.rand(15, predict_length, n_decoder_feature)
self.target = np.random.rand(15, predict_length, 1)
self.decoder_feature = np.random.rand(15, predict_sequence_length, n_decoder_feature)
self.target = np.random.rand(15, predict_sequence_length, 1)

def __len__(self):
return len(self.x)
Expand All @@ -162,38 +164,36 @@ class FakeReader(object):
for i in range(len(self.x)):
yield self[i]

predict_length = 10
train_reader = FakeReader(predict_length=predict_length)
predict_sequence_length = 10
train_reader = FakeReader(predict_sequence_length=predict_sequence_length)
train_loader = tf.data.Dataset.from_generator(
train_reader.iter,
({"x": tf.float32, "encoder_feature": tf.float32, "decoder_feature": tf.float32}, tf.float32),
)
train_loader = train_loader.batch(batch_size=1)
valid_reader = FakeReader(predict_length=predict_length)
valid_reader = FakeReader(predict_sequence_length=predict_sequence_length)
valid_loader = tf.data.Dataset.from_generator(
valid_reader.iter,
({"x": tf.float32, "encoder_feature": tf.float32, "decoder_feature": tf.float32}, tf.float32),
)
valid_loader = valid_loader.batch(batch_size=1)

config = AutoConfig.for_model("seq2seq")
model = AutoModel.from_config(config, predict_length=predict_length)
model = AutoModel.from_config(config, predict_sequence_length=predict_sequence_length)
trainer = KerasTrainer(model)
trainer.train(train_dataset=train_loader, valid_dataset=valid_loader, epochs=1)
```

**修改模型配置参数**

```python
import tensorflow as tf
import tfts
from tfts import AutoModel, AutoConfig

config = AutoConfig.for_model('rnn')
print(config)
config.rnn_hidden_size = 128

model = AutoModel.from_config(config, predict_length=7, )
model = AutoModel.from_config(config, predict_sequence_length=7)
```

**搭建自己的模型**
Expand All @@ -219,11 +219,11 @@ from tfts import AutoModel, AutoConfig
def build_model():
train_length = 24
train_features = 15
predict_length = 16
predict_sequence_length = 8

inputs = Input([train_length, train_features])
config = AutoConfig.for_model("seq2seq")
backbone = AutoModel.from_config(config, predict_length=predict_length)
backbone = AutoModel.from_config(config, predict_sequence_length=predict_sequence_length)
outputs = backbone(inputs)
outputs = Dense(1, activation="sigmoid")(outputs)
model = tf.keras.Model(inputs=inputs, outputs=outputs)
Expand Down
25 changes: 14 additions & 11 deletions docs/source/quick-start.rst
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ Quick start
1. Installation
--------------------

Install `time series tfts <https://github.com/LongxingTan/Time-series-prediction>`_, follow the installation instructions first
Install `tfts <https://github.com/LongxingTan/Time-series-prediction>`_, follow the installation instructions first

* Python 3.7+
* `TensorFlow 2.x <https://www.tensorflow.org/install/pip>`_ installation instructions
Expand Down Expand Up @@ -37,7 +37,7 @@ You can run it in docker, download the Dockerfile to host server
The general setup for training and testing a model is

#. Build time series 3D training dataset and valid dataset. The shape of input and label are (examples, train_sequence_length, features) and (examples, predict_sequence_length, 1)
#. Instantiate a model using the the ``AutoModel()`` method
#. Instantiate a model using the the ``AutoModel`` method
#. Create a ``Trainer()`` or ``KerasTrainer()`` object. Define the optimizer and loss function in trainer
#. Train the model on the training dataset and check if it has converged with acceptable accuracy
#. Tune the hyper-parameters of the model and training
Expand All @@ -47,17 +47,18 @@ The general setup for training and testing a model is
.. code-block:: python
import tensorflow as tf
import matplotlib.pyplot as plt
import tfts
from tfts import AutoModel, KerasTrainer
from tfts import AutoConfig, AutoModel, KerasTrainer
# load data
train_length = 36
predict_length = 12
train, valid = tfts.load_data('sine', train_length, predict_length)
predict_sequence_length = 12
train, valid = tfts.get_data('sine', train_length, predict_sequence_length)
# build model
model = AutoModel('seq2seq', predict_length=predict_length)
model_name_or_path = 'seq2seq'
config = AutoConfig.for_model(model_name_or_path)
model = AutoModel.from_config(config, predict_sequence_length=predict_sequence_length)
# train
opt = tf.keras.optimizers.Adam(0.003)
Expand All @@ -68,18 +69,19 @@ The general setup for training and testing a model is
# test
trainer.predict(valid[0])
3. Train your first model
------------------------------

3.1 Prepare the data
~~~~~~~~~~~~~~~~~~~~~~~~
After you prepare the raw data, maybe you need preprocess the data.
Before training, ensure your raw data is preprocessed into a 3D format with the shape `(batch_size, train_steps, features)`. Perform any necessary data cleaning, normalization, or transformation steps to ensure the data is ready for training.



3.2 Train the model
~~~~~~~~~~~~~~~~~~~~~~
Always ensure that the input and output data of model layer has been reshaped to a 3-D matrix
3.2 Train the Model
~~~~~~~~~~~~~~~~~~~~~~~~~~
When training the model, use appropriate loss functions, optimizers, and hyperparameters to achieve the best results.


3.3 Evaluate the model
Expand All @@ -88,6 +90,7 @@ Always ensure that the input and output data of model layer has been reshaped to

3.4 Serve the model
~~~~~~~~~~~~~~~~~~~~~~~
Once the model is trained and evaluated, deploy it for inference. Ensure the model is saved in a format compatible with your serving environment (e.g., TensorFlow SavedModel, ONNX, etc.). Set up an API or service to handle incoming requests, preprocess input data, and return predictions in real-time.


.. currentmodule:: tfts
Loading

0 comments on commit 811d21b

Please sign in to comment.