def show_images(imgs, num_rows, num_cols, titles=None, scale=1.5): #@save """Plot a list of images.""" figsize = (num_cols * scale, num_rows * scale) _, axes = d2l.plt.subplots(num_rows, num_cols, figsize=figsize) axes = axes.flatten() for i, (ax, img) in enumerate(zip(axes, imgs)): ax.imshow(d2l.numpy(img)) ax.axes.get_xaxis().set_visible(False) ax.axes.get_yaxis().set_visible(False) if titles: ax.set_title(titles[i]) return axes
def train_and_pred(train_features, test_feature, train_labels, test_data, num_epochs, lr, weight_decay, batch_size): net = get_net() train_ls, _ = train(net, train_features, train_labels, None, None, num_epochs, lr, weight_decay, batch_size) d2l.plot(np.arange(1, num_epochs + 1), [train_ls], xlabel='epoch', ylabel='log rmse', yscale='log') print(f'train log rmse {float(train_ls[-1]):f}') # Apply the network to the test set preds = d2l.numpy(net(test_features)) # Reformat it to export to Kaggle test_data['SalePrice'] = pd.Series(preds.reshape(1, -1)[0]) submission = pd.concat([test_data['Id'], test_data['SalePrice']], axis=1) submission.to_csv('submission.csv', index=False)
def plot_original_images(): data_loader = get_pokemon_dataset() d2l.set_figsize((4, 4)) num_rows = 4 num_cols = 5 scale = 1.5 for X, y in data_loader: imgs = X[0:20, :, :, :].permute(0, 2, 3, 1) / 2 + 0.5 figsize = (num_cols * scale, num_rows * scale) _, axes = d2l.plt.subplots(num_rows, num_cols, figsize=figsize) axes = axes.flatten() for i, (ax, img) in enumerate(zip(axes, imgs)): ax.imshow(d2l.numpy(img)) ax.axes.get_xaxis().set_visible(False) ax.axes.get_yaxis().set_visible(False) plt.savefig("original.png") break
def train(net, train_iter, loss, epochs, lr): trainer = torch.optim.Adam(net.parameters(), lr) for epoch in range(epochs): for X, y in train_iter: trainer.zero_grad() l = loss(net(X), y) l.backward() trainer.step() print(f'epoch {epoch + 1}, ' f'loss: {d2l.evaluate_loss(net, train_iter, loss):f}') net = get_net() train(net, train_iter, loss, 5, 0.01) onestep_preds = net(features) d2l.plot([time, time[tau:]], [d2l.numpy(x), d2l.numpy(onestep_preds)], 'time', 'x', legend=['data', '1-step preds'], xlim=[1, 1000], figsize=(6, 3)) multistep_preds = torch.zeros(T) multistep_preds[: n_train + tau] = x[: n_train + tau] for i in range(n_train + tau, T): multistep_preds[i] = d2l.reshape(net(multistep_preds[i - tau: i].reshape(1, -1)), 1) d2l.plot([time, time[tau:], time[n_train + tau:]], [d2l.numpy(x), d2l.numpy(onestep_preds), d2l.numpy(multistep_preds[n_train + tau:])], 'time', 'x', legend=['data', '1-step preds', 'multistep preds'], xlim=[1, 1000], figsize=(6, 3))
for epoch in range(epochs): for X, y in train_iter: trainer.zero_grad() l = loss(net(X), y) l.backward() trainer.step() print(f'epoch {epoch + 1}, ' f'loss: {d2l.evaluate_loss(net, train_iter, loss):f}') net = get_net() train(net, train_iter, loss, 5, 0.01) onestep_preds = net(features) d2l.plot([time, time[tau:]], [d2l.numpy(x), d2l.numpy(onestep_preds)], 'time', 'x', legend=['data', '1-step preds'], xlim=[1, 1000], figsize=(6, 3)) plt.show() #@tab mxnet, pytorch multistep_preds = d2l.zeros(T) multistep_preds[:n_train + tau] = x[:n_train + tau] for i in range(n_train + tau, T): multistep_preds[i] = net(d2l.reshape(multistep_preds[i - tau:i], (1, -1))) d2l.plot([time, time[tau:], time[n_train + tau:]], [ d2l.numpy(x),
y = torch.matmul(X, w) + b y += torch.normal(0, 0.01, y.shape) return X, y.reshape((-1, 1)) true_w = torch.tensor([2, -3.4]) true_b = 4.2 features, labels = synthetic_data(true_w, true_b, 1000) print('features:', features[0],'\nlabel:', labels[0]) d2l.set_figsize() # The semicolon is for displaying the plot only d2l.plt.scatter(d2l.numpy(features[:, 1]), d2l.numpy(labels), 1); def data_iter(batch_size, features, labels): num_examples = len(features) indices = list(range(num_examples)) # The examples are read at random, in no particular order random.shuffle(indices) for i in range(0, num_examples, batch_size): batch_indices = torch.tensor( indices[i: min(i + batch_size, num_examples)])
# `i + 1` to `i + T - tau - max_steps + 1` for i in range(tau): features[:, i] = x[i:i + T - tau - max_steps + 1] # Column `i` (`i` >= `tau`) are the (`i - tau + 1`)-step-ahead predictions for # time steps from `i + 1` to `i + T - tau - max_steps + 1` for i in range(tau, tau + max_steps): features[:, i] = net(features[:, i - tau:i]).reshape(-1) # # features[:, i] = d2l.reshape(net(features[:, i - tau: i]), -1) # # for i in range(tau, tau + max_steps): net.predict(features[:, 0:tau], 2,'cpu') # # features = net.predict(features[:, 0:tau], 64,'cpu') steps = (1, 4, 16, 64) d2l.plot([time[tau + i - 1:T - max_steps + i] for i in steps], [d2l.numpy(features[:, tau + i - 1]) for i in steps], 'time', 'x', legend=[f'{i}-step preds' for i in steps], xlim=[5, 1000], figsize=(6, 3)) plt.show() """ Variance drops to 0 after 30 or so iterations into the future ipdb> torch.var(features, dim=0) tensor([4.9716e-01, 4.9711e-01, 4.9725e-01, 4.9694e-01, 1.5809e-04, 2.3734e-04, 1.5558e-04, 1.1278e-03, 8.4877e-07, 2.5014e-06, 1.6873e-06, 2.6207e-06, 1.5340e-08, 5.8878e-09, 1.4902e-08, 6.8168e-09, 1.3024e-10, 1.1096e-11, 8.0228e-11, 2.0331e-11, 6.0880e-13, 1.1036e-13, 3.6038e-13, 6.7023e-14, 1.8928e-15, 1.1078e-15, 1.5303e-15, 2.4856e-16, 2.8222e-18, 1.7228e-17, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,