Bases: nn.Module
Implementation of the stochastic layer from
Stochastic Classifiers for Unsupervised Domain Adaptation.
In train()
mode, it uses random weights and biases
that are sampled from a learned normal distribution.
In eval()
mode, the learned mean is used.
Source code in pytorch_adapt\layers\stochastic_linear.py
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69 | class StochasticLinear(nn.Module):
"""
Implementation of the stochastic layer from
[Stochastic Classifiers for Unsupervised Domain Adaptation](https://xiatian-zhu.github.io/papers/LuEtAl_CVPR2020.pdf).
In ```train()``` mode, it uses random weights and biases
that are sampled from a learned normal distribution.
In ```eval()``` mode, the learned mean is used.
"""
def __init__(self, in_features: int, out_features: int, device=None, dtype=None):
"""
Arguments:
in_features: size of each input sample
out_features: size of each output sample
"""
factory_kwargs = {"device": device, "dtype": dtype}
super().__init__()
self.in_features = in_features
self.out_features = out_features
self.weight_mean = nn.Parameter(
torch.empty(in_features, out_features, **factory_kwargs)
)
self.weight_sigma = nn.Parameter(
torch.empty(in_features, out_features, **factory_kwargs)
)
self.bias_mean = nn.Parameter(torch.empty(out_features, **factory_kwargs))
self.bias_sigma = nn.Parameter(torch.empty(out_features, **factory_kwargs))
self.reset_parameters()
def reset_parameters(self):
reset_parameters_helper(self.weight_mean, self.bias_mean)
reset_parameters_helper(self.weight_sigma, self.bias_sigma)
def random_sample(self, mean, sigma):
eps = torch.randn(*sigma.shape, device=sigma.device, dtype=sigma.dtype)
return mean + (sigma * eps)
def forward(self, x):
""""""
if self.training:
weight = self.random_sample(self.weight_mean, self.weight_sigma)
bias = self.random_sample(self.bias_mean, self.bias_sigma)
else:
weight = self.weight_mean
bias = self.bias_mean
return torch.matmul(x, weight) + bias
def extra_repr(self):
""""""
return c_f.extra_repr(self, ["in_features", "out_features"])
|
__init__(in_features, out_features, device=None, dtype=None)
Parameters:
Name |
Type |
Description |
Default |
in_features |
int
|
size of each input sample |
required
|
out_features |
int
|
size of each output sample |
required
|
Source code in pytorch_adapt\layers\stochastic_linear.py
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 | def __init__(self, in_features: int, out_features: int, device=None, dtype=None):
"""
Arguments:
in_features: size of each input sample
out_features: size of each output sample
"""
factory_kwargs = {"device": device, "dtype": dtype}
super().__init__()
self.in_features = in_features
self.out_features = out_features
self.weight_mean = nn.Parameter(
torch.empty(in_features, out_features, **factory_kwargs)
)
self.weight_sigma = nn.Parameter(
torch.empty(in_features, out_features, **factory_kwargs)
)
self.bias_mean = nn.Parameter(torch.empty(out_features, **factory_kwargs))
self.bias_sigma = nn.Parameter(torch.empty(out_features, **factory_kwargs))
self.reset_parameters()
|