Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,45 +2,29 @@
using System.Linq;
using Microsoft.ML;
using Microsoft.ML.Data;
using Microsoft.ML.OnnxRuntime;

namespace Samples.Dynamic
{
public static class OnnxTransformExample
public static class ApplyOnnxModel
{
/// <summary>
/// Example use of OnnxEstimator in an ML.NET pipeline
/// </summary>
public static void Example()
{
// Download the squeeznet image model from ONNX model zoo, version 1.2
// https://github.com/onnx/models/tree/master/squeezenet or use
// Microsoft.ML.Onnx.TestModels nuget.
var modelPath = @"squeezenet\00000001\model.onnx";

@shmoradimsshmoradimsApr 16, 2019

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please verify that this statement is true (you can double check with Jignesh):

  1. verify github link: Is the model.onnx in the squeezenet github link the same as squeezenet\00000001\model.onnx? I see manifest.json and 00000001 on our side which don't exist in the github link. Jignesh most likely has done an extra step to create squeezenet\00000001\model.onnx which users wouldn't know how to do.

  2. verify the nuget: Microsoft.ML.Onnx.TestModels was last updated 4 months ago on myget. It's also at version 0.0.4: https://dotnet.myget.org/feed/dotnet-core/package/nuget/Microsoft.ML.Onnx.TestModels

We also have this other similar nuget: https://dotnet.myget.org/feed/dotnet-core/package/nuget/Microsoft.ML.Onnx.TestModels

There has been a lot of reshuffling things. Please double check that we're naming the correct nuget package and also try it out locally to make sure it works.

If there are any nuances about using this API, please add it to it's xml documentation.

Thanks.

#Resolved

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yep its there


In reply to: 275814495 [](ancestors = 275814495)


// Inspect the model's inputs and outputs
var session = new InferenceSession(modelPath);
var inputInfo = session.InputMetadata.First();
var outputInfo = session.OutputMetadata.First();
Console.WriteLine($"Input Name is {String.Join(",", inputInfo.Key)}");
Console.WriteLine($"Input Dimensions are {String.Join(",", inputInfo.Value.Dimensions)}");
Console.WriteLine($"Output Name is {String.Join(",", outputInfo.Key)}");
Console.WriteLine($"Output Dimensions are {String.Join(",", outputInfo.Value.Dimensions)}");
// Results..
// Input Name is data_0
// Input Dimensions are 1,3,224,224
// Output Name is softmaxout_1
// Output Dimensions are 1,1000,1,1

// Create ML pipeline to score the data using OnnxScoringEstimator
var mlContext = new MLContext();
var data = GetTensorData();
var idv = mlContext.Data.LoadFromEnumerable(data);
var pipeline = mlContext.Transforms.ApplyOnnxModel(new[] { outputInfo.Key }, new[] { inputInfo.Key }, modelPath);

// Run the pipeline and get the transformed values
var transformedValues = pipeline.Fit(idv).Transform(idv);

// Generate sample test data.
var samples = GetTensorData();
// Convert training data to IDataView, the general data type used in ML.NET.
var data = mlContext.Data.LoadFromEnumerable(samples);
// Create the pipeline to score using provided onnx model.
var pipeline = mlContext.Transforms.ApplyOnnxModel(modelPath);
// Fit the pipeline and get the transformed values
var transformedValues = pipeline.Fit(data).Transform(data);
// Retrieve model scores into Prediction class
var predictions = mlContext.Data.CreateEnumerable<Prediction>(transformedValues, reuseRowObject: false);

Expand All@@ -66,25 +50,18 @@ public static void Example()
// ----------
}

/// <summary>
/// inputSize is the overall dimensions of the model input tensor.
/// </summary>
// inputSize is the overall dimensions of the model input tensor.
private const int inputSize = 224 * 224 * 3;

/// <summary>
/// A class to hold sample tensor data. Member name should match
/// the inputs that the model expects (in this case, data_0)
/// </summary>
// A class to hold sample tensor data. Member name should match
// the inputs that the model expects (in this case, data_0)
public class TensorData
{
[VectorType(inputSize)]
public float[] data_0 { get; set; }
}

/// <summary>
/// Method to generate sample test data. Returns 2 sample rows.
/// </summary>
/// <returns></returns>
// Method to generate sample test data. Returns 2 sample rows.
public static TensorData[] GetTensorData()
{
// This can be any numerical data. Assume image pixel values.
Expand All@@ -93,10 +70,8 @@ public static TensorData[] GetTensorData()
return new TensorData[] { new TensorData() { data_0 = image1 }, new TensorData() { data_0 = image2 } };
}

/// <summary>
/// Class to contain the output values from the transformation.
/// This model generates a vector of 1000 floats.
/// </summary>
// Class to contain the output values from the transformation.
// This model generates a vector of 1000 floats.
class Prediction
{
[VectorType(1000)]
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,45 +2,29 @@
using System.Linq;
using Microsoft.ML;
using Microsoft.ML.Data;
using Microsoft.ML.OnnxRuntime;

namespace Samples.Dynamic
{
public static class OnnxTransformExample
public static class ApplyOnnxModel
{
/// <summary>
/// Example use of OnnxEstimator in an ML.NET pipeline
/// </summary>
public static void Example()
{
// Download the squeeznet image model from ONNX model zoo, version 1.2
// https://github.com/onnx/models/tree/master/squeezenet or use
// Microsoft.ML.Onnx.TestModels nuget.
var modelPath = @"squeezenet\00000001\model.onnx";

@shmoradimsshmoradimsApr 16, 2019

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please verify that this statement is true (you can double check with Jignesh):

  1. verify github link: Is the model.onnx in the squeezenet github link the same as squeezenet\00000001\model.onnx? I see manifest.json and 00000001 on our side which don't exist in the github link. Jignesh most likely has done an extra step to create squeezenet\00000001\model.onnx which users wouldn't know how to do.

  2. verify the nuget: Microsoft.ML.Onnx.TestModels was last updated 4 months ago on myget. It's also at version 0.0.4: https://dotnet.myget.org/feed/dotnet-core/package/nuget/Microsoft.ML.Onnx.TestModels

We also have this other similar nuget: https://dotnet.myget.org/feed/dotnet-core/package/nuget/Microsoft.ML.Onnx.TestModels

There has been a lot of reshuffling things. Please double check that we're naming the correct nuget package and also try it out locally to make sure it works.

If there are any nuances about using this API, please add it to it's xml documentation.

Thanks.

#Resolved

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yep its there


In reply to: 275814495 [](ancestors = 275814495)


// Inspect the model's inputs and outputs
var session = new InferenceSession(modelPath);
var inputInfo = session.InputMetadata.First();
var outputInfo = session.OutputMetadata.First();
Console.WriteLine($"Input Name is {String.Join(",", inputInfo.Key)}");
Console.WriteLine($"Input Dimensions are {String.Join(",", inputInfo.Value.Dimensions)}");
Console.WriteLine($"Output Name is {String.Join(",", outputInfo.Key)}");
Console.WriteLine($"Output Dimensions are {String.Join(",", outputInfo.Value.Dimensions)}");
// Results..
// Input Name is data_0
// Input Dimensions are 1,3,224,224
// Output Name is softmaxout_1
// Output Dimensions are 1,1000,1,1

// Create ML pipeline to score the data using OnnxScoringEstimator
var mlContext = new MLContext();
var data = GetTensorData();
var idv = mlContext.Data.LoadFromEnumerable(data);
var pipeline = mlContext.Transforms.ApplyOnnxModel(new[] { outputInfo.Key }, new[] { inputInfo.Key }, modelPath);

// Run the pipeline and get the transformed values
var transformedValues = pipeline.Fit(idv).Transform(idv);

// Generate sample test data.
var samples = GetTensorData();
// Convert training data to IDataView, the general data type used in ML.NET.
var data = mlContext.Data.LoadFromEnumerable(samples);
// Create the pipeline to score using provided onnx model.
var pipeline = mlContext.Transforms.ApplyOnnxModel(modelPath);
// Fit the pipeline and get the transformed values
var transformedValues = pipeline.Fit(data).Transform(data);
// Retrieve model scores into Prediction class
var predictions = mlContext.Data.CreateEnumerable<Prediction>(transformedValues, reuseRowObject: false);

Expand All@@ -66,25 +50,18 @@ public static void Example()
// ----------
}

/// <summary>
/// inputSize is the overall dimensions of the model input tensor.
/// </summary>
// inputSize is the overall dimensions of the model input tensor.
private const int inputSize = 224 * 224 * 3;

/// <summary>
/// A class to hold sample tensor data. Member name should match
/// the inputs that the model expects (in this case, data_0)
/// </summary>
// A class to hold sample tensor data. Member name should match
// the inputs that the model expects (in this case, data_0)
public class TensorData
{
[VectorType(inputSize)]
public float[] data_0 { get; set; }
}

/// <summary>
/// Method to generate sample test data. Returns 2 sample rows.
/// </summary>
/// <returns></returns>
// Method to generate sample test data. Returns 2 sample rows.
public static TensorData[] GetTensorData()
{
// This can be any numerical data. Assume image pixel values.
Expand All@@ -93,10 +70,8 @@ public static TensorData[] GetTensorData()
return new TensorData[] { new TensorData() { data_0 = image1 }, new TensorData() { data_0 = image2 } };
}

/// <summary>
/// Class to contain the output values from the transformation.
/// This model generates a vector of 1000 floats.
/// </summary>
// Class to contain the output values from the transformation.
// This model generates a vector of 1000 floats.
class Prediction
{
[VectorType(1000)]
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,45 +2,29 @@
using System.Linq;
using Microsoft.ML;
using Microsoft.ML.Data;
using Microsoft.ML.OnnxRuntime;

namespace Samples.Dynamic
{
public static class OnnxTransformExample
public static class ApplyOnnxModel
{
/// <summary>
/// Example use of OnnxEstimator in an ML.NET pipeline
/// </summary>
public static void Example()
{
// Download the squeeznet image model from ONNX model zoo, version 1.2
// https://github.com/onnx/models/tree/master/squeezenet or use
// Microsoft.ML.Onnx.TestModels nuget.
var modelPath = @"squeezenet\00000001\model.onnx";

@shmoradimsshmoradimsApr 16, 2019

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please verify that this statement is true (you can double check with Jignesh):

  1. verify github link: Is the model.onnx in the squeezenet github link the same as squeezenet\00000001\model.onnx? I see manifest.json and 00000001 on our side which don't exist in the github link. Jignesh most likely has done an extra step to create squeezenet\00000001\model.onnx which users wouldn't know how to do.

  2. verify the nuget: Microsoft.ML.Onnx.TestModels was last updated 4 months ago on myget. It's also at version 0.0.4: https://dotnet.myget.org/feed/dotnet-core/package/nuget/Microsoft.ML.Onnx.TestModels

We also have this other similar nuget: https://dotnet.myget.org/feed/dotnet-core/package/nuget/Microsoft.ML.Onnx.TestModels

There has been a lot of reshuffling things. Please double check that we're naming the correct nuget package and also try it out locally to make sure it works.

If there are any nuances about using this API, please add it to it's xml documentation.

Thanks.

#Resolved

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yep its there


In reply to: 275814495 [](ancestors = 275814495)


// Inspect the model's inputs and outputs
var session = new InferenceSession(modelPath);
var inputInfo = session.InputMetadata.First();
var outputInfo = session.OutputMetadata.First();
Console.WriteLine($"Input Name is {String.Join(",", inputInfo.Key)}");
Console.WriteLine($"Input Dimensions are {String.Join(",", inputInfo.Value.Dimensions)}");
Console.WriteLine($"Output Name is {String.Join(",", outputInfo.Key)}");
Console.WriteLine($"Output Dimensions are {String.Join(",", outputInfo.Value.Dimensions)}");
// Results..
// Input Name is data_0
// Input Dimensions are 1,3,224,224
// Output Name is softmaxout_1
// Output Dimensions are 1,1000,1,1

// Create ML pipeline to score the data using OnnxScoringEstimator
var mlContext = new MLContext();
var data = GetTensorData();
var idv = mlContext.Data.LoadFromEnumerable(data);
var pipeline = mlContext.Transforms.ApplyOnnxModel(new[] { outputInfo.Key }, new[] { inputInfo.Key }, modelPath);

// Run the pipeline and get the transformed values
var transformedValues = pipeline.Fit(idv).Transform(idv);

// Generate sample test data.
var samples = GetTensorData();
// Convert training data to IDataView, the general data type used in ML.NET.
var data = mlContext.Data.LoadFromEnumerable(samples);
// Create the pipeline to score using provided onnx model.
var pipeline = mlContext.Transforms.ApplyOnnxModel(modelPath);
// Fit the pipeline and get the transformed values
var transformedValues = pipeline.Fit(data).Transform(data);
// Retrieve model scores into Prediction class
var predictions = mlContext.Data.CreateEnumerable<Prediction>(transformedValues, reuseRowObject: false);

Expand All@@ -66,25 +50,18 @@ public static void Example()
// ----------
}

/// <summary>
/// inputSize is the overall dimensions of the model input tensor.
/// </summary>
// inputSize is the overall dimensions of the model input tensor.
private const int inputSize = 224 * 224 * 3;

/// <summary>
/// A class to hold sample tensor data. Member name should match
/// the inputs that the model expects (in this case, data_0)
/// </summary>
// A class to hold sample tensor data. Member name should match
// the inputs that the model expects (in this case, data_0)
public class TensorData
{
[VectorType(inputSize)]
public float[] data_0 { get; set; }
}

/// <summary>
/// Method to generate sample test data. Returns 2 sample rows.
/// </summary>
/// <returns></returns>
// Method to generate sample test data. Returns 2 sample rows.
public static TensorData[] GetTensorData()
{
// This can be any numerical data. Assume image pixel values.
Expand All@@ -93,10 +70,8 @@ public static TensorData[] GetTensorData()
return new TensorData[] { new TensorData() { data_0 = image1 }, new TensorData() { data_0 = image2 } };
}

/// <summary>
/// Class to contain the output values from the transformation.
/// This model generates a vector of 1000 floats.
/// </summary>
// Class to contain the output values from the transformation.
// This model generates a vector of 1000 floats.
class Prediction
{
[VectorType(1000)]
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,45 +2,29 @@
using System.Linq;
using Microsoft.ML;
using Microsoft.ML.Data;
using Microsoft.ML.OnnxRuntime;

namespace Samples.Dynamic
{
public static class OnnxTransformExample
public static class ApplyOnnxModel
{
/// <summary>
/// Example use of OnnxEstimator in an ML.NET pipeline
/// </summary>
public static void Example()
{
// Download the squeeznet image model from ONNX model zoo, version 1.2
// https://github.com/onnx/models/tree/master/squeezenet or use
// Microsoft.ML.Onnx.TestModels nuget.
var modelPath = @"squeezenet\00000001\model.onnx";

@shmoradimsshmoradimsApr 16, 2019

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please verify that this statement is true (you can double check with Jignesh):

  1. verify github link: Is the model.onnx in the squeezenet github link the same as squeezenet\00000001\model.onnx? I see manifest.json and 00000001 on our side which don't exist in the github link. Jignesh most likely has done an extra step to create squeezenet\00000001\model.onnx which users wouldn't know how to do.

  2. verify the nuget: Microsoft.ML.Onnx.TestModels was last updated 4 months ago on myget. It's also at version 0.0.4: https://dotnet.myget.org/feed/dotnet-core/package/nuget/Microsoft.ML.Onnx.TestModels

We also have this other similar nuget: https://dotnet.myget.org/feed/dotnet-core/package/nuget/Microsoft.ML.Onnx.TestModels

There has been a lot of reshuffling things. Please double check that we're naming the correct nuget package and also try it out locally to make sure it works.

If there are any nuances about using this API, please add it to it's xml documentation.

Thanks.

#Resolved

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yep its there


In reply to: 275814495 [](ancestors = 275814495)


// Inspect the model's inputs and outputs
var session = new InferenceSession(modelPath);
var inputInfo = session.InputMetadata.First();
var outputInfo = session.OutputMetadata.First();
Console.WriteLine($"Input Name is {String.Join(",", inputInfo.Key)}");
Console.WriteLine($"Input Dimensions are {String.Join(",", inputInfo.Value.Dimensions)}");
Console.WriteLine($"Output Name is {String.Join(",", outputInfo.Key)}");
Console.WriteLine($"Output Dimensions are {String.Join(",", outputInfo.Value.Dimensions)}");
// Results..
// Input Name is data_0
// Input Dimensions are 1,3,224,224
// Output Name is softmaxout_1
// Output Dimensions are 1,1000,1,1

// Create ML pipeline to score the data using OnnxScoringEstimator
var mlContext = new MLContext();
var data = GetTensorData();
var idv = mlContext.Data.LoadFromEnumerable(data);
var pipeline = mlContext.Transforms.ApplyOnnxModel(new[] { outputInfo.Key }, new[] { inputInfo.Key }, modelPath);

// Run the pipeline and get the transformed values
var transformedValues = pipeline.Fit(idv).Transform(idv);

// Generate sample test data.
var samples = GetTensorData();
// Convert training data to IDataView, the general data type used in ML.NET.
var data = mlContext.Data.LoadFromEnumerable(samples);
// Create the pipeline to score using provided onnx model.
var pipeline = mlContext.Transforms.ApplyOnnxModel(modelPath);
// Fit the pipeline and get the transformed values
var transformedValues = pipeline.Fit(data).Transform(data);
// Retrieve model scores into Prediction class
var predictions = mlContext.Data.CreateEnumerable<Prediction>(transformedValues, reuseRowObject: false);

Expand All@@ -66,25 +50,18 @@ public static void Example()
// ----------
}

/// <summary>
/// inputSize is the overall dimensions of the model input tensor.
/// </summary>
// inputSize is the overall dimensions of the model input tensor.
private const int inputSize = 224 * 224 * 3;

/// <summary>
/// A class to hold sample tensor data. Member name should match
/// the inputs that the model expects (in this case, data_0)
/// </summary>
// A class to hold sample tensor data. Member name should match
// the inputs that the model expects (in this case, data_0)
public class TensorData
{
[VectorType(inputSize)]
public float[] data_0 { get; set; }
}

/// <summary>
/// Method to generate sample test data. Returns 2 sample rows.
/// </summary>
/// <returns></returns>
// Method to generate sample test data. Returns 2 sample rows.
public static TensorData[] GetTensorData()
{
// This can be any numerical data. Assume image pixel values.
Expand All@@ -93,10 +70,8 @@ public static TensorData[] GetTensorData()
return new TensorData[] { new TensorData() { data_0 = image1 }, new TensorData() { data_0 = image2 } };
}

/// <summary>
/// Class to contain the output values from the transformation.
/// This model generates a vector of 1000 floats.
/// </summary>
// Class to contain the output values from the transformation.
// This model generates a vector of 1000 floats.
class Prediction
{
[VectorType(1000)]
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,45 +2,29 @@
using System.Linq;
using Microsoft.ML;
using Microsoft.ML.Data;
using Microsoft.ML.OnnxRuntime;

namespace Samples.Dynamic
{
public static class OnnxTransformExample
public static class ApplyOnnxModel
{
/// <summary>
/// Example use of OnnxEstimator in an ML.NET pipeline
/// </summary>
public static void Example()
{
// Download the squeeznet image model from ONNX model zoo, version 1.2
// https://github.com/onnx/models/tree/master/squeezenet or use
// Microsoft.ML.Onnx.TestModels nuget.
var modelPath = @"squeezenet\00000001\model.onnx";

@shmoradimsshmoradimsApr 16, 2019

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please verify that this statement is true (you can double check with Jignesh):

  1. verify github link: Is the model.onnx in the squeezenet github link the same as squeezenet\00000001\model.onnx? I see manifest.json and 00000001 on our side which don't exist in the github link. Jignesh most likely has done an extra step to create squeezenet\00000001\model.onnx which users wouldn't know how to do.

  2. verify the nuget: Microsoft.ML.Onnx.TestModels was last updated 4 months ago on myget. It's also at version 0.0.4: https://dotnet.myget.org/feed/dotnet-core/package/nuget/Microsoft.ML.Onnx.TestModels

We also have this other similar nuget: https://dotnet.myget.org/feed/dotnet-core/package/nuget/Microsoft.ML.Onnx.TestModels

There has been a lot of reshuffling things. Please double check that we're naming the correct nuget package and also try it out locally to make sure it works.

If there are any nuances about using this API, please add it to it's xml documentation.

Thanks.

#Resolved

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yep its there


In reply to: 275814495 [](ancestors = 275814495)


// Inspect the model's inputs and outputs
var session = new InferenceSession(modelPath);
var inputInfo = session.InputMetadata.First();
var outputInfo = session.OutputMetadata.First();
Console.WriteLine($"Input Name is {String.Join(",", inputInfo.Key)}");
Console.WriteLine($"Input Dimensions are {String.Join(",", inputInfo.Value.Dimensions)}");
Console.WriteLine($"Output Name is {String.Join(",", outputInfo.Key)}");
Console.WriteLine($"Output Dimensions are {String.Join(",", outputInfo.Value.Dimensions)}");
// Results..
// Input Name is data_0
// Input Dimensions are 1,3,224,224
// Output Name is softmaxout_1
// Output Dimensions are 1,1000,1,1

// Create ML pipeline to score the data using OnnxScoringEstimator
var mlContext = new MLContext();
var data = GetTensorData();
var idv = mlContext.Data.LoadFromEnumerable(data);
var pipeline = mlContext.Transforms.ApplyOnnxModel(new[] { outputInfo.Key }, new[] { inputInfo.Key }, modelPath);

// Run the pipeline and get the transformed values
var transformedValues = pipeline.Fit(idv).Transform(idv);

// Generate sample test data.
var samples = GetTensorData();
// Convert training data to IDataView, the general data type used in ML.NET.
var data = mlContext.Data.LoadFromEnumerable(samples);
// Create the pipeline to score using provided onnx model.
var pipeline = mlContext.Transforms.ApplyOnnxModel(modelPath);
// Fit the pipeline and get the transformed values
var transformedValues = pipeline.Fit(data).Transform(data);
// Retrieve model scores into Prediction class
var predictions = mlContext.Data.CreateEnumerable<Prediction>(transformedValues, reuseRowObject: false);

Expand All@@ -66,25 +50,18 @@ public static void Example()
// ----------
}

/// <summary>
/// inputSize is the overall dimensions of the model input tensor.
/// </summary>
// inputSize is the overall dimensions of the model input tensor.
private const int inputSize = 224 * 224 * 3;

/// <summary>
/// A class to hold sample tensor data. Member name should match
/// the inputs that the model expects (in this case, data_0)
/// </summary>
// A class to hold sample tensor data. Member name should match
// the inputs that the model expects (in this case, data_0)
public class TensorData
{
[VectorType(inputSize)]
public float[] data_0 { get; set; }
}

/// <summary>
/// Method to generate sample test data. Returns 2 sample rows.
/// </summary>
/// <returns></returns>
// Method to generate sample test data. Returns 2 sample rows.
public static TensorData[] GetTensorData()
{
// This can be any numerical data. Assume image pixel values.
Expand All@@ -93,10 +70,8 @@ public static TensorData[] GetTensorData()
return new TensorData[] { new TensorData() { data_0 = image1 }, new TensorData() { data_0 = image2 } };
}

/// <summary>
/// Class to contain the output values from the transformation.
/// This model generates a vector of 1000 floats.
/// </summary>
// Class to contain the output values from the transformation.
// This model generates a vector of 1000 floats.
class Prediction
{
[VectorType(1000)]
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,45 +2,29 @@
using System.Linq;
using Microsoft.ML;
using Microsoft.ML.Data;
using Microsoft.ML.OnnxRuntime;

namespace Samples.Dynamic
{
public static class OnnxTransformExample
public static class ApplyOnnxModel
{
/// <summary>
/// Example use of OnnxEstimator in an ML.NET pipeline
/// </summary>
public static void Example()
{
// Download the squeeznet image model from ONNX model zoo, version 1.2
// https://github.com/onnx/models/tree/master/squeezenet or use
// Microsoft.ML.Onnx.TestModels nuget.
var modelPath = @"squeezenet\00000001\model.onnx";

@shmoradimsshmoradimsApr 16, 2019

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please verify that this statement is true (you can double check with Jignesh):

  1. verify github link: Is the model.onnx in the squeezenet github link the same as squeezenet\00000001\model.onnx? I see manifest.json and 00000001 on our side which don't exist in the github link. Jignesh most likely has done an extra step to create squeezenet\00000001\model.onnx which users wouldn't know how to do.

  2. verify the nuget: Microsoft.ML.Onnx.TestModels was last updated 4 months ago on myget. It's also at version 0.0.4: https://dotnet.myget.org/feed/dotnet-core/package/nuget/Microsoft.ML.Onnx.TestModels

We also have this other similar nuget: https://dotnet.myget.org/feed/dotnet-core/package/nuget/Microsoft.ML.Onnx.TestModels

There has been a lot of reshuffling things. Please double check that we're naming the correct nuget package and also try it out locally to make sure it works.

If there are any nuances about using this API, please add it to it's xml documentation.

Thanks.

#Resolved

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yep its there


In reply to: 275814495 [](ancestors = 275814495)


// Inspect the model's inputs and outputs
var session = new InferenceSession(modelPath);
var inputInfo = session.InputMetadata.First();
var outputInfo = session.OutputMetadata.First();
Console.WriteLine($"Input Name is {String.Join(",", inputInfo.Key)}");
Console.WriteLine($"Input Dimensions are {String.Join(",", inputInfo.Value.Dimensions)}");
Console.WriteLine($"Output Name is {String.Join(",", outputInfo.Key)}");
Console.WriteLine($"Output Dimensions are {String.Join(",", outputInfo.Value.Dimensions)}");
// Results..
// Input Name is data_0
// Input Dimensions are 1,3,224,224
// Output Name is softmaxout_1
// Output Dimensions are 1,1000,1,1

// Create ML pipeline to score the data using OnnxScoringEstimator
var mlContext = new MLContext();
var data = GetTensorData();
var idv = mlContext.Data.LoadFromEnumerable(data);
var pipeline = mlContext.Transforms.ApplyOnnxModel(new[] { outputInfo.Key }, new[] { inputInfo.Key }, modelPath);

// Run the pipeline and get the transformed values
var transformedValues = pipeline.Fit(idv).Transform(idv);

// Generate sample test data.
var samples = GetTensorData();
// Convert training data to IDataView, the general data type used in ML.NET.
var data = mlContext.Data.LoadFromEnumerable(samples);
// Create the pipeline to score using provided onnx model.
var pipeline = mlContext.Transforms.ApplyOnnxModel(modelPath);
// Fit the pipeline and get the transformed values
var transformedValues = pipeline.Fit(data).Transform(data);
// Retrieve model scores into Prediction class
var predictions = mlContext.Data.CreateEnumerable<Prediction>(transformedValues, reuseRowObject: false);

Expand All@@ -66,25 +50,18 @@ public static void Example()
// ----------
}

/// <summary>
/// inputSize is the overall dimensions of the model input tensor.
/// </summary>
// inputSize is the overall dimensions of the model input tensor.
private const int inputSize = 224 * 224 * 3;

/// <summary>
/// A class to hold sample tensor data. Member name should match
/// the inputs that the model expects (in this case, data_0)
/// </summary>
// A class to hold sample tensor data. Member name should match
// the inputs that the model expects (in this case, data_0)
public class TensorData
{
[VectorType(inputSize)]
public float[] data_0 { get; set; }
}

/// <summary>
/// Method to generate sample test data. Returns 2 sample rows.
/// </summary>
/// <returns></returns>
// Method to generate sample test data. Returns 2 sample rows.
public static TensorData[] GetTensorData()
{
// This can be any numerical data. Assume image pixel values.
Expand All@@ -93,10 +70,8 @@ public static TensorData[] GetTensorData()
return new TensorData[] { new TensorData() { data_0 = image1 }, new TensorData() { data_0 = image2 } };
}

/// <summary>
/// Class to contain the output values from the transformation.
/// This model generates a vector of 1000 floats.
/// </summary>
// Class to contain the output values from the transformation.
// This model generates a vector of 1000 floats.
class Prediction
{
[VectorType(1000)]
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,45 +2,29 @@
using System.Linq;
using Microsoft.ML;
using Microsoft.ML.Data;
using Microsoft.ML.OnnxRuntime;

namespace Samples.Dynamic
{
public static class OnnxTransformExample
public static class ApplyOnnxModel
{
/// <summary>
/// Example use of OnnxEstimator in an ML.NET pipeline
/// </summary>
public static void Example()
{
// Download the squeeznet image model from ONNX model zoo, version 1.2
// https://github.com/onnx/models/tree/master/squeezenet or use
// Microsoft.ML.Onnx.TestModels nuget.
var modelPath = @"squeezenet\00000001\model.onnx";

@shmoradimsshmoradimsApr 16, 2019

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please verify that this statement is true (you can double check with Jignesh):

  1. verify github link: Is the model.onnx in the squeezenet github link the same as squeezenet\00000001\model.onnx? I see manifest.json and 00000001 on our side which don't exist in the github link. Jignesh most likely has done an extra step to create squeezenet\00000001\model.onnx which users wouldn't know how to do.

  2. verify the nuget: Microsoft.ML.Onnx.TestModels was last updated 4 months ago on myget. It's also at version 0.0.4: https://dotnet.myget.org/feed/dotnet-core/package/nuget/Microsoft.ML.Onnx.TestModels

We also have this other similar nuget: https://dotnet.myget.org/feed/dotnet-core/package/nuget/Microsoft.ML.Onnx.TestModels

There has been a lot of reshuffling things. Please double check that we're naming the correct nuget package and also try it out locally to make sure it works.

If there are any nuances about using this API, please add it to it's xml documentation.

Thanks.

#Resolved

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yep its there


In reply to: 275814495 [](ancestors = 275814495)


// Inspect the model's inputs and outputs
var session = new InferenceSession(modelPath);
var inputInfo = session.InputMetadata.First();
var outputInfo = session.OutputMetadata.First();
Console.WriteLine($"Input Name is {String.Join(",", inputInfo.Key)}");
Console.WriteLine($"Input Dimensions are {String.Join(",", inputInfo.Value.Dimensions)}");
Console.WriteLine($"Output Name is {String.Join(",", outputInfo.Key)}");
Console.WriteLine($"Output Dimensions are {String.Join(",", outputInfo.Value.Dimensions)}");
// Results..
// Input Name is data_0
// Input Dimensions are 1,3,224,224
// Output Name is softmaxout_1
// Output Dimensions are 1,1000,1,1

// Create ML pipeline to score the data using OnnxScoringEstimator
var mlContext = new MLContext();
var data = GetTensorData();
var idv = mlContext.Data.LoadFromEnumerable(data);
var pipeline = mlContext.Transforms.ApplyOnnxModel(new[] { outputInfo.Key }, new[] { inputInfo.Key }, modelPath);

// Run the pipeline and get the transformed values
var transformedValues = pipeline.Fit(idv).Transform(idv);

// Generate sample test data.
var samples = GetTensorData();
// Convert training data to IDataView, the general data type used in ML.NET.
var data = mlContext.Data.LoadFromEnumerable(samples);
// Create the pipeline to score using provided onnx model.
var pipeline = mlContext.Transforms.ApplyOnnxModel(modelPath);
// Fit the pipeline and get the transformed values
var transformedValues = pipeline.Fit(data).Transform(data);
// Retrieve model scores into Prediction class
var predictions = mlContext.Data.CreateEnumerable<Prediction>(transformedValues, reuseRowObject: false);

Expand All@@ -66,25 +50,18 @@ public static void Example()
// ----------
}

/// <summary>
/// inputSize is the overall dimensions of the model input tensor.
/// </summary>
// inputSize is the overall dimensions of the model input tensor.
private const int inputSize = 224 * 224 * 3;

/// <summary>
/// A class to hold sample tensor data. Member name should match
/// the inputs that the model expects (in this case, data_0)
/// </summary>
// A class to hold sample tensor data. Member name should match
// the inputs that the model expects (in this case, data_0)
public class TensorData
{
[VectorType(inputSize)]
public float[] data_0 { get; set; }
}

/// <summary>
/// Method to generate sample test data. Returns 2 sample rows.
/// </summary>
/// <returns></returns>
// Method to generate sample test data. Returns 2 sample rows.
public static TensorData[] GetTensorData()
{
// This can be any numerical data. Assume image pixel values.
Expand All@@ -93,10 +70,8 @@ public static TensorData[] GetTensorData()
return new TensorData[] { new TensorData() { data_0 = image1 }, new TensorData() { data_0 = image2 } };
}

/// <summary>
/// Class to contain the output values from the transformation.
/// This model generates a vector of 1000 floats.
/// </summary>
// Class to contain the output values from the transformation.
// This model generates a vector of 1000 floats.
class Prediction
{
[VectorType(1000)]
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,45 +2,29 @@
using System.Linq;
using Microsoft.ML;
using Microsoft.ML.Data;
using Microsoft.ML.OnnxRuntime;

namespace Samples.Dynamic
{
public static class OnnxTransformExample
public static class ApplyOnnxModel
{
/// <summary>
/// Example use of OnnxEstimator in an ML.NET pipeline
/// </summary>
public static void Example()
{
// Download the squeeznet image model from ONNX model zoo, version 1.2
// https://github.com/onnx/models/tree/master/squeezenet or use
// Microsoft.ML.Onnx.TestModels nuget.
var modelPath = @"squeezenet\00000001\model.onnx";

@shmoradimsshmoradimsApr 16, 2019

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please verify that this statement is true (you can double check with Jignesh):

  1. verify github link: Is the model.onnx in the squeezenet github link the same as squeezenet\00000001\model.onnx? I see manifest.json and 00000001 on our side which don't exist in the github link. Jignesh most likely has done an extra step to create squeezenet\00000001\model.onnx which users wouldn't know how to do.

  2. verify the nuget: Microsoft.ML.Onnx.TestModels was last updated 4 months ago on myget. It's also at version 0.0.4: https://dotnet.myget.org/feed/dotnet-core/package/nuget/Microsoft.ML.Onnx.TestModels

We also have this other similar nuget: https://dotnet.myget.org/feed/dotnet-core/package/nuget/Microsoft.ML.Onnx.TestModels

There has been a lot of reshuffling things. Please double check that we're naming the correct nuget package and also try it out locally to make sure it works.

If there are any nuances about using this API, please add it to it's xml documentation.

Thanks.

#Resolved

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yep its there


In reply to: 275814495 [](ancestors = 275814495)


// Inspect the model's inputs and outputs
var session = new InferenceSession(modelPath);
var inputInfo = session.InputMetadata.First();
var outputInfo = session.OutputMetadata.First();
Console.WriteLine($"Input Name is {String.Join(",", inputInfo.Key)}");
Console.WriteLine($"Input Dimensions are {String.Join(",", inputInfo.Value.Dimensions)}");
Console.WriteLine($"Output Name is {String.Join(",", outputInfo.Key)}");
Console.WriteLine($"Output Dimensions are {String.Join(",", outputInfo.Value.Dimensions)}");
// Results..
// Input Name is data_0
// Input Dimensions are 1,3,224,224
// Output Name is softmaxout_1
// Output Dimensions are 1,1000,1,1

// Create ML pipeline to score the data using OnnxScoringEstimator
var mlContext = new MLContext();
var data = GetTensorData();
var idv = mlContext.Data.LoadFromEnumerable(data);
var pipeline = mlContext.Transforms.ApplyOnnxModel(new[] { outputInfo.Key }, new[] { inputInfo.Key }, modelPath);

// Run the pipeline and get the transformed values
var transformedValues = pipeline.Fit(idv).Transform(idv);

// Generate sample test data.
var samples = GetTensorData();
// Convert training data to IDataView, the general data type used in ML.NET.
var data = mlContext.Data.LoadFromEnumerable(samples);
// Create the pipeline to score using provided onnx model.
var pipeline = mlContext.Transforms.ApplyOnnxModel(modelPath);
// Fit the pipeline and get the transformed values
var transformedValues = pipeline.Fit(data).Transform(data);
// Retrieve model scores into Prediction class
var predictions = mlContext.Data.CreateEnumerable<Prediction>(transformedValues, reuseRowObject: false);

Expand All@@ -66,25 +50,18 @@ public static void Example()
// ----------
}

/// <summary>
/// inputSize is the overall dimensions of the model input tensor.
/// </summary>
// inputSize is the overall dimensions of the model input tensor.
private const int inputSize = 224 * 224 * 3;

/// <summary>
/// A class to hold sample tensor data. Member name should match
/// the inputs that the model expects (in this case, data_0)
/// </summary>
// A class to hold sample tensor data. Member name should match
// the inputs that the model expects (in this case, data_0)
public class TensorData
{
[VectorType(inputSize)]
public float[] data_0 { get; set; }
}

/// <summary>
/// Method to generate sample test data. Returns 2 sample rows.
/// </summary>
/// <returns></returns>
// Method to generate sample test data. Returns 2 sample rows.
public static TensorData[] GetTensorData()
{
// This can be any numerical data. Assume image pixel values.
Expand All@@ -93,10 +70,8 @@ public static TensorData[] GetTensorData()
return new TensorData[] { new TensorData() { data_0 = image1 }, new TensorData() { data_0 = image2 } };
}

/// <summary>
/// Class to contain the output values from the transformation.
/// This model generates a vector of 1000 floats.
/// </summary>
// Class to contain the output values from the transformation.
// This model generates a vector of 1000 floats.
class Prediction
{
[VectorType(1000)]
Expand Down