/// <summary> /// Save a transformer model and the loader used to create its input data to the stream. /// </summary> /// <param name="model">The trained model to be saved. Note that this can be <see langword="null"/>, as a shorthand /// for an empty transformer chain. Upon loading with <see cref="LoadWithDataLoader(Stream, out IDataLoader{IMultiStreamSource})"/> /// the returned value will be an empty <see cref="TransformerChain{TLastTransformer}"/>.</param> /// <param name="loader">The loader that was used to create data to train the model.</param> /// <param name="stream">A writeable, seekable stream to save to.</param> public void Save <TSource>(ITransformer model, IDataLoader <TSource> loader, Stream stream) { _env.CheckValue(loader, nameof(loader)); _env.CheckValueOrNull(model); _env.CheckValue(stream, nameof(stream)); // For the sake of consistency of this API specifically, when called upon we save any transformer // in a single element transformer chain. var chainedModel = model == null ? null : new TransformerChain <ITransformer>(model); var compositeLoader = new CompositeDataLoader <TSource, ITransformer>(loader, chainedModel); using (var rep = RepositoryWriter.CreateNew(stream)) { ModelSaveContext.SaveModel(rep, compositeLoader, null); rep.Commit(); } }
private void SaveInputSchema(DataViewSchema inputSchema, RepositoryWriter rep) { _env.AssertValueOrNull(inputSchema); _env.AssertValue(rep); if (inputSchema == null) { return; } using (var ch = _env.Start("Saving Schema")) { var entry = rep.CreateEntry(SchemaEntryName); var saver = new BinarySaver(_env, new BinarySaver.Arguments { Silent = true }); DataSaverUtils.SaveDataView(ch, saver, new EmptyDataView(_env, inputSchema), entry.Stream, keepHidden: true); } }