*/ protected array $parameters; /** * @param Network $network */ public static function take(Network $network) : self { $layers = $parameters = []; foreach ($network->layers() as $layer) { if ($layer instanceof Parametric) { $params = []; foreach ($layer->parameters() as $key => $parameter) { $params[$key] = clone $parameter; } $layers[] = $layer; $parameters[] = $params; } } return new self($layers, $parameters); } /** * @param Parametric[] $layers * @param list $parameters * @throws InvalidArgumentException */ public function __construct(array $layers, array $parameters) { if (count($layers) !== count($parameters)) { throw new InvalidArgumentException('Number of layers' . ' and parameter groups must be equal'); } $this->layers = $layers; $this->parameters = $parameters; } /** * Restore the network parameters. */ public function restore() : void { foreach ($this->layers as $i => $layer) { $layer->restore($this->parameters[$i]); } } }