Autograd, свёртки, квантизация, ансамбли. Всё написано руками на NumPy. Не обёртка над PyTorch, а способ понять, как он работает внутри.
from tinytensor.models import LeNet from tinytensor.optim import AdamW from tinytensor.nn import CrossEntropyLoss model = LeNet(num_classes=10, in_channels=1) model.compile(lambda p: AdamW(p, lr=1e-3), CrossEntropyLoss()) model.fit(x_train, y_train, epochs=10, validation_data=(x_test, y_test)) acc = (model.predict(x_test) == y_test).mean()
От autograd до развёртывания на edge-устройствах.
Backprop по графу. Пишешь loss.backward() — градиенты текут сами.
Conv2d, BatchNorm, пулинг, ResidualBlock. Готовые LeNet, ResNet, VGG.
Симметричная per-channel. Сжатие вчетверо вызовом .quant().
Режет нейроны по важности. Реально уменьшает FLOPs, а не зануляет веса.
Несколько моделей, hard/soft голосование. Один Ensemble([...]).
Чекпоинты, ранняя остановка, csv-логи, свои хуки. Как в Keras.
Экспорт и импорт. Открывается в Netron и ONNX Runtime.
benchmark, summary, FLOPs, размер. Под замеры на Raspberry Pi.
Один tt.set_device("cuda") — весь код идёт на GPU.
Каждая операция помнит, как посчитать свою производную. Тензор держит родителей и функцию градиента. Вызов .backward() идёт по графу назад и раздаёт градиенты. Свой слой — это Module с методом forward, backward считается сам.
# y = x² + 2x, dy/dx = 2x + 2 x = Tensor([3.0], requires_grad=True) y = x*x + Tensor([2.0])*x y.backward() x.grad # [8.]
15 глав: от первого тензора до квантизации и ансамблей.
Открыть документацию