AistNET is a framework for simplifying the creation and training of neural networks
Project description
AistNET
AistNET (Aist neural network) is a framework for simplifying the creation and training of neural networks using Python 3.8 and Tensorflow (V. 2.5.0) with maximum flexibility. In context of this tasks AistNET provides interfaces for creating, training and managing trainings of model and to abstracts buildings block for reusability.
Current known issues
- Loading a model is currently only supported on Linux.
Main features which are missing in TensorFlow but are available in AistNet
- Create Model the way you like it: Function, Class Method, Sequential
- Add custom functions and use them without any issue (except callbacks because of tensorflow:36635 issue)
- Automatic saving of all relevant information
- Model: H5 and ProtoBuf version and as JSON definition
- System: from TensorFlow version to used callbacks
- Custom functions are saved along with the model and the system
- Restore where you stopped and resume the training including custom functions
Getting Started
To install the current release use pip:
pip install aistnet
To update AistNET to the latest version, add --upgrade
flag to the above command.
To create your first model such as a Dense-Net or U-NET using AistNET follow the examples:
With Sequential Model
from tensorflow.keras.models import Sequential
from tensorflow.keras import layers
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.losses import BinaryCrossentropy
from aistnet.core.builder import ModelBuilder
linear = Sequential([
layers.Dense(2, activation="relu", name="layer1"),
layers.Dense(3, activation="relu", name="layer2")
])
dims = (28,)
optimizer = Adam()
loss = BinaryCrossentropy()
builder = ModelBuilder(dimension=dims, model=linear,
optimizer=optimizer, loss=loss)
model = builder.finalize()
With Builder Function
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.losses import BinaryCrossentropy
from aistnet.core.builder import ModelBuilder
from aistnet.architectures.unet import cnn_2d_auto_encoder_with_skip
dims = [240, 224, 1]
builder_function = cnn_2d_auto_encoder_with_skip(blocks=2)
optimizer = Adam()
loss = BinaryCrossentropy()
builder = ModelBuilder(dimension=dims, builder=builder_function,
optimizer=optimizer, loss=loss)
model = builder.finalize()
The model can now be trained normally via the TensorFlow api.
Train your model with the Trainer and use the automatic tracing and saving capabilities:
After creation, you can train the model as usually:
import tempfile
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras import layers
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.losses import BinaryCrossentropy
from aistnet.core.builder import ModelBuilder
from aistnet.core.trainer import Trainer
linear = Sequential([
layers.Dense(2, activation="relu", name="layer1"),
layers.Dense(3, activation="relu", name="layer2")
])
dims = (28,)
optimizer = Adam()
loss = BinaryCrossentropy()
builder = ModelBuilder(dimension=dims, model=linear,
optimizer=optimizer, loss=loss)
trainer = Trainer(builder=builder, store_path=tempfile.TemporaryDirectory().name)
trainer.fit(
x=tf.convert_to_tensor([1, 2, 3, 4, 5]),
y=tf.convert_to_tensor([2, 3, 4, 5, 6]),
batch_size=16,
epochs=10,
validation_data=(
tf.convert_to_tensor([1, 2, 3, 4, 5]),
tf.convert_to_tensor([2, 3, 4, 5, 6]),
),
)
This runs the training of the model but also saves metric information, and the model itself to the file system.
Finally, the model can be used or restored like this:
import tempfile
import tensorflow as tf
from aistnet.core.trainer import Trainer
builder, trainer = Trainer.load(tempfile.TemporaryDirectory().name)
trainer.fit(
x=tf.convert_to_tensor([1, 2, 3, 4, 5]),
y=tf.convert_to_tensor([2, 3, 4, 5, 6]),
batch_size=16,
epochs=20,
initial_epoch=10,
validation_data=(
tf.convert_to_tensor([1, 2, 3, 4, 5]),
tf.convert_to_tensor([2, 3, 4, 5, 6]),
),
)
Use your own loss function
AistNET lets you create or own loss function and other custom implementations. It tries to automatically locate them and to save them along with the model and the configuration. Further it restores the custom implementations with the loading of a saved state.
from typing import Tuple
import tempfile
import tensorflow as tf
from tensorflow.keras import layers
from tensorflow.keras.layers import Input, Dense
from aistnet.core.builder import ModelBuilder
from aistnet.core.trainer import Trainer
store_path = tempfile.TemporaryDirectory().name
dims = (1,)
optimizer = "adam"
metrics = ["accuracy"]
def loss(y_true: tf.Tensor, y_pred: tf.Tensor) -> tf.Tensor:
return (y_true - y_pred) ** 2
def build(dimension: Tuple[int]) -> Tuple[layers.Layer, layers.Layer]:
in_ = Input(shape=dimension)
d1 = Dense(12, activation="relu")(in_)
d2 = Dense(8, activation="relu")(d1)
d3 = Dense(1)(d2)
return in_, d3
builder = ModelBuilder(
builder=build, dimension=dims, optimizer=optimizer, loss=loss, metrics=metrics
)
trainer = Trainer(builder=builder, store_path=store_path)
# train and save the state
trainer.fit(
x=tf.convert_to_tensor([1, 2, 3, 4, 5]),
y=tf.convert_to_tensor([2, 3, 4, 5, 6]),
batch_size=16,
epochs=10,
validation_data=(
tf.convert_to_tensor([1, 2, 3, 4, 5]),
tf.convert_to_tensor([2, 3, 4, 5, 6]),
),
)
# load the previous state and continue training in a new session
builder_new, trainer_new = Trainer.load(store_path)
x_true = tf.convert_to_tensor([[1.0]])
x_pred = tf.convert_to_tensor([[1.0]])
# check the reconstucted custom loss function and the previous epoch state
print(builder_new.loss(x_true, x_pred) == loss(x_true, x_pred))
print(trainer_new.run_metadata["epochs"] == 10)
builder_new.model.fit(
x=tf.convert_to_tensor([1, 2, 3, 4, 5]),
y=tf.convert_to_tensor([2, 3, 4, 5, 6]),
batch_size=16,
epochs=20,
initial_epoch=10,
validation_data=(
tf.convert_to_tensor([1, 2, 3, 4, 5]),
tf.convert_to_tensor([2, 3, 4, 5, 6]),
),
)
FAQ
- Why another Tensorflow wrapper?
The reason for AistNET is the simplification of neural networks. It provides functionality to build, parameterize and train models with any architecture. The model can be customized in every way.
- Is there a possibility to use AistNET with other frameworks like PyTorch?
No currently, AistNET only supports Tensorflow. If you want to use PyTorch we recommend PyTorch Lightning, which follows a similar wrapping philosophy.
- Does AistNET support any other model architectures?
For the moment AistNET has a builder function for U-Nets with skip layers. But we are going to extend AistNET step by step.
Contributing
First make sure to read our general contribution guidelines.
In addition to that, the following applies to this repository:
- Due to the focus on performance dependencies (except as bridges to other loggers) are not allowed. IF you have a very good reason to add a dependency please state so in the corresponding issue / pull request.
Licence
Copyright (c) 2020 the original author or authors. DO NOT ALTER OR REMOVE COPYRIGHT NOTICES.
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
Research
If you are going to use this project as part of a research paper, we would ask you to reference this project by citing it.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file aistnet-1.0.0.tar.gz
.
File metadata
- Download URL: aistnet-1.0.0.tar.gz
- Upload date:
- Size: 26.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.8.9
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8828b6c9be2555b16408407b455dc5a1bcac7d3dc2e395ee9b5d94762f5fa413 |
|
MD5 | 0694514dcdd2d4d4e4f20d0a9d79c431 |
|
BLAKE2b-256 | 1bce7876b6f74e99105d1696c55bc2ae0fb45a5a066611c668419391d99e5a57 |
File details
Details for the file aistnet-1.0.0-py3-none-any.whl
.
File metadata
- Download URL: aistnet-1.0.0-py3-none-any.whl
- Upload date:
- Size: 26.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.8.9
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6ac7a5742339fe67155d9268dff980b67ff1a0831ddff2890ccb0309e2b41e7f |
|
MD5 | 8a754c41b4898e30c50b9141353ecc5d |
|
BLAKE2b-256 | 472d5db7f69cc93994bc88a21dd0e0f72233bdd479cb4ea3cf03ca57fc8ffd28 |