| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- #!/usr/bin/env python3
- import numpy as np
- from PIL import Image
- from tinygrad.nn.state import get_parameters
- from tinygrad.nn import optim
- from tinygrad.helpers import getenv
- from extra.training import train, evaluate
- from extra.models.resnet import ResNet
- from extra.datasets import fetch_mnist
- class ComposeTransforms:
- def __init__(self, trans):
- self.trans = trans
- def __call__(self, x):
- for t in self.trans:
- x = t(x)
- return x
- if __name__ == "__main__":
- X_train, Y_train, X_test, Y_test = fetch_mnist()
- X_train = X_train.reshape(-1, 28, 28).astype(np.uint8)
- X_test = X_test.reshape(-1, 28, 28).astype(np.uint8)
- classes = 10
- TRANSFER = getenv('TRANSFER')
- model = ResNet(getenv('NUM', 18), num_classes=classes)
- if TRANSFER:
- model.load_from_pretrained()
- lr = 5e-3
- transform = ComposeTransforms([
- lambda x: [Image.fromarray(xx, mode='L').resize((64, 64)) for xx in x],
- lambda x: np.stack([np.asarray(xx) for xx in x], 0),
- lambda x: x / 255.0,
- lambda x: np.tile(np.expand_dims(x, 1), (1, 3, 1, 1)).astype(np.float32),
- ])
- for _ in range(5):
- optimizer = optim.SGD(get_parameters(model), lr=lr, momentum=0.9)
- train(model, X_train, Y_train, optimizer, 100, BS=32, transform=transform)
- evaluate(model, X_test, Y_test, num_classes=classes, transform=transform)
- lr /= 1.2
- print(f'reducing lr to {lr:.7f}')
|