@@ -52,6 +52,7 @@ def __init__(self,
52
52
self .correlated_output = shared_embedding_space
53
53
self .gp_model = None
54
54
self .likelihood = None
55
+ self .ensemble = False
55
56
self .compiled = False
56
57
self .train_loss = []
57
58
@@ -92,6 +93,8 @@ def compile_multi_model_trainer(self,
92
93
the number of neural networks is equal to the number of Gaussian
93
94
processes. For example, if the outputs are spectra of length 128,
94
95
one will have 128 neural networks and 128 GPs trained in parallel.
96
+ It can be also used for training an ensembles of models for the same
97
+ scalar output.
95
98
"""
96
99
if self .correlated_output :
97
100
raise NotImplementedError (
@@ -101,16 +104,21 @@ def compile_multi_model_trainer(self,
101
104
if y .shape [0 ] < 2 :
102
105
raise ValueError ("The training targets must be vector-valued (d >1)" )
103
106
input_dim , embedim = self .dimdict ["input_dim" ], self .dimdict ["embedim" ]
104
- feature_extractor = kwargs .get ("feature_extractor" )
105
- if feature_extractor is None :
106
- feature_extractor = fcFeatureExtractor (input_dim , embedim )
107
+ feature_net = kwargs .get ("feature_extractor" , fcFeatureExtractor )
107
108
freeze_weights = kwargs .get ("freeze_weights" , False )
108
- if freeze_weights :
109
- for p in feature_extractor .parameters ():
110
- p .requires_grad = False
109
+ if not self .ensemble :
110
+ feature_extractor = feature_net (input_dim , embedim )
111
+ if freeze_weights :
112
+ for p in feature_extractor .parameters ():
113
+ p .requires_grad = False
111
114
list_of_models = []
112
115
list_of_likelihoods = []
113
116
for i in range (y .shape [0 ]):
117
+ if self .ensemble : # different initilization for each model
118
+ feature_extractor = feature_net (input_dim , embedim )
119
+ if freeze_weights :
120
+ for p in feature_extractor .parameters ():
121
+ p .requires_grad = False
114
122
model_i = GPRegressionModel (
115
123
X , y [i :i + 1 ],
116
124
gpytorch .likelihoods .GaussianLikelihood (batch_shape = torch .Size ([1 ])),
@@ -154,7 +162,8 @@ def compile_trainer(self, X: Union[torch.Tensor, np.ndarray],
154
162
155
163
Keyword Args:
156
164
feature_extractor:
157
- (Optional) Custom neural network for feature extractor
165
+ (Optional) Custom neural network for feature extractor.
166
+ Must take input/feature dims and embedding dims as its arguments.
158
167
grid_size:
159
168
Grid size for structured kernel interpolation (Default: 50)
160
169
freeze_weights:
@@ -168,9 +177,8 @@ def compile_trainer(self, X: Union[torch.Tensor, np.ndarray],
168
177
"use compile_multi_model_trainer(*args, **kwargs)" )
169
178
X , y = self .set_data (X , y )
170
179
input_dim , embedim = self .dimdict ["input_dim" ], self .dimdict ["embedim" ]
171
- feature_extractor = kwargs .get ("feature_extractor" )
172
- if feature_extractor is None :
173
- feature_extractor = fcFeatureExtractor (input_dim , embedim )
180
+ feature_net = kwargs .get ("feature_extractor" , fcFeatureExtractor )
181
+ feature_extractor = feature_net (input_dim , embedim )
174
182
freeze_weights = kwargs .get ("freeze_weights" , False )
175
183
if freeze_weights :
176
184
for p in feature_extractor .parameters ():
0 commit comments