TensorFlowMapper transform for scoring Tensorflow models in ML.NET - #704

Merged
yaeldekel merged 61 commits into
dotnet:masterfrom
abgoswam:agoswami/tensorflow
Aug 30, 2018
Merged

TensorFlowMapper transform for scoring Tensorflow models in ML.NET#704
yaeldekel merged 61 commits into
dotnet:masterfrom
abgoswam:agoswami/tensorflow

Conversation

@abgoswam

@abgoswamabgoswam commented Aug 21, 2018

Copy link
Copy Markdown
Member

Fixes#696, #748#714

This PR creates a new transform 'TensorFlowMapper' for scoring Tensorflow models in ML.NET.

<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Update="TensorFlow\TensorGeneric.cs">

@Ivanidzo4kaIvanidzo4kaAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Shall we move tensorflow to separate project + separate nuget package? #Resolved

@ericstjericstjAug 22, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Yeah, I think everything that depends on TF (including the TensorFlowTransform) should be in a separate project + package. #Resolved

@ericstjericstjAug 22, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

If you'd like to leave that part to me you can. I can factor it out when I add the TF binaries. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

sounds good. lets address this as a separate follow up PR.

(marking as Pending for now)


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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Eric will address this as a separate follow up PR


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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

yes. we will address this in a separate follow up PR.


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

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This is now done.


In reply to: 212037611 [](ancestors = 212037611,211834354)

return new TensorValueGetter<T>(input, colIndex);
}

private ITensorValueGetter CreateTensorValueGetterVec(IRow input, TFDataType tfType, bool isVector, int colIndex, TFShape tfShape)

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Vec [](start = 62, length = 3)

We can get rid of this suffix, since there is no other CreateTensorValueGetter method. #Resolved

namespace Microsoft.ML.Transforms.TensorFlow
{

/// <summary>

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[](start = 0, length = 1)

Convert tabs to spaces. #Resolved


namespace Microsoft.ML.Transforms.TensorFlow
{
internal static partial class NativeBinding

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[](start = 0, length = 1)

Convert tabs to spaces. #Resolved

values = new T[OutputColType.VectorSize];

TensorflowUtils.FetchData<T>(tensors[0].Data, values);
dst = new VBuffer<T>(values.Length, values);

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

new VBuffer [](start = 26, length = 14)

Pass dst.Indices to the new VBuffer as well. #Resolved

@Ivanidzo4ka

Ivanidzo4ka commented Aug 22, 2018

Copy link
Copy Markdown
Contributor

@dotnet-bot Test OSX10.13 Release #Resolved

@abgoswam

abgoswam commented Aug 22, 2018

Copy link
Copy Markdown
MemberAuthor

@dotnet-bot Test OSX10.13 Release #Resolved

handle.Free();
}

internal static bool IsTypeSupported(TFDataType tfoutput)

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

IsTypeSupported [](start = 29, length = 15)

These are for input types, we should decide whether we'd like to support other types as well. #Resolved

@abgoswamabgoswamAug 22, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Hi Yael.. .. Should we track this as a separate task in the GitHub board we are using ?


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

@ericstj

ericstj commented Aug 23, 2018

Copy link
Copy Markdown
Member

You don't actually need to push a change to trigger a build. See @dotnet-bot help. #Resolved

@eerhardt

eerhardt commented Aug 23, 2018

Copy link
Copy Markdown
Member

Instead of checking in 25MBs of test model files, can we instead put those in a NuGet package, and pull them from myget.org or something? I don't think we should check in large files into the repo. #Resolved


namespace Microsoft.ML.Transforms
{
public static class TensorflowTransform

@eerhardteerhardtAug 23, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Do we want to hide "TensorFlow" from the public API? I thought the thinking was to hide the implementation details from the user. Is that no longer a goal? #Resolved

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nevermind, I was thinking of pre-trained featurizers.


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

public sealed class Arguments : TransformInputBase
{

[Argument(ArgumentType.Required, HelpText = "This is the frozen protobuf model file. Please see https://www.tensorflow.org/mobile/prepare_models for more detail(s).", ShortName = "ModelDir", SortOrder = 0)]

@Zruty0Zruty0Aug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

(s) [](start = 172, length = 3)

this is not needed. for details is what I'd suggest #Resolved

}

[TlcModule.EntryPoint(Name = "Transforms.TensorFlowScorer", Desc = Summary, UserName = UserName, ShortName = ShortName)]
public static CommonOutputs.TransformOutput Convert(IHostEnvironment env, Arguments input)

@Zruty0Zruty0Aug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Convert [](start = 52, length = 7)

Surely not Convert ? #Resolved

@@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk" DefaultTargets="Pack">

@eerhardteerhardtAug 29, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@ericstj - We should also have a ".symbols" pkgproj file. That way a symbols package gets produced and is uploaded to the symbols server for the managed assemblies in this package. See the other folders for an example. #Resolved

</PropertyGroup>

<ItemGroup>
<ProjectRefernce Include="..\Microsoft.ML.TensorFlow.Redist\Microsoft.ML.TensorFlow.Redist.pkgproj" />

@eerhardteerhardtAug 29, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this a type-o? ProjectRefernce #Resolved

@ericstjericstjAug 29, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Doh, good catch #Resolved

@Zruty0Zruty0 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

:shipit:

We didn't define ExtractDirectory on the item and instead had a full path as identity.
This worked on linux/osx since it prepended a ""/ to the path, which was tolerated by the file system (an extra leading slash).
On Windows this doesn't work or course.
Fix by appending to the item that doesn't assume files came from an archive.
@ericstj

ericstj commented Aug 29, 2018

Copy link
Copy Markdown
Member

Linux tests failed with

Failed Microsoft.ML.Runtime.RunTests.TestEntryPoints.EntryPointPoissonRegression
2018-08-29T17:03:30.2425699Z Error Message:
2018-08-29T17:03:30.2438651Z System.FormatException : Stream reading encountered exception
2018-08-29T17:03:30.2453212Z ---- System.IO.FileNotFoundException : Could not find file '/__w/19/s/test/data/external/winequality-white.csv'.
2018-08-29T17:03:30.2467248Z Stack Trace:
2018-08-29T17:03:30.2480707Z at Microsoft.ML.Runtime.Data.TextLoader.Cursor.LineReader.GetBatch() in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs:line 475
2018-08-29T17:03:30.2504317Z at Microsoft.ML.Runtime.Data.TextLoader.Cursor.GetSomeLines(IMultiStreamSource source, Int32 count, List`1& lines) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs:line 228
2018-08-29T17:03:30.2518542Z at Microsoft.ML.Runtime.Data.TextLoader.Bindings..ctor(TextLoader parent, Column[] cols, IMultiStreamSource headerFile, IMultiStreamSource dataSample) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs:line 536
2018-08-29T17:03:30.2532894Z at Microsoft.ML.Runtime.Data.TextLoader..ctor(IHostEnvironment env, Arguments args, IMultiStreamSource dataSample) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs:line 1073
2018-08-29T17:03:30.2546955Z at Microsoft.ML.Runtime.Data.TextLoader.Create(IHostEnvironment env, Arguments args, IMultiStreamSource files) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs:line 1260
2018-08-29T17:03:30.2561108Z ----- Inner Stack Trace -----
2018-08-29T17:03:30.2575935Z at Interop.ThrowExceptionForIoErrno(ErrorInfo errorInfo, String path, Boolean isDirectory, Func`2 errorRewriter)
2018-08-29T17:03:30.2589645Z at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String path, OpenFlags flags, Int32 mode)
2018-08-29T17:03:30.2603216Z at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
2018-08-29T17:03:30.2616853Z at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
2018-08-29T17:03:30.2630306Z at Microsoft.ML.Runtime.SimpleFileHandle.OpenReadStream() in /__w/19/s/src/Microsoft.ML.Core/Data/IFileHandle.cs:line 197
2018-08-29T17:03:30.2645127Z at Microsoft.ML.Runtime.Data.FileHandleSource.Open(Int32 index) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/MultiFileSource.cs:line 94
2018-08-29T17:03:30.2660036Z at Microsoft.ML.Runtime.Data.FileHandleSource.OpenTextReader(Int32 index) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/MultiFileSource.cs:line 99
2018-08-29T17:03:30.2673648Z at Microsoft.ML.Runtime.Data.TextLoader.Cursor.LineReader.ThreadProc() in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs:line 491
2018-08-29T17:03:30.2687123Z Standard Output Messages:
2018-08-29T17:03:30.2700414Z Test EntryPointPoissonRegression: aborted: passed
2018-08-29T17:03:30.2706900Z ``` #Resolved

The transform currently accepts the <a href="https://www.tensorflow.org/mobile/prepare_models">frozen TensorFlow model</a> file as input.
</item>
<item>The transform supports scoring only one example at a time.</item>
<item>The name of input column(s) should match the name of input(s) in Tensorflow model.</item>

@GalOshriGalOshriAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

If the input columns have to match the names of the inputs in the TF model, is this parameter needed just to identify which subset of columns should be used? Would a user need to rename the columns before adding this transform? #Resolved

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This is basically to map columns in IDataView to inputs in TF model. If the names are kept same we wont have to specify the mapping. The other possibility would be to have overloaded constructor where we can define which column in IDataView maps to which input to TF model using a dictionary.

Right now, yes column needs to be renamed before using this transform.


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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

I have created issue #769 to track this. For now, what Zeeshan said is correct. Perhaps we should add more details here, explaining how to rename data view columns.


In reply to: 213797869 [](ancestors = 213797869,213780817)

Upon success, the transform will introduce a new column in <see cref="IDataView"/> based on the name of the output column specified.
</item>
</list>
</remarks>

@GalOshriGalOshriAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Should we add an explanation of the type of input that is expected? Maybe it is just to clarify that it has to be whatever format the TF model expects, or more detail regarding how images would need to be loaded through a different set of transforms. #Resolved

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Do you mean a detailed sample?


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

@GalOshriGalOshriAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

No, but just an explanation of what should be provided. If I'm new to image classification, how do I find out that I need to transform the images to be in the same format that the pretrained TF model expects? Maybe this is not the right place for this though. #Resolved

var shape = tfShapes[i].ToIntArray().Skip(tfShapes[i][0] == -1 ? BatchSize : 0);
if (type.AsVector.DimCount == 1)
{
int valCount = shape.Aggregate((x, y) => x * y);

@abgoswamabgoswamAug 29, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

So if data is 1d we will verify with the product of dimensions in the model. But if data passed in is multi-dimensional then we verify if each of the individual dimensions match. Is that the intent of this change..

do you think it might be useful to also display the shapes that mismatch ? #Closed

@abgoswamabgoswam left a comment

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Thanks for adding this

@yaeldekelyaeldekel left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

:shipit:

@yaeldekel
yaeldekel removed the request for review from ericstjAugust 30, 2018 02:30
@yaeldekel
yaeldekel merged commit 5ef7a08 into dotnet:masterAug 30, 2018
Comment threadsrc/Microsoft.ML.TensorFlow/Microsoft.ML.TensorFlow.csproj
@yaeldekel
yaeldekel deleted the agoswami/tensorflow branch August 30, 2018 15:22
Comment threadtest/Microsoft.ML.Tests/Scenarios/TensorflowTests.cs
Comment threadtest/Microsoft.ML.Tests/Scenarios/TensorflowTests.cs
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants

@abgoswam@Ivanidzo4ka@ericstj@eerhardt@GalOshri@yaeldekel@zeahmed@Zruty0@shauheen@yaeldMS
, '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

TensorFlowMapper transform for scoring Tensorflow models in ML.NET - #704

Merged
yaeldekel merged 61 commits into
dotnet:masterfrom
abgoswam:agoswami/tensorflow
Aug 30, 2018
Merged

TensorFlowMapper transform for scoring Tensorflow models in ML.NET#704
yaeldekel merged 61 commits into
dotnet:masterfrom
abgoswam:agoswami/tensorflow

Conversation

@abgoswam

@abgoswamabgoswam commented Aug 21, 2018

Copy link
Copy Markdown
Member

Fixes#696, #748#714

This PR creates a new transform 'TensorFlowMapper' for scoring Tensorflow models in ML.NET.

<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Update="TensorFlow\TensorGeneric.cs">

@Ivanidzo4kaIvanidzo4kaAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Shall we move tensorflow to separate project + separate nuget package? #Resolved

@ericstjericstjAug 22, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Yeah, I think everything that depends on TF (including the TensorFlowTransform) should be in a separate project + package. #Resolved

@ericstjericstjAug 22, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

If you'd like to leave that part to me you can. I can factor it out when I add the TF binaries. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

sounds good. lets address this as a separate follow up PR.

(marking as Pending for now)


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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Eric will address this as a separate follow up PR


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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

yes. we will address this in a separate follow up PR.


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

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This is now done.


In reply to: 212037611 [](ancestors = 212037611,211834354)

return new TensorValueGetter<T>(input, colIndex);
}

private ITensorValueGetter CreateTensorValueGetterVec(IRow input, TFDataType tfType, bool isVector, int colIndex, TFShape tfShape)

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Vec [](start = 62, length = 3)

We can get rid of this suffix, since there is no other CreateTensorValueGetter method. #Resolved

namespace Microsoft.ML.Transforms.TensorFlow
{

/// <summary>

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[](start = 0, length = 1)

Convert tabs to spaces. #Resolved


namespace Microsoft.ML.Transforms.TensorFlow
{
internal static partial class NativeBinding

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[](start = 0, length = 1)

Convert tabs to spaces. #Resolved

values = new T[OutputColType.VectorSize];

TensorflowUtils.FetchData<T>(tensors[0].Data, values);
dst = new VBuffer<T>(values.Length, values);

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

new VBuffer [](start = 26, length = 14)

Pass dst.Indices to the new VBuffer as well. #Resolved

@Ivanidzo4ka

Ivanidzo4ka commented Aug 22, 2018

Copy link
Copy Markdown
Contributor

@dotnet-bot Test OSX10.13 Release #Resolved

@abgoswam

abgoswam commented Aug 22, 2018

Copy link
Copy Markdown
MemberAuthor

@dotnet-bot Test OSX10.13 Release #Resolved

handle.Free();
}

internal static bool IsTypeSupported(TFDataType tfoutput)

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

IsTypeSupported [](start = 29, length = 15)

These are for input types, we should decide whether we'd like to support other types as well. #Resolved

@abgoswamabgoswamAug 22, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Hi Yael.. .. Should we track this as a separate task in the GitHub board we are using ?


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

@ericstj

ericstj commented Aug 23, 2018

Copy link
Copy Markdown
Member

You don't actually need to push a change to trigger a build. See @dotnet-bot help. #Resolved

@eerhardt

eerhardt commented Aug 23, 2018

Copy link
Copy Markdown
Member

Instead of checking in 25MBs of test model files, can we instead put those in a NuGet package, and pull them from myget.org or something? I don't think we should check in large files into the repo. #Resolved


namespace Microsoft.ML.Transforms
{
public static class TensorflowTransform

@eerhardteerhardtAug 23, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Do we want to hide "TensorFlow" from the public API? I thought the thinking was to hide the implementation details from the user. Is that no longer a goal? #Resolved

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nevermind, I was thinking of pre-trained featurizers.


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

public sealed class Arguments : TransformInputBase
{

[Argument(ArgumentType.Required, HelpText = "This is the frozen protobuf model file. Please see https://www.tensorflow.org/mobile/prepare_models for more detail(s).", ShortName = "ModelDir", SortOrder = 0)]

@Zruty0Zruty0Aug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

(s) [](start = 172, length = 3)

this is not needed. for details is what I'd suggest #Resolved

}

[TlcModule.EntryPoint(Name = "Transforms.TensorFlowScorer", Desc = Summary, UserName = UserName, ShortName = ShortName)]
public static CommonOutputs.TransformOutput Convert(IHostEnvironment env, Arguments input)

@Zruty0Zruty0Aug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Convert [](start = 52, length = 7)

Surely not Convert ? #Resolved

@@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk" DefaultTargets="Pack">

@eerhardteerhardtAug 29, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@ericstj - We should also have a ".symbols" pkgproj file. That way a symbols package gets produced and is uploaded to the symbols server for the managed assemblies in this package. See the other folders for an example. #Resolved

</PropertyGroup>

<ItemGroup>
<ProjectRefernce Include="..\Microsoft.ML.TensorFlow.Redist\Microsoft.ML.TensorFlow.Redist.pkgproj" />

@eerhardteerhardtAug 29, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this a type-o? ProjectRefernce #Resolved

@ericstjericstjAug 29, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Doh, good catch #Resolved

@Zruty0Zruty0 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

:shipit:

We didn't define ExtractDirectory on the item and instead had a full path as identity.
This worked on linux/osx since it prepended a ""/ to the path, which was tolerated by the file system (an extra leading slash).
On Windows this doesn't work or course.
Fix by appending to the item that doesn't assume files came from an archive.
@ericstj

ericstj commented Aug 29, 2018

Copy link
Copy Markdown
Member

Linux tests failed with

Failed Microsoft.ML.Runtime.RunTests.TestEntryPoints.EntryPointPoissonRegression
2018-08-29T17:03:30.2425699Z Error Message:
2018-08-29T17:03:30.2438651Z System.FormatException : Stream reading encountered exception
2018-08-29T17:03:30.2453212Z ---- System.IO.FileNotFoundException : Could not find file '/__w/19/s/test/data/external/winequality-white.csv'.
2018-08-29T17:03:30.2467248Z Stack Trace:
2018-08-29T17:03:30.2480707Z at Microsoft.ML.Runtime.Data.TextLoader.Cursor.LineReader.GetBatch() in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs:line 475
2018-08-29T17:03:30.2504317Z at Microsoft.ML.Runtime.Data.TextLoader.Cursor.GetSomeLines(IMultiStreamSource source, Int32 count, List`1& lines) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs:line 228
2018-08-29T17:03:30.2518542Z at Microsoft.ML.Runtime.Data.TextLoader.Bindings..ctor(TextLoader parent, Column[] cols, IMultiStreamSource headerFile, IMultiStreamSource dataSample) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs:line 536
2018-08-29T17:03:30.2532894Z at Microsoft.ML.Runtime.Data.TextLoader..ctor(IHostEnvironment env, Arguments args, IMultiStreamSource dataSample) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs:line 1073
2018-08-29T17:03:30.2546955Z at Microsoft.ML.Runtime.Data.TextLoader.Create(IHostEnvironment env, Arguments args, IMultiStreamSource files) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs:line 1260
2018-08-29T17:03:30.2561108Z ----- Inner Stack Trace -----
2018-08-29T17:03:30.2575935Z at Interop.ThrowExceptionForIoErrno(ErrorInfo errorInfo, String path, Boolean isDirectory, Func`2 errorRewriter)
2018-08-29T17:03:30.2589645Z at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String path, OpenFlags flags, Int32 mode)
2018-08-29T17:03:30.2603216Z at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
2018-08-29T17:03:30.2616853Z at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
2018-08-29T17:03:30.2630306Z at Microsoft.ML.Runtime.SimpleFileHandle.OpenReadStream() in /__w/19/s/src/Microsoft.ML.Core/Data/IFileHandle.cs:line 197
2018-08-29T17:03:30.2645127Z at Microsoft.ML.Runtime.Data.FileHandleSource.Open(Int32 index) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/MultiFileSource.cs:line 94
2018-08-29T17:03:30.2660036Z at Microsoft.ML.Runtime.Data.FileHandleSource.OpenTextReader(Int32 index) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/MultiFileSource.cs:line 99
2018-08-29T17:03:30.2673648Z at Microsoft.ML.Runtime.Data.TextLoader.Cursor.LineReader.ThreadProc() in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs:line 491
2018-08-29T17:03:30.2687123Z Standard Output Messages:
2018-08-29T17:03:30.2700414Z Test EntryPointPoissonRegression: aborted: passed
2018-08-29T17:03:30.2706900Z ``` #Resolved

The transform currently accepts the <a href="https://www.tensorflow.org/mobile/prepare_models">frozen TensorFlow model</a> file as input.
</item>
<item>The transform supports scoring only one example at a time.</item>
<item>The name of input column(s) should match the name of input(s) in Tensorflow model.</item>

@GalOshriGalOshriAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

If the input columns have to match the names of the inputs in the TF model, is this parameter needed just to identify which subset of columns should be used? Would a user need to rename the columns before adding this transform? #Resolved

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This is basically to map columns in IDataView to inputs in TF model. If the names are kept same we wont have to specify the mapping. The other possibility would be to have overloaded constructor where we can define which column in IDataView maps to which input to TF model using a dictionary.

Right now, yes column needs to be renamed before using this transform.


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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

I have created issue #769 to track this. For now, what Zeeshan said is correct. Perhaps we should add more details here, explaining how to rename data view columns.


In reply to: 213797869 [](ancestors = 213797869,213780817)

Upon success, the transform will introduce a new column in <see cref="IDataView"/> based on the name of the output column specified.
</item>
</list>
</remarks>

@GalOshriGalOshriAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Should we add an explanation of the type of input that is expected? Maybe it is just to clarify that it has to be whatever format the TF model expects, or more detail regarding how images would need to be loaded through a different set of transforms. #Resolved

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Do you mean a detailed sample?


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

@GalOshriGalOshriAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

No, but just an explanation of what should be provided. If I'm new to image classification, how do I find out that I need to transform the images to be in the same format that the pretrained TF model expects? Maybe this is not the right place for this though. #Resolved

var shape = tfShapes[i].ToIntArray().Skip(tfShapes[i][0] == -1 ? BatchSize : 0);
if (type.AsVector.DimCount == 1)
{
int valCount = shape.Aggregate((x, y) => x * y);

@abgoswamabgoswamAug 29, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

So if data is 1d we will verify with the product of dimensions in the model. But if data passed in is multi-dimensional then we verify if each of the individual dimensions match. Is that the intent of this change..

do you think it might be useful to also display the shapes that mismatch ? #Closed

@abgoswamabgoswam left a comment

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Thanks for adding this

@yaeldekelyaeldekel left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

:shipit:

@yaeldekel
yaeldekel removed the request for review from ericstjAugust 30, 2018 02:30
@yaeldekel
yaeldekel merged commit 5ef7a08 into dotnet:masterAug 30, 2018
Comment threadsrc/Microsoft.ML.TensorFlow/Microsoft.ML.TensorFlow.csproj
@yaeldekel
yaeldekel deleted the agoswami/tensorflow branch August 30, 2018 15:22
Comment threadtest/Microsoft.ML.Tests/Scenarios/TensorflowTests.cs
Comment threadtest/Microsoft.ML.Tests/Scenarios/TensorflowTests.cs
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants

@abgoswam@Ivanidzo4ka@ericstj@eerhardt@GalOshri@yaeldekel@zeahmed@Zruty0@shauheen@yaeldMS
, '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

TensorFlowMapper transform for scoring Tensorflow models in ML.NET - #704

Merged
yaeldekel merged 61 commits into
dotnet:masterfrom
abgoswam:agoswami/tensorflow
Aug 30, 2018
Merged

TensorFlowMapper transform for scoring Tensorflow models in ML.NET#704
yaeldekel merged 61 commits into
dotnet:masterfrom
abgoswam:agoswami/tensorflow

Conversation

@abgoswam

@abgoswamabgoswam commented Aug 21, 2018

Copy link
Copy Markdown
Member

Fixes#696, #748#714

This PR creates a new transform 'TensorFlowMapper' for scoring Tensorflow models in ML.NET.

<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Update="TensorFlow\TensorGeneric.cs">

@Ivanidzo4kaIvanidzo4kaAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Shall we move tensorflow to separate project + separate nuget package? #Resolved

@ericstjericstjAug 22, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Yeah, I think everything that depends on TF (including the TensorFlowTransform) should be in a separate project + package. #Resolved

@ericstjericstjAug 22, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

If you'd like to leave that part to me you can. I can factor it out when I add the TF binaries. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

sounds good. lets address this as a separate follow up PR.

(marking as Pending for now)


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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Eric will address this as a separate follow up PR


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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

yes. we will address this in a separate follow up PR.


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

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This is now done.


In reply to: 212037611 [](ancestors = 212037611,211834354)

return new TensorValueGetter<T>(input, colIndex);
}

private ITensorValueGetter CreateTensorValueGetterVec(IRow input, TFDataType tfType, bool isVector, int colIndex, TFShape tfShape)

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Vec [](start = 62, length = 3)

We can get rid of this suffix, since there is no other CreateTensorValueGetter method. #Resolved

namespace Microsoft.ML.Transforms.TensorFlow
{

/// <summary>

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[](start = 0, length = 1)

Convert tabs to spaces. #Resolved


namespace Microsoft.ML.Transforms.TensorFlow
{
internal static partial class NativeBinding

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[](start = 0, length = 1)

Convert tabs to spaces. #Resolved

values = new T[OutputColType.VectorSize];

TensorflowUtils.FetchData<T>(tensors[0].Data, values);
dst = new VBuffer<T>(values.Length, values);

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

new VBuffer [](start = 26, length = 14)

Pass dst.Indices to the new VBuffer as well. #Resolved

@Ivanidzo4ka

Ivanidzo4ka commented Aug 22, 2018

Copy link
Copy Markdown
Contributor

@dotnet-bot Test OSX10.13 Release #Resolved

@abgoswam

abgoswam commented Aug 22, 2018

Copy link
Copy Markdown
MemberAuthor

@dotnet-bot Test OSX10.13 Release #Resolved

handle.Free();
}

internal static bool IsTypeSupported(TFDataType tfoutput)

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

IsTypeSupported [](start = 29, length = 15)

These are for input types, we should decide whether we'd like to support other types as well. #Resolved

@abgoswamabgoswamAug 22, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Hi Yael.. .. Should we track this as a separate task in the GitHub board we are using ?


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

@ericstj

ericstj commented Aug 23, 2018

Copy link
Copy Markdown
Member

You don't actually need to push a change to trigger a build. See @dotnet-bot help. #Resolved

@eerhardt

eerhardt commented Aug 23, 2018

Copy link
Copy Markdown
Member

Instead of checking in 25MBs of test model files, can we instead put those in a NuGet package, and pull them from myget.org or something? I don't think we should check in large files into the repo. #Resolved


namespace Microsoft.ML.Transforms
{
public static class TensorflowTransform

@eerhardteerhardtAug 23, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Do we want to hide "TensorFlow" from the public API? I thought the thinking was to hide the implementation details from the user. Is that no longer a goal? #Resolved

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nevermind, I was thinking of pre-trained featurizers.


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

public sealed class Arguments : TransformInputBase
{

[Argument(ArgumentType.Required, HelpText = "This is the frozen protobuf model file. Please see https://www.tensorflow.org/mobile/prepare_models for more detail(s).", ShortName = "ModelDir", SortOrder = 0)]

@Zruty0Zruty0Aug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

(s) [](start = 172, length = 3)

this is not needed. for details is what I'd suggest #Resolved

}

[TlcModule.EntryPoint(Name = "Transforms.TensorFlowScorer", Desc = Summary, UserName = UserName, ShortName = ShortName)]
public static CommonOutputs.TransformOutput Convert(IHostEnvironment env, Arguments input)

@Zruty0Zruty0Aug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Convert [](start = 52, length = 7)

Surely not Convert ? #Resolved

@@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk" DefaultTargets="Pack">

@eerhardteerhardtAug 29, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@ericstj - We should also have a ".symbols" pkgproj file. That way a symbols package gets produced and is uploaded to the symbols server for the managed assemblies in this package. See the other folders for an example. #Resolved

</PropertyGroup>

<ItemGroup>
<ProjectRefernce Include="..\Microsoft.ML.TensorFlow.Redist\Microsoft.ML.TensorFlow.Redist.pkgproj" />

@eerhardteerhardtAug 29, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this a type-o? ProjectRefernce #Resolved

@ericstjericstjAug 29, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Doh, good catch #Resolved

@Zruty0Zruty0 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

:shipit:

We didn't define ExtractDirectory on the item and instead had a full path as identity.
This worked on linux/osx since it prepended a ""/ to the path, which was tolerated by the file system (an extra leading slash).
On Windows this doesn't work or course.
Fix by appending to the item that doesn't assume files came from an archive.
@ericstj

ericstj commented Aug 29, 2018

Copy link
Copy Markdown
Member

Linux tests failed with

Failed Microsoft.ML.Runtime.RunTests.TestEntryPoints.EntryPointPoissonRegression
2018-08-29T17:03:30.2425699Z Error Message:
2018-08-29T17:03:30.2438651Z System.FormatException : Stream reading encountered exception
2018-08-29T17:03:30.2453212Z ---- System.IO.FileNotFoundException : Could not find file '/__w/19/s/test/data/external/winequality-white.csv'.
2018-08-29T17:03:30.2467248Z Stack Trace:
2018-08-29T17:03:30.2480707Z at Microsoft.ML.Runtime.Data.TextLoader.Cursor.LineReader.GetBatch() in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs:line 475
2018-08-29T17:03:30.2504317Z at Microsoft.ML.Runtime.Data.TextLoader.Cursor.GetSomeLines(IMultiStreamSource source, Int32 count, List`1& lines) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs:line 228
2018-08-29T17:03:30.2518542Z at Microsoft.ML.Runtime.Data.TextLoader.Bindings..ctor(TextLoader parent, Column[] cols, IMultiStreamSource headerFile, IMultiStreamSource dataSample) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs:line 536
2018-08-29T17:03:30.2532894Z at Microsoft.ML.Runtime.Data.TextLoader..ctor(IHostEnvironment env, Arguments args, IMultiStreamSource dataSample) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs:line 1073
2018-08-29T17:03:30.2546955Z at Microsoft.ML.Runtime.Data.TextLoader.Create(IHostEnvironment env, Arguments args, IMultiStreamSource files) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs:line 1260
2018-08-29T17:03:30.2561108Z ----- Inner Stack Trace -----
2018-08-29T17:03:30.2575935Z at Interop.ThrowExceptionForIoErrno(ErrorInfo errorInfo, String path, Boolean isDirectory, Func`2 errorRewriter)
2018-08-29T17:03:30.2589645Z at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String path, OpenFlags flags, Int32 mode)
2018-08-29T17:03:30.2603216Z at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
2018-08-29T17:03:30.2616853Z at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
2018-08-29T17:03:30.2630306Z at Microsoft.ML.Runtime.SimpleFileHandle.OpenReadStream() in /__w/19/s/src/Microsoft.ML.Core/Data/IFileHandle.cs:line 197
2018-08-29T17:03:30.2645127Z at Microsoft.ML.Runtime.Data.FileHandleSource.Open(Int32 index) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/MultiFileSource.cs:line 94
2018-08-29T17:03:30.2660036Z at Microsoft.ML.Runtime.Data.FileHandleSource.OpenTextReader(Int32 index) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/MultiFileSource.cs:line 99
2018-08-29T17:03:30.2673648Z at Microsoft.ML.Runtime.Data.TextLoader.Cursor.LineReader.ThreadProc() in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs:line 491
2018-08-29T17:03:30.2687123Z Standard Output Messages:
2018-08-29T17:03:30.2700414Z Test EntryPointPoissonRegression: aborted: passed
2018-08-29T17:03:30.2706900Z ``` #Resolved

The transform currently accepts the <a href="https://www.tensorflow.org/mobile/prepare_models">frozen TensorFlow model</a> file as input.
</item>
<item>The transform supports scoring only one example at a time.</item>
<item>The name of input column(s) should match the name of input(s) in Tensorflow model.</item>

@GalOshriGalOshriAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

If the input columns have to match the names of the inputs in the TF model, is this parameter needed just to identify which subset of columns should be used? Would a user need to rename the columns before adding this transform? #Resolved

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This is basically to map columns in IDataView to inputs in TF model. If the names are kept same we wont have to specify the mapping. The other possibility would be to have overloaded constructor where we can define which column in IDataView maps to which input to TF model using a dictionary.

Right now, yes column needs to be renamed before using this transform.


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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

I have created issue #769 to track this. For now, what Zeeshan said is correct. Perhaps we should add more details here, explaining how to rename data view columns.


In reply to: 213797869 [](ancestors = 213797869,213780817)

Upon success, the transform will introduce a new column in <see cref="IDataView"/> based on the name of the output column specified.
</item>
</list>
</remarks>

@GalOshriGalOshriAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Should we add an explanation of the type of input that is expected? Maybe it is just to clarify that it has to be whatever format the TF model expects, or more detail regarding how images would need to be loaded through a different set of transforms. #Resolved

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Do you mean a detailed sample?


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

@GalOshriGalOshriAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

No, but just an explanation of what should be provided. If I'm new to image classification, how do I find out that I need to transform the images to be in the same format that the pretrained TF model expects? Maybe this is not the right place for this though. #Resolved

var shape = tfShapes[i].ToIntArray().Skip(tfShapes[i][0] == -1 ? BatchSize : 0);
if (type.AsVector.DimCount == 1)
{
int valCount = shape.Aggregate((x, y) => x * y);

@abgoswamabgoswamAug 29, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

So if data is 1d we will verify with the product of dimensions in the model. But if data passed in is multi-dimensional then we verify if each of the individual dimensions match. Is that the intent of this change..

do you think it might be useful to also display the shapes that mismatch ? #Closed

@abgoswamabgoswam left a comment

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Thanks for adding this

@yaeldekelyaeldekel left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

:shipit:

@yaeldekel
yaeldekel removed the request for review from ericstjAugust 30, 2018 02:30
@yaeldekel
yaeldekel merged commit 5ef7a08 into dotnet:masterAug 30, 2018
Comment threadsrc/Microsoft.ML.TensorFlow/Microsoft.ML.TensorFlow.csproj
@yaeldekel
yaeldekel deleted the agoswami/tensorflow branch August 30, 2018 15:22
Comment threadtest/Microsoft.ML.Tests/Scenarios/TensorflowTests.cs
Comment threadtest/Microsoft.ML.Tests/Scenarios/TensorflowTests.cs
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants

@abgoswam@Ivanidzo4ka@ericstj@eerhardt@GalOshri@yaeldekel@zeahmed@Zruty0@shauheen@yaeldMS
, '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

TensorFlowMapper transform for scoring Tensorflow models in ML.NET - #704

Merged
yaeldekel merged 61 commits into
dotnet:masterfrom
abgoswam:agoswami/tensorflow
Aug 30, 2018
Merged

TensorFlowMapper transform for scoring Tensorflow models in ML.NET#704
yaeldekel merged 61 commits into
dotnet:masterfrom
abgoswam:agoswami/tensorflow

Conversation

@abgoswam

@abgoswamabgoswam commented Aug 21, 2018

Copy link
Copy Markdown
Member

Fixes#696, #748#714

This PR creates a new transform 'TensorFlowMapper' for scoring Tensorflow models in ML.NET.

<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Update="TensorFlow\TensorGeneric.cs">

@Ivanidzo4kaIvanidzo4kaAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Shall we move tensorflow to separate project + separate nuget package? #Resolved

@ericstjericstjAug 22, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Yeah, I think everything that depends on TF (including the TensorFlowTransform) should be in a separate project + package. #Resolved

@ericstjericstjAug 22, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

If you'd like to leave that part to me you can. I can factor it out when I add the TF binaries. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

sounds good. lets address this as a separate follow up PR.

(marking as Pending for now)


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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Eric will address this as a separate follow up PR


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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

yes. we will address this in a separate follow up PR.


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

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This is now done.


In reply to: 212037611 [](ancestors = 212037611,211834354)

return new TensorValueGetter<T>(input, colIndex);
}

private ITensorValueGetter CreateTensorValueGetterVec(IRow input, TFDataType tfType, bool isVector, int colIndex, TFShape tfShape)

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Vec [](start = 62, length = 3)

We can get rid of this suffix, since there is no other CreateTensorValueGetter method. #Resolved

namespace Microsoft.ML.Transforms.TensorFlow
{

/// <summary>

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[](start = 0, length = 1)

Convert tabs to spaces. #Resolved


namespace Microsoft.ML.Transforms.TensorFlow
{
internal static partial class NativeBinding

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[](start = 0, length = 1)

Convert tabs to spaces. #Resolved

values = new T[OutputColType.VectorSize];

TensorflowUtils.FetchData<T>(tensors[0].Data, values);
dst = new VBuffer<T>(values.Length, values);

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

new VBuffer [](start = 26, length = 14)

Pass dst.Indices to the new VBuffer as well. #Resolved

@Ivanidzo4ka

Ivanidzo4ka commented Aug 22, 2018

Copy link
Copy Markdown
Contributor

@dotnet-bot Test OSX10.13 Release #Resolved

@abgoswam

abgoswam commented Aug 22, 2018

Copy link
Copy Markdown
MemberAuthor

@dotnet-bot Test OSX10.13 Release #Resolved

handle.Free();
}

internal static bool IsTypeSupported(TFDataType tfoutput)

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

IsTypeSupported [](start = 29, length = 15)

These are for input types, we should decide whether we'd like to support other types as well. #Resolved

@abgoswamabgoswamAug 22, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Hi Yael.. .. Should we track this as a separate task in the GitHub board we are using ?


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

@ericstj

ericstj commented Aug 23, 2018

Copy link
Copy Markdown
Member

You don't actually need to push a change to trigger a build. See @dotnet-bot help. #Resolved

@eerhardt

eerhardt commented Aug 23, 2018

Copy link
Copy Markdown
Member

Instead of checking in 25MBs of test model files, can we instead put those in a NuGet package, and pull them from myget.org or something? I don't think we should check in large files into the repo. #Resolved


namespace Microsoft.ML.Transforms
{
public static class TensorflowTransform

@eerhardteerhardtAug 23, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Do we want to hide "TensorFlow" from the public API? I thought the thinking was to hide the implementation details from the user. Is that no longer a goal? #Resolved

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nevermind, I was thinking of pre-trained featurizers.


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

public sealed class Arguments : TransformInputBase
{

[Argument(ArgumentType.Required, HelpText = "This is the frozen protobuf model file. Please see https://www.tensorflow.org/mobile/prepare_models for more detail(s).", ShortName = "ModelDir", SortOrder = 0)]

@Zruty0Zruty0Aug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

(s) [](start = 172, length = 3)

this is not needed. for details is what I'd suggest #Resolved

}

[TlcModule.EntryPoint(Name = "Transforms.TensorFlowScorer", Desc = Summary, UserName = UserName, ShortName = ShortName)]
public static CommonOutputs.TransformOutput Convert(IHostEnvironment env, Arguments input)

@Zruty0Zruty0Aug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Convert [](start = 52, length = 7)

Surely not Convert ? #Resolved

@@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk" DefaultTargets="Pack">

@eerhardteerhardtAug 29, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@ericstj - We should also have a ".symbols" pkgproj file. That way a symbols package gets produced and is uploaded to the symbols server for the managed assemblies in this package. See the other folders for an example. #Resolved

</PropertyGroup>

<ItemGroup>
<ProjectRefernce Include="..\Microsoft.ML.TensorFlow.Redist\Microsoft.ML.TensorFlow.Redist.pkgproj" />

@eerhardteerhardtAug 29, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this a type-o? ProjectRefernce #Resolved

@ericstjericstjAug 29, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Doh, good catch #Resolved

@Zruty0Zruty0 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

:shipit:

We didn't define ExtractDirectory on the item and instead had a full path as identity.
This worked on linux/osx since it prepended a ""/ to the path, which was tolerated by the file system (an extra leading slash).
On Windows this doesn't work or course.
Fix by appending to the item that doesn't assume files came from an archive.
@ericstj

ericstj commented Aug 29, 2018

Copy link
Copy Markdown
Member

Linux tests failed with

Failed Microsoft.ML.Runtime.RunTests.TestEntryPoints.EntryPointPoissonRegression
2018-08-29T17:03:30.2425699Z Error Message:
2018-08-29T17:03:30.2438651Z System.FormatException : Stream reading encountered exception
2018-08-29T17:03:30.2453212Z ---- System.IO.FileNotFoundException : Could not find file '/__w/19/s/test/data/external/winequality-white.csv'.
2018-08-29T17:03:30.2467248Z Stack Trace:
2018-08-29T17:03:30.2480707Z at Microsoft.ML.Runtime.Data.TextLoader.Cursor.LineReader.GetBatch() in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs:line 475
2018-08-29T17:03:30.2504317Z at Microsoft.ML.Runtime.Data.TextLoader.Cursor.GetSomeLines(IMultiStreamSource source, Int32 count, List`1& lines) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs:line 228
2018-08-29T17:03:30.2518542Z at Microsoft.ML.Runtime.Data.TextLoader.Bindings..ctor(TextLoader parent, Column[] cols, IMultiStreamSource headerFile, IMultiStreamSource dataSample) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs:line 536
2018-08-29T17:03:30.2532894Z at Microsoft.ML.Runtime.Data.TextLoader..ctor(IHostEnvironment env, Arguments args, IMultiStreamSource dataSample) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs:line 1073
2018-08-29T17:03:30.2546955Z at Microsoft.ML.Runtime.Data.TextLoader.Create(IHostEnvironment env, Arguments args, IMultiStreamSource files) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs:line 1260
2018-08-29T17:03:30.2561108Z ----- Inner Stack Trace -----
2018-08-29T17:03:30.2575935Z at Interop.ThrowExceptionForIoErrno(ErrorInfo errorInfo, String path, Boolean isDirectory, Func`2 errorRewriter)
2018-08-29T17:03:30.2589645Z at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String path, OpenFlags flags, Int32 mode)
2018-08-29T17:03:30.2603216Z at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
2018-08-29T17:03:30.2616853Z at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
2018-08-29T17:03:30.2630306Z at Microsoft.ML.Runtime.SimpleFileHandle.OpenReadStream() in /__w/19/s/src/Microsoft.ML.Core/Data/IFileHandle.cs:line 197
2018-08-29T17:03:30.2645127Z at Microsoft.ML.Runtime.Data.FileHandleSource.Open(Int32 index) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/MultiFileSource.cs:line 94
2018-08-29T17:03:30.2660036Z at Microsoft.ML.Runtime.Data.FileHandleSource.OpenTextReader(Int32 index) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/MultiFileSource.cs:line 99
2018-08-29T17:03:30.2673648Z at Microsoft.ML.Runtime.Data.TextLoader.Cursor.LineReader.ThreadProc() in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs:line 491
2018-08-29T17:03:30.2687123Z Standard Output Messages:
2018-08-29T17:03:30.2700414Z Test EntryPointPoissonRegression: aborted: passed
2018-08-29T17:03:30.2706900Z ``` #Resolved

The transform currently accepts the <a href="https://www.tensorflow.org/mobile/prepare_models">frozen TensorFlow model</a> file as input.
</item>
<item>The transform supports scoring only one example at a time.</item>
<item>The name of input column(s) should match the name of input(s) in Tensorflow model.</item>

@GalOshriGalOshriAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

If the input columns have to match the names of the inputs in the TF model, is this parameter needed just to identify which subset of columns should be used? Would a user need to rename the columns before adding this transform? #Resolved

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This is basically to map columns in IDataView to inputs in TF model. If the names are kept same we wont have to specify the mapping. The other possibility would be to have overloaded constructor where we can define which column in IDataView maps to which input to TF model using a dictionary.

Right now, yes column needs to be renamed before using this transform.


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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

I have created issue #769 to track this. For now, what Zeeshan said is correct. Perhaps we should add more details here, explaining how to rename data view columns.


In reply to: 213797869 [](ancestors = 213797869,213780817)

Upon success, the transform will introduce a new column in <see cref="IDataView"/> based on the name of the output column specified.
</item>
</list>
</remarks>

@GalOshriGalOshriAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Should we add an explanation of the type of input that is expected? Maybe it is just to clarify that it has to be whatever format the TF model expects, or more detail regarding how images would need to be loaded through a different set of transforms. #Resolved

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Do you mean a detailed sample?


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

@GalOshriGalOshriAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

No, but just an explanation of what should be provided. If I'm new to image classification, how do I find out that I need to transform the images to be in the same format that the pretrained TF model expects? Maybe this is not the right place for this though. #Resolved

var shape = tfShapes[i].ToIntArray().Skip(tfShapes[i][0] == -1 ? BatchSize : 0);
if (type.AsVector.DimCount == 1)
{
int valCount = shape.Aggregate((x, y) => x * y);

@abgoswamabgoswamAug 29, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

So if data is 1d we will verify with the product of dimensions in the model. But if data passed in is multi-dimensional then we verify if each of the individual dimensions match. Is that the intent of this change..

do you think it might be useful to also display the shapes that mismatch ? #Closed

@abgoswamabgoswam left a comment

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Thanks for adding this

@yaeldekelyaeldekel left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

:shipit:

@yaeldekel
yaeldekel removed the request for review from ericstjAugust 30, 2018 02:30
@yaeldekel
yaeldekel merged commit 5ef7a08 into dotnet:masterAug 30, 2018
Comment threadsrc/Microsoft.ML.TensorFlow/Microsoft.ML.TensorFlow.csproj
@yaeldekel
yaeldekel deleted the agoswami/tensorflow branch August 30, 2018 15:22
Comment threadtest/Microsoft.ML.Tests/Scenarios/TensorflowTests.cs
Comment threadtest/Microsoft.ML.Tests/Scenarios/TensorflowTests.cs
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants

@abgoswam@Ivanidzo4ka@ericstj@eerhardt@GalOshri@yaeldekel@zeahmed@Zruty0@shauheen@yaeldMS
, '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

TensorFlowMapper transform for scoring Tensorflow models in ML.NET - #704

Merged
yaeldekel merged 61 commits into
dotnet:masterfrom
abgoswam:agoswami/tensorflow
Aug 30, 2018
Merged

TensorFlowMapper transform for scoring Tensorflow models in ML.NET#704
yaeldekel merged 61 commits into
dotnet:masterfrom
abgoswam:agoswami/tensorflow

Conversation

@abgoswam

@abgoswamabgoswam commented Aug 21, 2018

Copy link
Copy Markdown
Member

Fixes#696, #748#714

This PR creates a new transform 'TensorFlowMapper' for scoring Tensorflow models in ML.NET.

<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Update="TensorFlow\TensorGeneric.cs">

@Ivanidzo4kaIvanidzo4kaAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Shall we move tensorflow to separate project + separate nuget package? #Resolved

@ericstjericstjAug 22, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Yeah, I think everything that depends on TF (including the TensorFlowTransform) should be in a separate project + package. #Resolved

@ericstjericstjAug 22, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

If you'd like to leave that part to me you can. I can factor it out when I add the TF binaries. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

sounds good. lets address this as a separate follow up PR.

(marking as Pending for now)


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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Eric will address this as a separate follow up PR


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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

yes. we will address this in a separate follow up PR.


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

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This is now done.


In reply to: 212037611 [](ancestors = 212037611,211834354)

return new TensorValueGetter<T>(input, colIndex);
}

private ITensorValueGetter CreateTensorValueGetterVec(IRow input, TFDataType tfType, bool isVector, int colIndex, TFShape tfShape)

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Vec [](start = 62, length = 3)

We can get rid of this suffix, since there is no other CreateTensorValueGetter method. #Resolved

namespace Microsoft.ML.Transforms.TensorFlow
{

/// <summary>

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[](start = 0, length = 1)

Convert tabs to spaces. #Resolved


namespace Microsoft.ML.Transforms.TensorFlow
{
internal static partial class NativeBinding

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[](start = 0, length = 1)

Convert tabs to spaces. #Resolved

values = new T[OutputColType.VectorSize];

TensorflowUtils.FetchData<T>(tensors[0].Data, values);
dst = new VBuffer<T>(values.Length, values);

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

new VBuffer [](start = 26, length = 14)

Pass dst.Indices to the new VBuffer as well. #Resolved

@Ivanidzo4ka

Ivanidzo4ka commented Aug 22, 2018

Copy link
Copy Markdown
Contributor

@dotnet-bot Test OSX10.13 Release #Resolved

@abgoswam

abgoswam commented Aug 22, 2018

Copy link
Copy Markdown
MemberAuthor

@dotnet-bot Test OSX10.13 Release #Resolved

handle.Free();
}

internal static bool IsTypeSupported(TFDataType tfoutput)

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

IsTypeSupported [](start = 29, length = 15)

These are for input types, we should decide whether we'd like to support other types as well. #Resolved

@abgoswamabgoswamAug 22, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Hi Yael.. .. Should we track this as a separate task in the GitHub board we are using ?


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

@ericstj

ericstj commented Aug 23, 2018

Copy link
Copy Markdown
Member

You don't actually need to push a change to trigger a build. See @dotnet-bot help. #Resolved

@eerhardt

eerhardt commented Aug 23, 2018

Copy link
Copy Markdown
Member

Instead of checking in 25MBs of test model files, can we instead put those in a NuGet package, and pull them from myget.org or something? I don't think we should check in large files into the repo. #Resolved


namespace Microsoft.ML.Transforms
{
public static class TensorflowTransform

@eerhardteerhardtAug 23, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Do we want to hide "TensorFlow" from the public API? I thought the thinking was to hide the implementation details from the user. Is that no longer a goal? #Resolved

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nevermind, I was thinking of pre-trained featurizers.


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

public sealed class Arguments : TransformInputBase
{

[Argument(ArgumentType.Required, HelpText = "This is the frozen protobuf model file. Please see https://www.tensorflow.org/mobile/prepare_models for more detail(s).", ShortName = "ModelDir", SortOrder = 0)]

@Zruty0Zruty0Aug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

(s) [](start = 172, length = 3)

this is not needed. for details is what I'd suggest #Resolved

}

[TlcModule.EntryPoint(Name = "Transforms.TensorFlowScorer", Desc = Summary, UserName = UserName, ShortName = ShortName)]
public static CommonOutputs.TransformOutput Convert(IHostEnvironment env, Arguments input)

@Zruty0Zruty0Aug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Convert [](start = 52, length = 7)

Surely not Convert ? #Resolved

@@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk" DefaultTargets="Pack">

@eerhardteerhardtAug 29, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@ericstj - We should also have a ".symbols" pkgproj file. That way a symbols package gets produced and is uploaded to the symbols server for the managed assemblies in this package. See the other folders for an example. #Resolved

</PropertyGroup>

<ItemGroup>
<ProjectRefernce Include="..\Microsoft.ML.TensorFlow.Redist\Microsoft.ML.TensorFlow.Redist.pkgproj" />

@eerhardteerhardtAug 29, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this a type-o? ProjectRefernce #Resolved

@ericstjericstjAug 29, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Doh, good catch #Resolved

@Zruty0Zruty0 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

:shipit:

We didn't define ExtractDirectory on the item and instead had a full path as identity.
This worked on linux/osx since it prepended a ""/ to the path, which was tolerated by the file system (an extra leading slash).
On Windows this doesn't work or course.
Fix by appending to the item that doesn't assume files came from an archive.
@ericstj

ericstj commented Aug 29, 2018

Copy link
Copy Markdown
Member

Linux tests failed with

Failed Microsoft.ML.Runtime.RunTests.TestEntryPoints.EntryPointPoissonRegression
2018-08-29T17:03:30.2425699Z Error Message:
2018-08-29T17:03:30.2438651Z System.FormatException : Stream reading encountered exception
2018-08-29T17:03:30.2453212Z ---- System.IO.FileNotFoundException : Could not find file '/__w/19/s/test/data/external/winequality-white.csv'.
2018-08-29T17:03:30.2467248Z Stack Trace:
2018-08-29T17:03:30.2480707Z at Microsoft.ML.Runtime.Data.TextLoader.Cursor.LineReader.GetBatch() in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs:line 475
2018-08-29T17:03:30.2504317Z at Microsoft.ML.Runtime.Data.TextLoader.Cursor.GetSomeLines(IMultiStreamSource source, Int32 count, List`1& lines) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs:line 228
2018-08-29T17:03:30.2518542Z at Microsoft.ML.Runtime.Data.TextLoader.Bindings..ctor(TextLoader parent, Column[] cols, IMultiStreamSource headerFile, IMultiStreamSource dataSample) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs:line 536
2018-08-29T17:03:30.2532894Z at Microsoft.ML.Runtime.Data.TextLoader..ctor(IHostEnvironment env, Arguments args, IMultiStreamSource dataSample) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs:line 1073
2018-08-29T17:03:30.2546955Z at Microsoft.ML.Runtime.Data.TextLoader.Create(IHostEnvironment env, Arguments args, IMultiStreamSource files) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs:line 1260
2018-08-29T17:03:30.2561108Z ----- Inner Stack Trace -----
2018-08-29T17:03:30.2575935Z at Interop.ThrowExceptionForIoErrno(ErrorInfo errorInfo, String path, Boolean isDirectory, Func`2 errorRewriter)
2018-08-29T17:03:30.2589645Z at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String path, OpenFlags flags, Int32 mode)
2018-08-29T17:03:30.2603216Z at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
2018-08-29T17:03:30.2616853Z at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
2018-08-29T17:03:30.2630306Z at Microsoft.ML.Runtime.SimpleFileHandle.OpenReadStream() in /__w/19/s/src/Microsoft.ML.Core/Data/IFileHandle.cs:line 197
2018-08-29T17:03:30.2645127Z at Microsoft.ML.Runtime.Data.FileHandleSource.Open(Int32 index) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/MultiFileSource.cs:line 94
2018-08-29T17:03:30.2660036Z at Microsoft.ML.Runtime.Data.FileHandleSource.OpenTextReader(Int32 index) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/MultiFileSource.cs:line 99
2018-08-29T17:03:30.2673648Z at Microsoft.ML.Runtime.Data.TextLoader.Cursor.LineReader.ThreadProc() in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs:line 491
2018-08-29T17:03:30.2687123Z Standard Output Messages:
2018-08-29T17:03:30.2700414Z Test EntryPointPoissonRegression: aborted: passed
2018-08-29T17:03:30.2706900Z ``` #Resolved

The transform currently accepts the <a href="https://www.tensorflow.org/mobile/prepare_models">frozen TensorFlow model</a> file as input.
</item>
<item>The transform supports scoring only one example at a time.</item>
<item>The name of input column(s) should match the name of input(s) in Tensorflow model.</item>

@GalOshriGalOshriAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

If the input columns have to match the names of the inputs in the TF model, is this parameter needed just to identify which subset of columns should be used? Would a user need to rename the columns before adding this transform? #Resolved

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This is basically to map columns in IDataView to inputs in TF model. If the names are kept same we wont have to specify the mapping. The other possibility would be to have overloaded constructor where we can define which column in IDataView maps to which input to TF model using a dictionary.

Right now, yes column needs to be renamed before using this transform.


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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

I have created issue #769 to track this. For now, what Zeeshan said is correct. Perhaps we should add more details here, explaining how to rename data view columns.


In reply to: 213797869 [](ancestors = 213797869,213780817)

Upon success, the transform will introduce a new column in <see cref="IDataView"/> based on the name of the output column specified.
</item>
</list>
</remarks>

@GalOshriGalOshriAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Should we add an explanation of the type of input that is expected? Maybe it is just to clarify that it has to be whatever format the TF model expects, or more detail regarding how images would need to be loaded through a different set of transforms. #Resolved

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Do you mean a detailed sample?


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

@GalOshriGalOshriAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

No, but just an explanation of what should be provided. If I'm new to image classification, how do I find out that I need to transform the images to be in the same format that the pretrained TF model expects? Maybe this is not the right place for this though. #Resolved

var shape = tfShapes[i].ToIntArray().Skip(tfShapes[i][0] == -1 ? BatchSize : 0);
if (type.AsVector.DimCount == 1)
{
int valCount = shape.Aggregate((x, y) => x * y);

@abgoswamabgoswamAug 29, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

So if data is 1d we will verify with the product of dimensions in the model. But if data passed in is multi-dimensional then we verify if each of the individual dimensions match. Is that the intent of this change..

do you think it might be useful to also display the shapes that mismatch ? #Closed

@abgoswamabgoswam left a comment

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Thanks for adding this

@yaeldekelyaeldekel left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

:shipit:

@yaeldekel
yaeldekel removed the request for review from ericstjAugust 30, 2018 02:30
@yaeldekel
yaeldekel merged commit 5ef7a08 into dotnet:masterAug 30, 2018
Comment threadsrc/Microsoft.ML.TensorFlow/Microsoft.ML.TensorFlow.csproj
@yaeldekel
yaeldekel deleted the agoswami/tensorflow branch August 30, 2018 15:22
Comment threadtest/Microsoft.ML.Tests/Scenarios/TensorflowTests.cs
Comment threadtest/Microsoft.ML.Tests/Scenarios/TensorflowTests.cs
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants

@abgoswam@Ivanidzo4ka@ericstj@eerhardt@GalOshri@yaeldekel@zeahmed@Zruty0@shauheen@yaeldMS
, '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

TensorFlowMapper transform for scoring Tensorflow models in ML.NET - #704

Merged
yaeldekel merged 61 commits into
dotnet:masterfrom
abgoswam:agoswami/tensorflow
Aug 30, 2018
Merged

TensorFlowMapper transform for scoring Tensorflow models in ML.NET#704
yaeldekel merged 61 commits into
dotnet:masterfrom
abgoswam:agoswami/tensorflow

Conversation

@abgoswam

@abgoswamabgoswam commented Aug 21, 2018

Copy link
Copy Markdown
Member

Fixes#696, #748#714

This PR creates a new transform 'TensorFlowMapper' for scoring Tensorflow models in ML.NET.

<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Update="TensorFlow\TensorGeneric.cs">

@Ivanidzo4kaIvanidzo4kaAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Shall we move tensorflow to separate project + separate nuget package? #Resolved

@ericstjericstjAug 22, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Yeah, I think everything that depends on TF (including the TensorFlowTransform) should be in a separate project + package. #Resolved

@ericstjericstjAug 22, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

If you'd like to leave that part to me you can. I can factor it out when I add the TF binaries. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

sounds good. lets address this as a separate follow up PR.

(marking as Pending for now)


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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Eric will address this as a separate follow up PR


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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

yes. we will address this in a separate follow up PR.


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

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This is now done.


In reply to: 212037611 [](ancestors = 212037611,211834354)

return new TensorValueGetter<T>(input, colIndex);
}

private ITensorValueGetter CreateTensorValueGetterVec(IRow input, TFDataType tfType, bool isVector, int colIndex, TFShape tfShape)

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Vec [](start = 62, length = 3)

We can get rid of this suffix, since there is no other CreateTensorValueGetter method. #Resolved

namespace Microsoft.ML.Transforms.TensorFlow
{

/// <summary>

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[](start = 0, length = 1)

Convert tabs to spaces. #Resolved


namespace Microsoft.ML.Transforms.TensorFlow
{
internal static partial class NativeBinding

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[](start = 0, length = 1)

Convert tabs to spaces. #Resolved

values = new T[OutputColType.VectorSize];

TensorflowUtils.FetchData<T>(tensors[0].Data, values);
dst = new VBuffer<T>(values.Length, values);

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

new VBuffer [](start = 26, length = 14)

Pass dst.Indices to the new VBuffer as well. #Resolved

@Ivanidzo4ka

Ivanidzo4ka commented Aug 22, 2018

Copy link
Copy Markdown
Contributor

@dotnet-bot Test OSX10.13 Release #Resolved

@abgoswam

abgoswam commented Aug 22, 2018

Copy link
Copy Markdown
MemberAuthor

@dotnet-bot Test OSX10.13 Release #Resolved

handle.Free();
}

internal static bool IsTypeSupported(TFDataType tfoutput)

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

IsTypeSupported [](start = 29, length = 15)

These are for input types, we should decide whether we'd like to support other types as well. #Resolved

@abgoswamabgoswamAug 22, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Hi Yael.. .. Should we track this as a separate task in the GitHub board we are using ?


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

@ericstj

ericstj commented Aug 23, 2018

Copy link
Copy Markdown
Member

You don't actually need to push a change to trigger a build. See @dotnet-bot help. #Resolved

@eerhardt

eerhardt commented Aug 23, 2018

Copy link
Copy Markdown
Member

Instead of checking in 25MBs of test model files, can we instead put those in a NuGet package, and pull them from myget.org or something? I don't think we should check in large files into the repo. #Resolved


namespace Microsoft.ML.Transforms
{
public static class TensorflowTransform

@eerhardteerhardtAug 23, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Do we want to hide "TensorFlow" from the public API? I thought the thinking was to hide the implementation details from the user. Is that no longer a goal? #Resolved

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nevermind, I was thinking of pre-trained featurizers.


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

public sealed class Arguments : TransformInputBase
{

[Argument(ArgumentType.Required, HelpText = "This is the frozen protobuf model file. Please see https://www.tensorflow.org/mobile/prepare_models for more detail(s).", ShortName = "ModelDir", SortOrder = 0)]

@Zruty0Zruty0Aug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

(s) [](start = 172, length = 3)

this is not needed. for details is what I'd suggest #Resolved

}

[TlcModule.EntryPoint(Name = "Transforms.TensorFlowScorer", Desc = Summary, UserName = UserName, ShortName = ShortName)]
public static CommonOutputs.TransformOutput Convert(IHostEnvironment env, Arguments input)

@Zruty0Zruty0Aug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Convert [](start = 52, length = 7)

Surely not Convert ? #Resolved

@@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk" DefaultTargets="Pack">

@eerhardteerhardtAug 29, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@ericstj - We should also have a ".symbols" pkgproj file. That way a symbols package gets produced and is uploaded to the symbols server for the managed assemblies in this package. See the other folders for an example. #Resolved

</PropertyGroup>

<ItemGroup>
<ProjectRefernce Include="..\Microsoft.ML.TensorFlow.Redist\Microsoft.ML.TensorFlow.Redist.pkgproj" />

@eerhardteerhardtAug 29, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this a type-o? ProjectRefernce #Resolved

@ericstjericstjAug 29, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Doh, good catch #Resolved

@Zruty0Zruty0 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

:shipit:

We didn't define ExtractDirectory on the item and instead had a full path as identity.
This worked on linux/osx since it prepended a ""/ to the path, which was tolerated by the file system (an extra leading slash).
On Windows this doesn't work or course.
Fix by appending to the item that doesn't assume files came from an archive.
@ericstj

ericstj commented Aug 29, 2018

Copy link
Copy Markdown
Member

Linux tests failed with

Failed Microsoft.ML.Runtime.RunTests.TestEntryPoints.EntryPointPoissonRegression
2018-08-29T17:03:30.2425699Z Error Message:
2018-08-29T17:03:30.2438651Z System.FormatException : Stream reading encountered exception
2018-08-29T17:03:30.2453212Z ---- System.IO.FileNotFoundException : Could not find file '/__w/19/s/test/data/external/winequality-white.csv'.
2018-08-29T17:03:30.2467248Z Stack Trace:
2018-08-29T17:03:30.2480707Z at Microsoft.ML.Runtime.Data.TextLoader.Cursor.LineReader.GetBatch() in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs:line 475
2018-08-29T17:03:30.2504317Z at Microsoft.ML.Runtime.Data.TextLoader.Cursor.GetSomeLines(IMultiStreamSource source, Int32 count, List`1& lines) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs:line 228
2018-08-29T17:03:30.2518542Z at Microsoft.ML.Runtime.Data.TextLoader.Bindings..ctor(TextLoader parent, Column[] cols, IMultiStreamSource headerFile, IMultiStreamSource dataSample) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs:line 536
2018-08-29T17:03:30.2532894Z at Microsoft.ML.Runtime.Data.TextLoader..ctor(IHostEnvironment env, Arguments args, IMultiStreamSource dataSample) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs:line 1073
2018-08-29T17:03:30.2546955Z at Microsoft.ML.Runtime.Data.TextLoader.Create(IHostEnvironment env, Arguments args, IMultiStreamSource files) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs:line 1260
2018-08-29T17:03:30.2561108Z ----- Inner Stack Trace -----
2018-08-29T17:03:30.2575935Z at Interop.ThrowExceptionForIoErrno(ErrorInfo errorInfo, String path, Boolean isDirectory, Func`2 errorRewriter)
2018-08-29T17:03:30.2589645Z at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String path, OpenFlags flags, Int32 mode)
2018-08-29T17:03:30.2603216Z at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
2018-08-29T17:03:30.2616853Z at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
2018-08-29T17:03:30.2630306Z at Microsoft.ML.Runtime.SimpleFileHandle.OpenReadStream() in /__w/19/s/src/Microsoft.ML.Core/Data/IFileHandle.cs:line 197
2018-08-29T17:03:30.2645127Z at Microsoft.ML.Runtime.Data.FileHandleSource.Open(Int32 index) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/MultiFileSource.cs:line 94
2018-08-29T17:03:30.2660036Z at Microsoft.ML.Runtime.Data.FileHandleSource.OpenTextReader(Int32 index) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/MultiFileSource.cs:line 99
2018-08-29T17:03:30.2673648Z at Microsoft.ML.Runtime.Data.TextLoader.Cursor.LineReader.ThreadProc() in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs:line 491
2018-08-29T17:03:30.2687123Z Standard Output Messages:
2018-08-29T17:03:30.2700414Z Test EntryPointPoissonRegression: aborted: passed
2018-08-29T17:03:30.2706900Z ``` #Resolved

The transform currently accepts the <a href="https://www.tensorflow.org/mobile/prepare_models">frozen TensorFlow model</a> file as input.
</item>
<item>The transform supports scoring only one example at a time.</item>
<item>The name of input column(s) should match the name of input(s) in Tensorflow model.</item>

@GalOshriGalOshriAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

If the input columns have to match the names of the inputs in the TF model, is this parameter needed just to identify which subset of columns should be used? Would a user need to rename the columns before adding this transform? #Resolved

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This is basically to map columns in IDataView to inputs in TF model. If the names are kept same we wont have to specify the mapping. The other possibility would be to have overloaded constructor where we can define which column in IDataView maps to which input to TF model using a dictionary.

Right now, yes column needs to be renamed before using this transform.


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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

I have created issue #769 to track this. For now, what Zeeshan said is correct. Perhaps we should add more details here, explaining how to rename data view columns.


In reply to: 213797869 [](ancestors = 213797869,213780817)

Upon success, the transform will introduce a new column in <see cref="IDataView"/> based on the name of the output column specified.
</item>
</list>
</remarks>

@GalOshriGalOshriAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Should we add an explanation of the type of input that is expected? Maybe it is just to clarify that it has to be whatever format the TF model expects, or more detail regarding how images would need to be loaded through a different set of transforms. #Resolved

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Do you mean a detailed sample?


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

@GalOshriGalOshriAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

No, but just an explanation of what should be provided. If I'm new to image classification, how do I find out that I need to transform the images to be in the same format that the pretrained TF model expects? Maybe this is not the right place for this though. #Resolved

var shape = tfShapes[i].ToIntArray().Skip(tfShapes[i][0] == -1 ? BatchSize : 0);
if (type.AsVector.DimCount == 1)
{
int valCount = shape.Aggregate((x, y) => x * y);

@abgoswamabgoswamAug 29, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

So if data is 1d we will verify with the product of dimensions in the model. But if data passed in is multi-dimensional then we verify if each of the individual dimensions match. Is that the intent of this change..

do you think it might be useful to also display the shapes that mismatch ? #Closed

@abgoswamabgoswam left a comment

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Thanks for adding this

@yaeldekelyaeldekel left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

:shipit:

@yaeldekel
yaeldekel removed the request for review from ericstjAugust 30, 2018 02:30
@yaeldekel
yaeldekel merged commit 5ef7a08 into dotnet:masterAug 30, 2018
Comment threadsrc/Microsoft.ML.TensorFlow/Microsoft.ML.TensorFlow.csproj
@yaeldekel
yaeldekel deleted the agoswami/tensorflow branch August 30, 2018 15:22
Comment threadtest/Microsoft.ML.Tests/Scenarios/TensorflowTests.cs
Comment threadtest/Microsoft.ML.Tests/Scenarios/TensorflowTests.cs
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants

@abgoswam@Ivanidzo4ka@ericstj@eerhardt@GalOshri@yaeldekel@zeahmed@Zruty0@shauheen@yaeldMS
, '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

TensorFlowMapper transform for scoring Tensorflow models in ML.NET - #704

Merged
yaeldekel merged 61 commits into
dotnet:masterfrom
abgoswam:agoswami/tensorflow
Aug 30, 2018
Merged

TensorFlowMapper transform for scoring Tensorflow models in ML.NET#704
yaeldekel merged 61 commits into
dotnet:masterfrom
abgoswam:agoswami/tensorflow

Conversation

@abgoswam

@abgoswamabgoswam commented Aug 21, 2018

Copy link
Copy Markdown
Member

Fixes#696, #748#714

This PR creates a new transform 'TensorFlowMapper' for scoring Tensorflow models in ML.NET.

<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Update="TensorFlow\TensorGeneric.cs">

@Ivanidzo4kaIvanidzo4kaAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Shall we move tensorflow to separate project + separate nuget package? #Resolved

@ericstjericstjAug 22, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Yeah, I think everything that depends on TF (including the TensorFlowTransform) should be in a separate project + package. #Resolved

@ericstjericstjAug 22, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

If you'd like to leave that part to me you can. I can factor it out when I add the TF binaries. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

sounds good. lets address this as a separate follow up PR.

(marking as Pending for now)


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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Eric will address this as a separate follow up PR


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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

yes. we will address this in a separate follow up PR.


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

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This is now done.


In reply to: 212037611 [](ancestors = 212037611,211834354)

return new TensorValueGetter<T>(input, colIndex);
}

private ITensorValueGetter CreateTensorValueGetterVec(IRow input, TFDataType tfType, bool isVector, int colIndex, TFShape tfShape)

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Vec [](start = 62, length = 3)

We can get rid of this suffix, since there is no other CreateTensorValueGetter method. #Resolved

namespace Microsoft.ML.Transforms.TensorFlow
{

/// <summary>

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[](start = 0, length = 1)

Convert tabs to spaces. #Resolved


namespace Microsoft.ML.Transforms.TensorFlow
{
internal static partial class NativeBinding

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[](start = 0, length = 1)

Convert tabs to spaces. #Resolved

values = new T[OutputColType.VectorSize];

TensorflowUtils.FetchData<T>(tensors[0].Data, values);
dst = new VBuffer<T>(values.Length, values);

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

new VBuffer [](start = 26, length = 14)

Pass dst.Indices to the new VBuffer as well. #Resolved

@Ivanidzo4ka

Ivanidzo4ka commented Aug 22, 2018

Copy link
Copy Markdown
Contributor

@dotnet-bot Test OSX10.13 Release #Resolved

@abgoswam

abgoswam commented Aug 22, 2018

Copy link
Copy Markdown
MemberAuthor

@dotnet-bot Test OSX10.13 Release #Resolved

handle.Free();
}

internal static bool IsTypeSupported(TFDataType tfoutput)

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

IsTypeSupported [](start = 29, length = 15)

These are for input types, we should decide whether we'd like to support other types as well. #Resolved

@abgoswamabgoswamAug 22, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Hi Yael.. .. Should we track this as a separate task in the GitHub board we are using ?


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

@ericstj

ericstj commented Aug 23, 2018

Copy link
Copy Markdown
Member

You don't actually need to push a change to trigger a build. See @dotnet-bot help. #Resolved

@eerhardt

eerhardt commented Aug 23, 2018

Copy link
Copy Markdown
Member

Instead of checking in 25MBs of test model files, can we instead put those in a NuGet package, and pull them from myget.org or something? I don't think we should check in large files into the repo. #Resolved


namespace Microsoft.ML.Transforms
{
public static class TensorflowTransform

@eerhardteerhardtAug 23, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Do we want to hide "TensorFlow" from the public API? I thought the thinking was to hide the implementation details from the user. Is that no longer a goal? #Resolved

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nevermind, I was thinking of pre-trained featurizers.


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

public sealed class Arguments : TransformInputBase
{

[Argument(ArgumentType.Required, HelpText = "This is the frozen protobuf model file. Please see https://www.tensorflow.org/mobile/prepare_models for more detail(s).", ShortName = "ModelDir", SortOrder = 0)]

@Zruty0Zruty0Aug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

(s) [](start = 172, length = 3)

this is not needed. for details is what I'd suggest #Resolved

}

[TlcModule.EntryPoint(Name = "Transforms.TensorFlowScorer", Desc = Summary, UserName = UserName, ShortName = ShortName)]
public static CommonOutputs.TransformOutput Convert(IHostEnvironment env, Arguments input)

@Zruty0Zruty0Aug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Convert [](start = 52, length = 7)

Surely not Convert ? #Resolved

@@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk" DefaultTargets="Pack">

@eerhardteerhardtAug 29, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@ericstj - We should also have a ".symbols" pkgproj file. That way a symbols package gets produced and is uploaded to the symbols server for the managed assemblies in this package. See the other folders for an example. #Resolved

</PropertyGroup>

<ItemGroup>
<ProjectRefernce Include="..\Microsoft.ML.TensorFlow.Redist\Microsoft.ML.TensorFlow.Redist.pkgproj" />

@eerhardteerhardtAug 29, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this a type-o? ProjectRefernce #Resolved

@ericstjericstjAug 29, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Doh, good catch #Resolved

@Zruty0Zruty0 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

:shipit:

We didn't define ExtractDirectory on the item and instead had a full path as identity.
This worked on linux/osx since it prepended a ""/ to the path, which was tolerated by the file system (an extra leading slash).
On Windows this doesn't work or course.
Fix by appending to the item that doesn't assume files came from an archive.
@ericstj

ericstj commented Aug 29, 2018

Copy link
Copy Markdown
Member

Linux tests failed with

Failed Microsoft.ML.Runtime.RunTests.TestEntryPoints.EntryPointPoissonRegression
2018-08-29T17:03:30.2425699Z Error Message:
2018-08-29T17:03:30.2438651Z System.FormatException : Stream reading encountered exception
2018-08-29T17:03:30.2453212Z ---- System.IO.FileNotFoundException : Could not find file '/__w/19/s/test/data/external/winequality-white.csv'.
2018-08-29T17:03:30.2467248Z Stack Trace:
2018-08-29T17:03:30.2480707Z at Microsoft.ML.Runtime.Data.TextLoader.Cursor.LineReader.GetBatch() in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs:line 475
2018-08-29T17:03:30.2504317Z at Microsoft.ML.Runtime.Data.TextLoader.Cursor.GetSomeLines(IMultiStreamSource source, Int32 count, List`1& lines) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs:line 228
2018-08-29T17:03:30.2518542Z at Microsoft.ML.Runtime.Data.TextLoader.Bindings..ctor(TextLoader parent, Column[] cols, IMultiStreamSource headerFile, IMultiStreamSource dataSample) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs:line 536
2018-08-29T17:03:30.2532894Z at Microsoft.ML.Runtime.Data.TextLoader..ctor(IHostEnvironment env, Arguments args, IMultiStreamSource dataSample) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs:line 1073
2018-08-29T17:03:30.2546955Z at Microsoft.ML.Runtime.Data.TextLoader.Create(IHostEnvironment env, Arguments args, IMultiStreamSource files) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs:line 1260
2018-08-29T17:03:30.2561108Z ----- Inner Stack Trace -----
2018-08-29T17:03:30.2575935Z at Interop.ThrowExceptionForIoErrno(ErrorInfo errorInfo, String path, Boolean isDirectory, Func`2 errorRewriter)
2018-08-29T17:03:30.2589645Z at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String path, OpenFlags flags, Int32 mode)
2018-08-29T17:03:30.2603216Z at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
2018-08-29T17:03:30.2616853Z at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
2018-08-29T17:03:30.2630306Z at Microsoft.ML.Runtime.SimpleFileHandle.OpenReadStream() in /__w/19/s/src/Microsoft.ML.Core/Data/IFileHandle.cs:line 197
2018-08-29T17:03:30.2645127Z at Microsoft.ML.Runtime.Data.FileHandleSource.Open(Int32 index) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/MultiFileSource.cs:line 94
2018-08-29T17:03:30.2660036Z at Microsoft.ML.Runtime.Data.FileHandleSource.OpenTextReader(Int32 index) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/MultiFileSource.cs:line 99
2018-08-29T17:03:30.2673648Z at Microsoft.ML.Runtime.Data.TextLoader.Cursor.LineReader.ThreadProc() in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs:line 491
2018-08-29T17:03:30.2687123Z Standard Output Messages:
2018-08-29T17:03:30.2700414Z Test EntryPointPoissonRegression: aborted: passed
2018-08-29T17:03:30.2706900Z ``` #Resolved

The transform currently accepts the <a href="https://www.tensorflow.org/mobile/prepare_models">frozen TensorFlow model</a> file as input.
</item>
<item>The transform supports scoring only one example at a time.</item>
<item>The name of input column(s) should match the name of input(s) in Tensorflow model.</item>

@GalOshriGalOshriAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

If the input columns have to match the names of the inputs in the TF model, is this parameter needed just to identify which subset of columns should be used? Would a user need to rename the columns before adding this transform? #Resolved

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This is basically to map columns in IDataView to inputs in TF model. If the names are kept same we wont have to specify the mapping. The other possibility would be to have overloaded constructor where we can define which column in IDataView maps to which input to TF model using a dictionary.

Right now, yes column needs to be renamed before using this transform.


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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

I have created issue #769 to track this. For now, what Zeeshan said is correct. Perhaps we should add more details here, explaining how to rename data view columns.


In reply to: 213797869 [](ancestors = 213797869,213780817)

Upon success, the transform will introduce a new column in <see cref="IDataView"/> based on the name of the output column specified.
</item>
</list>
</remarks>

@GalOshriGalOshriAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Should we add an explanation of the type of input that is expected? Maybe it is just to clarify that it has to be whatever format the TF model expects, or more detail regarding how images would need to be loaded through a different set of transforms. #Resolved

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Do you mean a detailed sample?


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

@GalOshriGalOshriAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

No, but just an explanation of what should be provided. If I'm new to image classification, how do I find out that I need to transform the images to be in the same format that the pretrained TF model expects? Maybe this is not the right place for this though. #Resolved

var shape = tfShapes[i].ToIntArray().Skip(tfShapes[i][0] == -1 ? BatchSize : 0);
if (type.AsVector.DimCount == 1)
{
int valCount = shape.Aggregate((x, y) => x * y);

@abgoswamabgoswamAug 29, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

So if data is 1d we will verify with the product of dimensions in the model. But if data passed in is multi-dimensional then we verify if each of the individual dimensions match. Is that the intent of this change..

do you think it might be useful to also display the shapes that mismatch ? #Closed

@abgoswamabgoswam left a comment

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Thanks for adding this

@yaeldekelyaeldekel left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

:shipit:

@yaeldekel
yaeldekel removed the request for review from ericstjAugust 30, 2018 02:30
@yaeldekel
yaeldekel merged commit 5ef7a08 into dotnet:masterAug 30, 2018
Comment threadsrc/Microsoft.ML.TensorFlow/Microsoft.ML.TensorFlow.csproj
@yaeldekel
yaeldekel deleted the agoswami/tensorflow branch August 30, 2018 15:22
Comment threadtest/Microsoft.ML.Tests/Scenarios/TensorflowTests.cs
Comment threadtest/Microsoft.ML.Tests/Scenarios/TensorflowTests.cs
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants

@abgoswam@Ivanidzo4ka@ericstj@eerhardt@GalOshri@yaeldekel@zeahmed@Zruty0@shauheen@yaeldMS
, '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

TensorFlowMapper transform for scoring Tensorflow models in ML.NET - #704

Merged
yaeldekel merged 61 commits into
dotnet:masterfrom
abgoswam:agoswami/tensorflow
Aug 30, 2018
Merged

TensorFlowMapper transform for scoring Tensorflow models in ML.NET#704
yaeldekel merged 61 commits into
dotnet:masterfrom
abgoswam:agoswami/tensorflow

Conversation

@abgoswam

@abgoswamabgoswam commented Aug 21, 2018

Copy link
Copy Markdown
Member

Fixes#696, #748#714

This PR creates a new transform 'TensorFlowMapper' for scoring Tensorflow models in ML.NET.

<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Update="TensorFlow\TensorGeneric.cs">

@Ivanidzo4kaIvanidzo4kaAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Shall we move tensorflow to separate project + separate nuget package? #Resolved

@ericstjericstjAug 22, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Yeah, I think everything that depends on TF (including the TensorFlowTransform) should be in a separate project + package. #Resolved

@ericstjericstjAug 22, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

If you'd like to leave that part to me you can. I can factor it out when I add the TF binaries. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

sounds good. lets address this as a separate follow up PR.

(marking as Pending for now)


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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Eric will address this as a separate follow up PR


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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

yes. we will address this in a separate follow up PR.


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

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This is now done.


In reply to: 212037611 [](ancestors = 212037611,211834354)

return new TensorValueGetter<T>(input, colIndex);
}

private ITensorValueGetter CreateTensorValueGetterVec(IRow input, TFDataType tfType, bool isVector, int colIndex, TFShape tfShape)

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Vec [](start = 62, length = 3)

We can get rid of this suffix, since there is no other CreateTensorValueGetter method. #Resolved

namespace Microsoft.ML.Transforms.TensorFlow
{

/// <summary>

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[](start = 0, length = 1)

Convert tabs to spaces. #Resolved


namespace Microsoft.ML.Transforms.TensorFlow
{
internal static partial class NativeBinding

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[](start = 0, length = 1)

Convert tabs to spaces. #Resolved

values = new T[OutputColType.VectorSize];

TensorflowUtils.FetchData<T>(tensors[0].Data, values);
dst = new VBuffer<T>(values.Length, values);

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

new VBuffer [](start = 26, length = 14)

Pass dst.Indices to the new VBuffer as well. #Resolved

@Ivanidzo4ka

Ivanidzo4ka commented Aug 22, 2018

Copy link
Copy Markdown
Contributor

@dotnet-bot Test OSX10.13 Release #Resolved

@abgoswam

abgoswam commented Aug 22, 2018

Copy link
Copy Markdown
MemberAuthor

@dotnet-bot Test OSX10.13 Release #Resolved

handle.Free();
}

internal static bool IsTypeSupported(TFDataType tfoutput)

@yaeldekelyaeldekelAug 22, 2018

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

IsTypeSupported [](start = 29, length = 15)

These are for input types, we should decide whether we'd like to support other types as well. #Resolved

@abgoswamabgoswamAug 22, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Hi Yael.. .. Should we track this as a separate task in the GitHub board we are using ?


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

@ericstj

ericstj commented Aug 23, 2018

Copy link
Copy Markdown
Member

You don't actually need to push a change to trigger a build. See @dotnet-bot help. #Resolved

@eerhardt

eerhardt commented Aug 23, 2018

Copy link
Copy Markdown
Member

Instead of checking in 25MBs of test model files, can we instead put those in a NuGet package, and pull them from myget.org or something? I don't think we should check in large files into the repo. #Resolved


namespace Microsoft.ML.Transforms
{
public static class TensorflowTransform

@eerhardteerhardtAug 23, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Do we want to hide "TensorFlow" from the public API? I thought the thinking was to hide the implementation details from the user. Is that no longer a goal? #Resolved

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nevermind, I was thinking of pre-trained featurizers.


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

public sealed class Arguments : TransformInputBase
{

[Argument(ArgumentType.Required, HelpText = "This is the frozen protobuf model file. Please see https://www.tensorflow.org/mobile/prepare_models for more detail(s).", ShortName = "ModelDir", SortOrder = 0)]

@Zruty0Zruty0Aug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

(s) [](start = 172, length = 3)

this is not needed. for details is what I'd suggest #Resolved

}

[TlcModule.EntryPoint(Name = "Transforms.TensorFlowScorer", Desc = Summary, UserName = UserName, ShortName = ShortName)]
public static CommonOutputs.TransformOutput Convert(IHostEnvironment env, Arguments input)

@Zruty0Zruty0Aug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Convert [](start = 52, length = 7)

Surely not Convert ? #Resolved

@@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk" DefaultTargets="Pack">

@eerhardteerhardtAug 29, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@ericstj - We should also have a ".symbols" pkgproj file. That way a symbols package gets produced and is uploaded to the symbols server for the managed assemblies in this package. See the other folders for an example. #Resolved

</PropertyGroup>

<ItemGroup>
<ProjectRefernce Include="..\Microsoft.ML.TensorFlow.Redist\Microsoft.ML.TensorFlow.Redist.pkgproj" />

@eerhardteerhardtAug 29, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this a type-o? ProjectRefernce #Resolved

@ericstjericstjAug 29, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Doh, good catch #Resolved

@Zruty0Zruty0 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

:shipit:

We didn't define ExtractDirectory on the item and instead had a full path as identity.
This worked on linux/osx since it prepended a ""/ to the path, which was tolerated by the file system (an extra leading slash).
On Windows this doesn't work or course.
Fix by appending to the item that doesn't assume files came from an archive.
@ericstj

ericstj commented Aug 29, 2018

Copy link
Copy Markdown
Member

Linux tests failed with

Failed Microsoft.ML.Runtime.RunTests.TestEntryPoints.EntryPointPoissonRegression
2018-08-29T17:03:30.2425699Z Error Message:
2018-08-29T17:03:30.2438651Z System.FormatException : Stream reading encountered exception
2018-08-29T17:03:30.2453212Z ---- System.IO.FileNotFoundException : Could not find file '/__w/19/s/test/data/external/winequality-white.csv'.
2018-08-29T17:03:30.2467248Z Stack Trace:
2018-08-29T17:03:30.2480707Z at Microsoft.ML.Runtime.Data.TextLoader.Cursor.LineReader.GetBatch() in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs:line 475
2018-08-29T17:03:30.2504317Z at Microsoft.ML.Runtime.Data.TextLoader.Cursor.GetSomeLines(IMultiStreamSource source, Int32 count, List`1& lines) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs:line 228
2018-08-29T17:03:30.2518542Z at Microsoft.ML.Runtime.Data.TextLoader.Bindings..ctor(TextLoader parent, Column[] cols, IMultiStreamSource headerFile, IMultiStreamSource dataSample) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs:line 536
2018-08-29T17:03:30.2532894Z at Microsoft.ML.Runtime.Data.TextLoader..ctor(IHostEnvironment env, Arguments args, IMultiStreamSource dataSample) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs:line 1073
2018-08-29T17:03:30.2546955Z at Microsoft.ML.Runtime.Data.TextLoader.Create(IHostEnvironment env, Arguments args, IMultiStreamSource files) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs:line 1260
2018-08-29T17:03:30.2561108Z ----- Inner Stack Trace -----
2018-08-29T17:03:30.2575935Z at Interop.ThrowExceptionForIoErrno(ErrorInfo errorInfo, String path, Boolean isDirectory, Func`2 errorRewriter)
2018-08-29T17:03:30.2589645Z at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String path, OpenFlags flags, Int32 mode)
2018-08-29T17:03:30.2603216Z at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
2018-08-29T17:03:30.2616853Z at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
2018-08-29T17:03:30.2630306Z at Microsoft.ML.Runtime.SimpleFileHandle.OpenReadStream() in /__w/19/s/src/Microsoft.ML.Core/Data/IFileHandle.cs:line 197
2018-08-29T17:03:30.2645127Z at Microsoft.ML.Runtime.Data.FileHandleSource.Open(Int32 index) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/MultiFileSource.cs:line 94
2018-08-29T17:03:30.2660036Z at Microsoft.ML.Runtime.Data.FileHandleSource.OpenTextReader(Int32 index) in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/MultiFileSource.cs:line 99
2018-08-29T17:03:30.2673648Z at Microsoft.ML.Runtime.Data.TextLoader.Cursor.LineReader.ThreadProc() in /__w/19/s/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs:line 491
2018-08-29T17:03:30.2687123Z Standard Output Messages:
2018-08-29T17:03:30.2700414Z Test EntryPointPoissonRegression: aborted: passed
2018-08-29T17:03:30.2706900Z ``` #Resolved

The transform currently accepts the <a href="https://www.tensorflow.org/mobile/prepare_models">frozen TensorFlow model</a> file as input.
</item>
<item>The transform supports scoring only one example at a time.</item>
<item>The name of input column(s) should match the name of input(s) in Tensorflow model.</item>

@GalOshriGalOshriAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

If the input columns have to match the names of the inputs in the TF model, is this parameter needed just to identify which subset of columns should be used? Would a user need to rename the columns before adding this transform? #Resolved

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This is basically to map columns in IDataView to inputs in TF model. If the names are kept same we wont have to specify the mapping. The other possibility would be to have overloaded constructor where we can define which column in IDataView maps to which input to TF model using a dictionary.

Right now, yes column needs to be renamed before using this transform.


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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

I have created issue #769 to track this. For now, what Zeeshan said is correct. Perhaps we should add more details here, explaining how to rename data view columns.


In reply to: 213797869 [](ancestors = 213797869,213780817)

Upon success, the transform will introduce a new column in <see cref="IDataView"/> based on the name of the output column specified.
</item>
</list>
</remarks>

@GalOshriGalOshriAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Should we add an explanation of the type of input that is expected? Maybe it is just to clarify that it has to be whatever format the TF model expects, or more detail regarding how images would need to be loaded through a different set of transforms. #Resolved

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Do you mean a detailed sample?


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

@GalOshriGalOshriAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

No, but just an explanation of what should be provided. If I'm new to image classification, how do I find out that I need to transform the images to be in the same format that the pretrained TF model expects? Maybe this is not the right place for this though. #Resolved

var shape = tfShapes[i].ToIntArray().Skip(tfShapes[i][0] == -1 ? BatchSize : 0);
if (type.AsVector.DimCount == 1)
{
int valCount = shape.Aggregate((x, y) => x * y);

@abgoswamabgoswamAug 29, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

So if data is 1d we will verify with the product of dimensions in the model. But if data passed in is multi-dimensional then we verify if each of the individual dimensions match. Is that the intent of this change..

do you think it might be useful to also display the shapes that mismatch ? #Closed

@abgoswamabgoswam left a comment

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Thanks for adding this

@yaeldekelyaeldekel left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

:shipit:

@yaeldekel
yaeldekel removed the request for review from ericstjAugust 30, 2018 02:30
@yaeldekel
yaeldekel merged commit 5ef7a08 into dotnet:masterAug 30, 2018
Comment threadsrc/Microsoft.ML.TensorFlow/Microsoft.ML.TensorFlow.csproj
@yaeldekel
yaeldekel deleted the agoswami/tensorflow branch August 30, 2018 15:22
Comment threadtest/Microsoft.ML.Tests/Scenarios/TensorflowTests.cs
Comment threadtest/Microsoft.ML.Tests/Scenarios/TensorflowTests.cs
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants

@abgoswam@Ivanidzo4ka@ericstj@eerhardt@GalOshri@yaeldekel@zeahmed@Zruty0@shauheen@yaeldMS