Load a pretrained model given a state dictionary.
(
self,
state_dict: T.Dict[str, T.Any],
)
| 167 | v.eval() |
| 168 | |
| 169 | def load_state_dict( |
| 170 | self, |
| 171 | state_dict: T.Dict[str, T.Any], |
| 172 | ): |
| 173 | """Load a pretrained model given a state dictionary.""" |
| 174 | |
| 175 | loaded_names = set() |
| 176 | |
| 177 | # gather all base models |
| 178 | nets = inspect.getmembers(self, lambda x: isinstance(x, BaseModel)) # name, net |
| 179 | for name, net in nets: |
| 180 | if name in state_dict: |
| 181 | getattr(self, name).load_state_dict(state_dict[name]) |
| 182 | else: |
| 183 | warnings.warn(f"{name} not exist in checkpoint") |
| 184 | loaded_names.add(name) |
| 185 | |
| 186 | # gather all nn.modules |
| 187 | nets = inspect.getmembers(self, lambda x: isinstance(x, torch.nn.Module)) # name, net |
| 188 | for name, net in nets: |
| 189 | if name in state_dict: |
| 190 | try: |
| 191 | getattr(self, name).load_state_dict(state_dict[name]) |
| 192 | except: |
| 193 | new_sub_state_dict = OrderedDict() |
| 194 | for key, val in state_dict[name].items(): |
| 195 | if key.startswith("module."): |
| 196 | new_key = key[7:] |
| 197 | new_sub_state_dict[new_key] = val |
| 198 | else: |
| 199 | new_sub_state_dict[key] = val |
| 200 | getattr(self, name).load_state_dict(new_sub_state_dict) |
| 201 | else: |
| 202 | warnings.warn(f"{name} not exist in checkpoint") |
| 203 | loaded_names.add(name) |
| 204 | |
| 205 | # load those in var_names_to_load other things |
| 206 | buffer_names = state_dict.get("buffer_names", set()) |
| 207 | parameter_names = state_dict.get("parameter_names", set()) |
| 208 | |
| 209 | var_names_to_save = state_dict.get("var_names_to_save", set()) |
| 210 | self.register_var_to_save( |
| 211 | var_name=var_names_to_save, |
| 212 | ) |
| 213 | |
| 214 | var_names_to_load = state_dict.get("var_names_to_load", set()) |
| 215 | self.register_var_to_save( |
| 216 | var_name=var_names_to_load, |
| 217 | ) |
| 218 | |
| 219 | # load only those in var_names_to_load |
| 220 | for name in var_names_to_load - loaded_names: |
| 221 | if name not in state_dict: |
| 222 | continue |
| 223 | setattr(self, name, state_dict[name]) |
| 224 | |
| 225 | if name in buffer_names: |
| 226 | self.register_buffer(name, state_dict[name], persistent=True) |
no test coverage detected