private void SaveAsOnnxCore(OnnxContext ctx, string srcVariableName, string dstVariableName) { const int minimumOpSetVersion = 10; ctx.CheckOpSetVersion(minimumOpSetVersion, LoaderSignature); // StringNormalizer only takes input of shapes [C] or [1,C], // so the input is squeezed to support inferred shapes ( e.g. [-1,C] ). var opType = "Squeeze"; var squeezeOutput = ctx.AddIntermediateVariable(null, "SqueezeOutput", true); var node = ctx.CreateNode(opType, srcVariableName, squeezeOutput, ctx.GetNodeName(opType), ""); node.AddAttribute("axes", new long[] { 1 }); opType = "StringNormalizer"; var normalizerOutput = ctx.AddIntermediateVariable(null, "NormalizerOutput", true); node = ctx.CreateNode(opType, squeezeOutput, normalizerOutput, ctx.GetNodeName(opType), ""); var isCaseChange = (_parent._caseMode == TextNormalizingEstimator.CaseMode.Lower) ? "LOWER" : (_parent._caseMode == TextNormalizingEstimator.CaseMode.Upper) ? "UPPER" : "NONE"; node.AddAttribute("case_change_action", isCaseChange); opType = "Unsqueeze"; node = ctx.CreateNode(opType, normalizerOutput, dstVariableName, ctx.GetNodeName(opType), ""); node.AddAttribute("axes", new long[] { 1 }); }
private void SaveAsOnnxCore(OnnxContext ctx, int iinfo, string srcVariableName, string dstVariableName) { const int minimumOpSetVersion = 9; ctx.CheckOpSetVersion(minimumOpSetVersion, LoaderSignature); var model = _parent._models[iinfo]; int dimension = _srcTypes[iinfo].GetValueCount(); Host.Assert(model.Length == dimension * dimension); var parameters = _parent._columns[iinfo]; Host.Assert(parameters.Kind == WhiteningKind.PrincipalComponentAnalysis || parameters.Kind == WhiteningKind.ZeroPhaseComponentAnalysis); int rank = (parameters.Kind == WhiteningKind.PrincipalComponentAnalysis && parameters.Rank > 0) ? parameters.Rank : dimension; Host.CheckParam(rank <= dimension, nameof(rank), "Rank must be at most the dimension of untransformed data."); long[] modelDimension = { rank, dimension }; var opType = "Gemm"; var modelName = ctx.AddInitializer(model.Take(rank * dimension), modelDimension, "model"); var zeroValueName = ctx.AddInitializer((float)0); var gemmOutput = ctx.AddIntermediateVariable(null, "GemmOutput", true); var node = ctx.CreateNode(opType, new[] { modelName, srcVariableName, zeroValueName }, new[] { gemmOutput }, ctx.GetNodeName(opType), ""); node.AddAttribute("transB", 1); opType = "Transpose"; ctx.CreateNode(opType, new[] { gemmOutput }, new[] { dstVariableName }, ctx.GetNodeName(opType), ""); }
private void SaveAsOnnxCore(OnnxContext ctx, int iinfo, string srcVariableName, string dstVariableName) { const int minimumOpSetVersion = 9; ctx.CheckOpSetVersion(minimumOpSetVersion, LoaderSignature); string opType = "Tokenizer"; DataViewType dataViewType; if (_isSourceVector[iinfo]) { dataViewType = new VectorDataViewType(TextDataViewType.Instance, _sourceVectorLength[iinfo]); } else { dataViewType = TextDataViewType.Instance; } string tokenizerOutput = ctx.AddIntermediateVariable(dataViewType, "TokenizerOutput", true); var node = ctx.CreateNode(opType, srcVariableName, tokenizerOutput, ctx.GetNodeName(opType), "com.microsoft"); node.AddAttribute("mark", _parent._useMarkerChars); node.AddAttribute("mincharnum", 1); node.AddAttribute("pad_value", ""); node.AddAttribute("separators", new string[] { "" }); opType = "Squeeze"; var squeezeOutput = ctx.AddIntermediateVariable(dataViewType, "SqueezeOutput"); node = ctx.CreateNode(opType, tokenizerOutput, squeezeOutput, ctx.GetNodeName(opType), ""); node.AddAttribute("axes", new long[] { 1 }); opType = "LabelEncoder"; var labelEncoderOutput = ctx.AddIntermediateVariable(NumberDataViewType.Int64, "LabelEncoderOutput"); node = ctx.CreateNode(opType, squeezeOutput, labelEncoderOutput, ctx.GetNodeName(opType)); IEnumerable <string> charStrings = Enumerable.Range(0, 65535).Select(x => ((char)x).ToString()); IEnumerable <long> charValues = Enumerable.Range(0, 65535).Select(x => Convert.ToInt64(x)); node.AddAttribute("keys_strings", charStrings); node.AddAttribute("values_int64s", charValues); opType = "Cast"; var castNode = ctx.CreateNode(opType, labelEncoderOutput, dstVariableName, ctx.GetNodeName(opType), ""); var t = InternalDataKindExtensions.ToInternalDataKind(DataKind.UInt16).ToType(); castNode.AddAttribute("to", t); }
bool ISingleCanSaveOnnx.SaveAsOnnx(OnnxContext ctx, string[] outputNames, string featureColumn) { const int minimumOpSetVersion = 9; ctx.CheckOpSetVersion(minimumOpSetVersion, LoaderSignature); // Mapping score to prediction var fastTreeOutput = ctx.AddIntermediateVariable(null, "FastTreeOutput", true); base.SaveAsOnnx(ctx, new[] { fastTreeOutput }, featureColumn); var opType = "Exp"; ctx.CreateNode(opType, new[] { fastTreeOutput }, outputNames, ctx.GetNodeName(opType), ""); return(true); }
public void SaveAsOnnx(OnnxContext ctx) { const int minimumOpSetVersion = 9; ctx.CheckOpSetVersion(minimumOpSetVersion, LoaderSignature); var outputToInputMap = _mapper.OutputToInputMap; for (int i = 0; i < outputToInputMap.Length; i++) { var srcCol = InputSchema[outputToInputMap[i]]; var dstCol = OutputSchema[i]; if (!ctx.ContainsColumn(srcCol.Name) || dstCol.IsHidden) { continue; } var srcVariable = ctx.GetVariableName(srcCol.Name); var dstVariable = ctx.AddIntermediateVariable(dstCol.Type, dstCol.Name); string opType = "Identity"; ctx.CreateNode(opType, srcVariable, dstVariable, ctx.GetNodeName(opType), ""); } }
private bool SaveAsOnnxCore(OnnxContext ctx, string srcVariableName, DataViewType columnType) { const int minimumOpSetVersion = 9; ctx.CheckOpSetVersion(minimumOpSetVersion, LoaderSignature); Type type = columnType.RawType; int size; if (columnType is VectorDataViewType && columnType.IsKnownSizeVector()) { size = columnType.GetVectorSize(); } else { size = 1; } if ((type == typeof(int)) || (type == typeof(short)) || (type == typeof(ushort)) || (type == typeof(sbyte)) || (type == typeof(byte))) { ctx.AddInitializer(new int[size], type, new long[] { 1, size }, srcVariableName, false); } else if (type == typeof(uint) || (type == typeof(ulong))) { ctx.AddInitializer(new ulong[size], type == typeof(ulong), new long[] { 1, size }, srcVariableName, false); } else if (type == typeof(bool)) { ctx.AddInitializer(new bool[size], new long[] { 1, size }, srcVariableName, false); } else if (type == typeof(long)) { ctx.AddInitializer(new long[size], new long[] { 1, size }, srcVariableName, false); } else if (type == typeof(float)) { ctx.AddInitializer(new float[size], new long[] { 1, size }, srcVariableName, false); } else if (type == typeof(double)) { ctx.AddInitializer(new double[size], new long[] { 1, size }, srcVariableName, false); } else if ((type == typeof(string)) || (columnType is TextDataViewType)) { string[] values = new string[size]; for (int i = 0; i < size; i++) { values[i] = ""; } ctx.AddInitializer(values, new long[] { 1, size }, srcVariableName, false); } else { return(false); } return(true); }
/// <summary> /// Creates an Onnx inferencing model by vectorizing and following the logic found in <see cref="Map"/> /// </summary> bool ISingleCanSaveOnnx.SaveAsOnnx(OnnxContext ctx, string[] outputNames, string featureColumn) { const int minimumOpSetVersion = 9; ctx.CheckOpSetVersion(minimumOpSetVersion, "MulticlassNaiveBayes"); float[] featureHistogram = new float[_featureHistogram[0].Length * _labelHistogram.Length]; float[] labelHistogramExpanded = new float[_featureHistogram[0].Length * _labelHistogram.Length]; for (int i = 0; i < _featureHistogram.Length; i++) { Array.Copy(_featureHistogram[i], 0, featureHistogram, i * _featureHistogram[i].Length, _featureHistogram[i].Length); } for (int i = 0; i < _featureHistogram[0].Length; i++) { Array.Copy(_labelHistogram, 0, labelHistogramExpanded, i * _featureHistogram.Length, _featureHistogram.Length); } var one = ctx.AddInitializer(1.0f, "one"); var oneInt = ctx.AddInitializer(1, typeof(int), "oneInt"); var zero = ctx.AddInitializer(0.0f, "zero"); var labelCount = ctx.AddInitializer((float)_labelCount, "labelCount"); var trainingCount = ctx.AddInitializer((float)_totalTrainingCount, "totalTrainingCount"); var labelHistogram = ctx.AddInitializer(labelHistogramExpanded.Take(_labelHistogram.Length), new long[] { _labelHistogram.Length, 1 }, "labelHistogram"); var featureHistogramName = ctx.AddInitializer(featureHistogram, new long[] { _featureHistogram.Length, _featureHistogram[0].Length }, "featureHistogram"); var labelHistogramName = ctx.AddInitializer(labelHistogramExpanded, new long[] { _featureHistogram[0].Length, _labelHistogram.Length }, "labelHistogramExpanded"); var learnedAbsentFeatureLogProb = ctx.AddInitializer(_absentFeaturesLogProb, new long[] { _absentFeaturesLogProb.Length, 1 }, "absentFeaturesLogProb"); var typeOne = new VectorDataViewType(NumberDataViewType.Single, 1); var typeFea = new VectorDataViewType(NumberDataViewType.Single, _featureHistogram[0].Length); var typeLabelByFea = new VectorDataViewType(NumberDataViewType.Single, _labelHistogram.Length, _featureHistogram[0].Length); var typeLabelByOne = new VectorDataViewType(NumberDataViewType.Single, _labelHistogram.Length, 1); var greaterOutput = ctx.AddIntermediateVariable(new VectorDataViewType(BooleanDataViewType.Instance, _featureHistogram[0].Length), "greaterOutput"); var opType = "Greater"; ctx.CreateNode(opType, new[] { featureColumn, zero }, new[] { greaterOutput }, ctx.GetNodeName(opType), ""); opType = "Cast"; var castOutput = ctx.AddIntermediateVariable(typeFea, "CastOutput"); var node = ctx.CreateNode(opType, greaterOutput, castOutput, ctx.GetNodeName(opType), ""); var t = InternalDataKindExtensions.ToInternalDataKind(DataKind.Single).ToType(); node.AddAttribute("to", t); opType = "ExpandDims"; var isFeaturePresent = ctx.AddIntermediateVariable(new VectorDataViewType(NumberDataViewType.Single, 1, _featureHistogram[0].Length), "isFeaturePresent"); ctx.CreateNode(opType, new[] { castOutput, oneInt }, new[] { isFeaturePresent }, ctx.GetNodeName(opType), "com.microsoft"); //initialize logProb opType = "Div"; var divOutput = ctx.AddIntermediateVariable(typeOne, "DivOutput"); ctx.CreateNode(opType, new[] { labelHistogram, trainingCount }, new[] { divOutput }, ctx.GetNodeName(opType), ""); opType = "Log"; var logOutput = ctx.AddIntermediateVariable(typeOne, "LogOutput"); ctx.CreateNode(opType, divOutput, logOutput, ctx.GetNodeName(opType), ""); //log1 opType = "Sum"; var sumOutput = ctx.AddIntermediateVariable(_inputType, "SumOutput"); ctx.CreateNode(opType, new[] { featureHistogramName, one }, new[] { sumOutput }, ctx.GetNodeName(opType), ""); var logOutput1 = ctx.AddIntermediateVariable(typeLabelByFea, "LogOutput"); LogMul(ctx, sumOutput, isFeaturePresent, logOutput1); //log2 opType = "Transpose"; var labelHistogramTrans = ctx.AddIntermediateVariable(typeFea, "Transpose"); ctx.CreateNode(opType, labelHistogramName, labelHistogramTrans, ctx.GetNodeName(opType), ""); opType = "Sub"; var absentFeatureCount = ctx.AddIntermediateVariable(typeFea, "AbsentFeatureCounts"); ctx.CreateNode(opType, new[] { labelHistogramTrans, featureHistogramName }, new[] { absentFeatureCount }, ctx.GetNodeName(opType), ""); opType = "Sum"; sumOutput = ctx.AddIntermediateVariable(typeFea, "SumOutput"); ctx.CreateNode(opType, new[] { labelHistogramTrans, labelCount }, new[] { sumOutput }, ctx.GetNodeName(opType), ""); var logOutput2 = ctx.AddIntermediateVariable(typeLabelByFea, "LogOutput"); LogMul(ctx, sumOutput, isFeaturePresent, logOutput2); //log3 opType = "Sum"; sumOutput = ctx.AddIntermediateVariable(typeFea, "SumOutput"); ctx.CreateNode(opType, new[] { absentFeatureCount, one }, new[] { sumOutput }, ctx.GetNodeName(opType), ""); var logOutput3 = ctx.AddIntermediateVariable(typeLabelByFea, "LogOutput"); LogMul(ctx, sumOutput, isFeaturePresent, logOutput3); //result opType = "Sub"; var logProb = ctx.AddIntermediateVariable(typeLabelByFea, "LogProb"); ctx.CreateNode(opType, new[] { logOutput1, logOutput2 }, new[] { logProb }, ctx.GetNodeName(opType), ""); opType = "Sub"; var absentFeatureLogProb = ctx.AddIntermediateVariable(typeLabelByFea, "AbsentFeatureLogProb"); ctx.CreateNode(opType, new[] { logOutput3, logOutput2 }, new[] { absentFeatureLogProb }, ctx.GetNodeName(opType), ""); opType = "ReduceSum"; var logProbReduceSum = ctx.AddIntermediateVariable(typeLabelByOne, "ReduceSum"); node = ctx.CreateNode(opType, new[] { logProb }, new[] { logProbReduceSum }, ctx.GetNodeName(opType), ""); long[] list = { 2 }; node.AddAttribute("axes", list); opType = "ReduceSum"; var absentFeatureLogProbReduceSum = ctx.AddIntermediateVariable(typeLabelByOne, "ReduceSum"); node = ctx.CreateNode(opType, new[] { absentFeatureLogProb }, new[] { absentFeatureLogProbReduceSum }, ctx.GetNodeName(opType), ""); node.AddAttribute("axes", list); opType = "Cast"; castOutput = ctx.AddIntermediateVariable(NumberDataViewType.Single, "CastOutput"); node = ctx.CreateNode(opType, learnedAbsentFeatureLogProb, castOutput, ctx.GetNodeName(opType), ""); t = InternalDataKindExtensions.ToInternalDataKind(DataKind.Single).ToType(); node.AddAttribute("to", t); opType = "Sub"; var subOutput = ctx.AddIntermediateVariable(typeLabelByOne, "SubOutput"); ctx.CreateNode(opType, new[] { castOutput, absentFeatureLogProbReduceSum }, new[] { subOutput }, ctx.GetNodeName(opType), ""); opType = "Sum"; sumOutput = ctx.AddIntermediateVariable(typeLabelByOne, "SumOutput"); ctx.CreateNode(opType, new[] { subOutput, logProbReduceSum, logOutput }, new[] { sumOutput }, ctx.GetNodeName(opType), ""); opType = "Squeeze"; var squeezeNode = ctx.CreateNode(opType, sumOutput, outputNames[1], ctx.GetNodeName(opType), ""); squeezeNode.AddAttribute("axes", new long[] { 2 }); opType = "ArgMax"; var scoreIndex = ctx.AddIntermediateVariable(new VectorDataViewType(NumberDataViewType.Int64, 1), "ScoreIndex"); node = ctx.CreateNode(opType, new[] { sumOutput }, new[] { scoreIndex }, ctx.GetNodeName(opType), ""); node.AddAttribute("axis", 1); node.AddAttribute("keepdims", 0); opType = "Cast"; castOutput = ctx.AddIntermediateVariable(typeOne, "CastOutput"); node = ctx.CreateNode(opType, scoreIndex, castOutput, ctx.GetNodeName(opType), ""); t = InternalDataKindExtensions.ToInternalDataKind(DataKind.Single).ToType(); node.AddAttribute("to", t); //log3 opType = "Sum"; sumOutput = ctx.AddIntermediateVariable(typeOne, "SumOutput"); ctx.CreateNode(opType, new[] { castOutput, one }, new[] { sumOutput }, ctx.GetNodeName(opType), ""); opType = "Cast"; node = ctx.CreateNode(opType, sumOutput, outputNames[0], ctx.GetNodeName(opType), ""); t = InternalDataKindExtensions.ToInternalDataKind(DataKind.UInt32).ToType(); node.AddAttribute("to", t); return(true); }