def train(model, optim, steps, BS=128, gpu=False): if gpu is True: [x.cuda_() for x in get_parameters([model, optim])] losses, accuracies = [], [] for i in (t := trange(steps, disable=os.getenv('CI') is not None)): samp = np.random.randint(0, X_train.shape[0], size=(BS)) x = Tensor(X_train[samp].reshape((-1, 28 * 28)).astype(np.float32), gpu=gpu) Y = Y_train[samp] y = np.zeros((len(samp), 10), np.float32) # correct loss for NLL, torch NLL loss returns one per row y[range(y.shape[0]), Y] = -10.0 y = Tensor(y, gpu=gpu) # network out = model.forward(x) # NLL loss function loss = out.mul(y).mean() optim.zero_grad() loss.backward() optim.step() cat = np.argmax(out.cpu().data, axis=1) accuracy = (cat == Y).mean() # printing loss = loss.cpu().data losses.append(loss) accuracies.append(accuracy) t.set_description("loss %.2f accuracy %.2f" % (loss, accuracy))
def step_tinygrad(optim, kwargs={}, gpu=False): net = TinyNet() optim = optim([net.x, net.W], **kwargs) if gpu is True: [x.cuda_() for x in get_parameters([net, optim])] out = net.forward() out.backward() optim.step() return net.x.cpu().data, net.W.cpu().data
def parameters(self): return get_parameters(self)
# if you want to look at the outputs """ import matplotlib.pyplot as plt plt.plot(out.data[0]) plt.show() """ return out, retimg if __name__ == "__main__": # instantiate my net model = EfficientNet(int(os.getenv("NUM", "0"))) model.load_weights_from_torch() if GPU: [x.cuda_() for x in get_parameters(model)] # category labels import ast lbls = fetch( "https://gist.githubusercontent.com/yrevar/942d3a0ac09ec9e5eb3a/raw/238f720ff059c1f82f368259d1ca4ffa5dd8f9f5/imagenet1000_clsidx_to_labels.txt" ) lbls = ast.literal_eval(lbls.decode('utf-8')) # load image and preprocess from PIL import Image url = sys.argv[1] if url == 'webcam': import cv2 cap = cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)
if __name__ == "__main__": X_train, Y_train = load_cifar() classes = 10 Tensor.default_gpu = os.getenv("GPU") is not None TINY = os.getenv("TINY") is not None TRANSFER = os.getenv("TRANSFER") is not None if TINY: model = TinyConvNet(classes) elif TRANSFER: model = EfficientNet(int(os.getenv("NUM", "0")), classes, has_se=True) model.load_weights_from_torch() else: model = EfficientNet(int(os.getenv("NUM", "0")), classes, has_se=False) parameters = get_parameters(model) print("parameters", len(parameters)) optimizer = optim.Adam(parameters, lr=0.001) #BS, steps = 16, 32 BS, steps = 64 if TINY else 16, 2048 for i in (t := trange(steps)): samp = np.random.randint(0, X_train.shape[0], size=(BS)) img = X_train[samp].astype(np.float32) st = time.time() out = model.forward(Tensor(img)) fp_time = (time.time() - st) * 1000.0