|
67 | 67 | "outputs": [], |
68 | 68 | "source": [ |
69 | 69 | "class SymmetricParametrization(nn.Module):\n", |
70 | | - " def forward(X):\n", |
| 70 | + " def forward(self, X):\n", |
71 | 71 | " A = X.triu()\n", |
72 | 72 | " return A + A.T " |
73 | 73 | ] |
|
113 | 113 | "source": [ |
114 | 114 | "class PruningParametrization(nn.Module):\n", |
115 | 115 | " def __init__(self, X, p_drop=0.2):\n", |
| 116 | + " super().__init__()\n", |
116 | 117 | " # sample zeros with probability p_drop\n", |
117 | 118 | " mask = torch.full_like(X, 1.0 - p_drop)\n", |
118 | | - " self.mask = torch.bernoulli(mask)\n", |
| 119 | + " self.register_buffer(\"mask\", torch.bernoulli(mask))\n", |
119 | 120 | "\n", |
120 | 121 | " def forward(self, X):\n", |
121 | 122 | " return X * self.mask" |
|
313 | 314 | " return torch.allclose(X, -X.T)\n", |
314 | 315 | "\n", |
315 | 316 | " def right_inverse(self, X):\n", |
316 | | - " if not self.is_skew(X):\n", |
317 | | - " raise ValueError(\"This matirx is not skew-symmetric!\")\n", |
318 | 317 | " return X.triu(1)\n", |
319 | 318 | " \n", |
320 | 319 | "# Skew.forward(Skew.right_inverse(X)) == X\n", |
|
347 | 346 | " def forward(self, A):\n", |
348 | 347 | " # Cayley map: (I + A)(I - A)^{-1}\n", |
349 | 348 | " # This is orthogonal whenever A is skew-symmetric\n", |
350 | | - " Id = torch.eye(A.size(0))\n", |
| 349 | + " Id = torch.eye(A.size(0), dtype=A.dtype, device=A.device)\n", |
351 | 350 | " return self.B @ torch.linalg.solve(Id - A, Id + A)\n", |
352 | 351 | "\n", |
353 | 352 | " def is_orthogonal(self, X):\n", |
354 | | - " Id = torch.eye(X.size(0))\n", |
| 353 | + " Id = torch.eye(X.size(0), dtype=X.dtype, device=X.device)\n", |
355 | 354 | " return torch.allclose(X.T @ X, Id, atol=1e-6)\n", |
356 | 355 | "\n", |
357 | 356 | " def right_inverse(self, X):\n", |
|
362 | 361 | " return torch.zeros_like(X)\n", |
363 | 362 | "\n", |
364 | 363 | "\n", |
365 | | - "model = nn.Linear(5,5)\n", |
| 364 | + "model = nn.Linear(5, 5)\n", |
366 | 365 | "P.register_parametrization(model, \"weight\", Skew())\n", |
367 | 366 | "P.register_parametrization(model, \"weight\", Orthogonal(5))\n", |
368 | 367 | "\n", |
|
0 commit comments