Prependix
Mock dataset
embedding = torch.eye(10 + 1)
plt.imshow(embedding)
plt.xticks(ticks=range(embedding.shape[0]))
plt.yticks(ticks=range(embedding.shape[0]))
plt.show()
def number_to_vector(number):
if number > embedding.shape[0] or number < 0:
raise Exception
return embedding[number]
def vector_to_number(vector):
return torch.argmax(vector).item()
number_to_vector(10)
vector_to_number(number_to_vector(10))
features = [1, 2, 3, 4]
targets = [2, 4, 6, 8]
features = torch.vstack([number_to_vector(x) for x in features])
targets = torch.vstack([number_to_vector(x) for x in targets])
for (x, y) in zip(features, targets):
print("feature:", vector_to_number(x), "=", x, ",", "target:", vector_to_number(y), "=", y)
Let's try a dumb "one-layer" 😉 model
model = torch.nn.Sequential(OrderedDict([
('linear', torch.nn.Linear(features.shape[1], targets.shape[1])),
('activation', torch.nn.Sigmoid()),
]))
model_graph = make_dot(
model(features[0]),
params=dict(model.named_parameters())
)
# Okay deepnote is not quite there yet, have to hack things a bit to show SVG
class Graph():
def __init__(self, graph):
self.graph = graph
def _repr_html_(self):
return self.graph.pipe(format="svg").decode('utf-8')
Graph(model_graph)
losses = train_model(
model=model,
optimizer=torch.optim.SGD(model.parameters(), lr=1e-1), # lr = learning_rate
loss_fn=mean_squared_error,
epochs=1000,
plot_interval=200
)
plt.plot(losses)
plt.title("Loss")
plt.xlabel("Epoch")
plt.show()
"Vector of all our numbers"
values = torch.Tensor(range(len(embedding)))
print(values)
plt.imshow(values.view([1, -1]))
plt.yticks([])
plt.xticks(list(range(len(embedding))))
plt.show()
def predict(x: int or torch.Tensor):
if not isinstance(x, torch.Tensor):
x = number_to_vector(x)
model.eval()
with torch.no_grad():
y_pred = model(x)
fig, axes = plt.subplots(nrows=1, ncols=2, sharey=True, figsize=(18, 3))
axes[0].imshow(x.view([1, -1]), vmin=0, vmax=1)
axes[0].set_title("X")
x_im = axes[1].imshow(y_pred.view([1, -1]), vmin=0, vmax=1)
axes[1].set_title("Y_predicted")
plt.yticks([])
for ax in axes:
ax.set_xticks(range(len(x)))
fig.colorbar(x_im, ax=axes.ravel().tolist(), cax=fig.add_axes([0.95, 0.3, 0.03, 0.38]))
plt.show()
plt.close(fig)
"Compute the actual values of the vectors"
input_value = torch.dot(x, values).item()
output_value = torch.dot(y_pred, values).item()
print("Total input value:", input_value, ",", "total output value:", output_value)
"Evaluate the model for our entire dataset & compare with targets"
for (x, y) in zip(features, targets):
predict(x)
Now let's try one that it has never seen before 😮
predict(5)