Skip to content

[Image Classification API] No evaluation when batchSize parameter > # of instances in dataset #4274

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
luisquintanilla opened this issue Oct 2, 2019 · 1 comment · Fixed by #4289
Assignees

Comments

@luisquintanilla
Copy link
Contributor

luisquintanilla commented Oct 2, 2019

System information

  • OS version/distro: Windows 10
  • .NET Version (eg., dotnet --info): .NET Core 2.2
  • ML.NET Version: 1.4.0-preview

Issue

  • What did you do?

Tried to train an image classification model using the Image Classification API. The value set for batchSize parameter is 300. Meanwhile then number of data instances in the test set is 182.

  • What happened?

No evaluation takes place. 0 batches are processed.

  • What did you expect?

The model to train and for it to evaluate the number of instances provided. In this case since the number of data instances is less than the amount set for the batchSize parameter, it would process 1 batch instead of 0.

The model to evaluate

Source code / logs

Pipeline:

var trainingPipeline =
                mapLabelTransform
               .Append(mlContext.Model.ImageClassification(
                   featuresColumnName: "ImagePath",
                   labelColumnName: "LabelAsKey",
                   arch: ImageClassificationEstimator.Architecture.ResnetV2101,
                   epoch: 100,
                   batchSize: 300,
                   testOnTrainSet: false,
                   metricsCallback: (metrics) => Console.WriteLine(metrics),
                   validationSet: transformedTestData,
                   reuseTrainSetBottleneckCachedValues: true,
                   reuseValidationSetBottleneckCachedValues: true));

Output:

Number of rows 182
Phase: Training, Dataset used: Validation, Batch Processed Count:   0, Epoch:  93, Accuracy:        NaN
Phase: Training, Dataset used: Validation, Batch Processed Count:   0, Epoch:  94, Accuracy:        NaN
Phase: Training, Dataset used: Validation, Batch Processed Count:   0, Epoch:  95, Accuracy:        NaN
Phase: Training, Dataset used: Validation, Batch Processed Count:   0, Epoch:  96, Accuracy:        NaN
Phase: Training, Dataset used: Validation, Batch Processed Count:   0, Epoch:  97, Accuracy:        NaN
Phase: Training, Dataset used: Validation, Batch Processed Count:   0, Epoch:  98, Accuracy:        NaN
Phase: Training, Dataset used: Validation, Batch Processed Count:   0, Epoch:  99, Accuracy:        NaN

When the batchSize is set equal to the number of rows (in this case 182), this is the output:

Phase: Training, Dataset used: Validation, Batch Processed Count:   1, Epoch:  95, Accuracy:          1
Phase: Training, Dataset used: Validation, Batch Processed Count:   1, Epoch:  96, Accuracy:          1
Phase: Training, Dataset used: Validation, Batch Processed Count:   1, Epoch:  97, Accuracy:          1
Phase: Training, Dataset used: Validation, Batch Processed Count:   1, Epoch:  98, Accuracy:          1
Phase: Training, Dataset used: Validation, Batch Processed Count:   1, Epoch:  99, Accuracy:          1
@ashbhandare
Copy link
Contributor

This happens because currently, a batch is only processed if it has number of samples, and any incomplete batch is skipped. @codemzs is working on changing this.

@ashbhandare ashbhandare assigned codemzs and ashbhandare and unassigned ashbhandare Oct 2, 2019
ashbhandare added a commit that referenced this issue Oct 4, 2019
…, images processed per epoch , enable EarlyStopping without Validation Set. Fixes #4274 and #4286     (#4289)

* In ImageClassification, process incomplete batch where number of samples < batchSize.

* fixed batchIndex not reseting in train loop, enabled EarlyStopping when validationSet is not given for ImageClassificationAPI

* fixed changing shape of feature and label tensor for incomplete batch,detected edge case where early stopping not supported.

* Improved featureBatchSizeInBytes calculation, improved exception message.
codemzs pushed a commit that referenced this issue Oct 8, 2019
…, images processed per epoch , enable EarlyStopping without Validation Set. Fixes #4274 and #4286     (#4289)

* In ImageClassification, process incomplete batch where number of samples < batchSize.

* fixed batchIndex not reseting in train loop, enabled EarlyStopping when validationSet is not given for ImageClassificationAPI

* fixed changing shape of feature and label tensor for incomplete batch,detected edge case where early stopping not supported.

* Improved featureBatchSizeInBytes calculation, improved exception message.
LittleLittleCloud added a commit that referenced this issue Aug 28, 2020
* Buffer re-use using ArrayPool and a few more checks (#4293)

* commit b468adb
Author: Harshitha Parnandi Venkata <[email protected]>
Date:   Tue Oct 1 21:19:57 2019 -0700

    Fixed a bug in the unit test for image classification
commit 30aa4d1
Author: Harshitha Parnandi Venkata <[email protected]>
Date:   Tue Oct 1 20:43:17 2019 -0700

    addressed Zeeshan's comments

commit 3d4f5fe
Merge: 0fbd3d2 718a238
Author: Harshitha Parnandi Venkata <[email protected]>
Date:   Tue Oct 1 20:41:21 2019 -0700

    Merge branch 'master' of https://github.com/dotnet/machinelearning into ImageClassificationVBuf

commit 0fbd3d2
Author: Harshitha Parnandi Venkata <[email protected]>
Date:   Tue Oct 1 17:10:49 2019 -0700

    Changed type to useImageType in LoadImages(). Changed appropriate variable names in ImageClassificationTransform.cs

commit 2417888
Merge: 3ad26b4 4944be7
Author: Harshitha Parnandi Venkata <[email protected]>
Date:   Tue Oct 1 16:55:25 2019 -0700

    Merge branch 'master' of https://github.com/dotnet/machinelearning into ImageClassificationVBuf

commit 3ad26b4
Author: Harshitha Parnandi Venkata <[email protected]>
Date:   Tue Oct 1 15:59:06 2019 -0700

    Added buffer re-use while reading the image in netstandard 2.0. Addressed Eric's comments. Changed ImageLoadingTransformer to take a bool type instead of a DataViewType to make it user friendly. (type = true means we are using VBuffer<byte> , type = false means we are using ImageDataViewType)

commit c67dd08
Author: Harshitha Parnandi Venkata <[email protected]>
Date:   Tue Oct 1 09:50:52 2019 -0700

    Added functionality to load images as VBuffer<byte> in ImageLoader. If no DataViewType options are provided it defaults to loading images as ImageDataViewType. Made LoadImages a part of the sample in ResnetV2101TransferLearningTrainTestSplit.cs. Addressed some of the comments from Zeeshan and Yael. Added a unit test for testing the API. Added TargetFrameworks to get cross platform functionality for System.IO.Stream.Read(Span<Byte>) which doesn't work for netstandard2.0.

commit ae2ac0d
Author: Harshitha Parnandi Venkata <[email protected]>
Date:   Wed Sep 25 14:49:41 2019 -0700

    Added some edits to address Yael's comments

commit b1e5739
Author: Harshitha Parnandi Venkata <[email protected]>
Date:   Wed Sep 25 13:24:03 2019 -0700

    Added unit test for the change

commit acf985d
Author: Harshitha Parnandi Venkata <[email protected]>
Date:   Mon Sep 23 10:39:07 2019 -0700

    Changed the calling function back to how it was in master

commit b80f7ad
Author: Harshitha Parnandi Venkata <[email protected]>
Date:   Mon Sep 23 10:20:31 2019 -0700

    Added a few optimizations to re-use buffers and thereby improving performance.

commit b106ae0
Author: Harshitha Parnandi Venkata <[email protected]>
Date:   Thu Sep 19 14:07:15 2019 -0700

    Changed Image Classification API to take in a VBuffer<byte> type instead of ImagePath.

* fixed merge conflicts

* Fixed some unit tests that were failing after the merge. Addressed a few comments.

* Fixed TensorFlow unit tests

* Changed the buffer re-use logic for ReadToEnd

* Changed ReadToEnd function to read using span instead of unsafe blocks

* removed unnecessary commits

* Added version check with backward compatability. Addressed Zeeshan's comments.

* Fixed tab and synced to master

* Addressed comments. Checkpoint commit

* changed the solution files and version check in ImageLoader.cs

* Added changes for StableApi.csproj

* Added ArrayPool for buffer re-use

* Handled the case when MakeGetter src is empty we need to send an empty VBuffer. Another check for handling empty images.

* Addressed comments

* Image Classification API: Fix processing incomplete batch(<batchSize), images processed per epoch , enable EarlyStopping without Validation Set. Fixes #4274 and #4286     (#4289)

* In ImageClassification, process incomplete batch where number of samples < batchSize.

* fixed batchIndex not reseting in train loop, enabled EarlyStopping when validationSet is not given for ImageClassificationAPI

* fixed changing shape of feature and label tensor for incomplete batch,detected edge case where early stopping not supported.

* Improved featureBatchSizeInBytes calculation, improved exception message.

* upgrade to 3.1

* write inline data using invariantCulture

* Update: ModelBuilder codegen for Object Detection

* updated testing files to give better test results

* Refactored test code

* trying to test performance

* fix commit

* Adding changes from prior commit

* small changes to finilize codegen

* Made changes based on csproj

* minor changes to make final build

* updated onnxruntime to 1.3

* targetting older automl

* taking out dependency on automl taskkind for OD

* final build got predictions working for OD

* took out old test paths to generalize tests

* cleaning up outdated comments

* for the build packaging

* rebuild

* fix tests

* fix build error

* fix e2e bug

* fix e2e bug

* Update Microsoft.ML.CodeGenerator.nupkgproj

* Update Microsoft.ML.CodeGenerator.csproj

* remove .approved.txt that not used

Co-authored-by: harshithapv <[email protected]>
Co-authored-by: ashbhandare <[email protected]>
Co-authored-by: LittleLittleCloud <[email protected]>
Co-authored-by: Tevin <[email protected]>
@ghost ghost locked as resolved and limited conversation to collaborators Mar 20, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.