-
Notifications
You must be signed in to change notification settings - Fork 19.6k
Address bug with convolution using Tensorflow, Numpy, Jax backends #21796
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
Conversation
Summary of ChangesHello @danielenricocahall, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request resolves a bug in the Keras TensorFlow backend where convolution operations with kernels larger than the input would silently produce zero-dimensional outputs instead of raising an error. By introducing an explicit Highlights
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request aims to fix a bug in the TensorFlow backend where a convolution with a kernel larger than the input does not raise an error, unlike other backends like Torch. The proposed solution correctly adds a check to raise a ValueError and includes a corresponding unit test. However, the current implementation only handles cases with static input shapes and will not work for dynamic shapes, which is a common use case in Keras. I've provided suggestions to make the check robust for dynamic shapes by using tf.Assert and adjusting the test to be more backend-agnostic regarding the specific exception type.
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
|
/gemini review |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request addresses a bug where convolution operations in the Tensorflow, Numpy, and Jax backends would silently produce an empty output if the kernel size was larger than the input size. The changes introduce checks in each backend to raise an exception in such cases, which is the correct behavior. A corresponding test case is also added to verify the fix. The implementation is solid. I have one suggestion to improve the consistency of the error message in the TensorFlow backend to make it more general and helpful for users, in line with the other backends.
|
/gemini summary |
Summary of ChangesThis pull request addresses a consistency bug across Keras backends where convolution operations with a kernel larger than the input would silently produce zero-dimensional outputs in TensorFlow, NumPy, and JAX. The changes introduce explicit error checks to these backends, ensuring that a Highlights
Changelog
Activity
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #21796 +/- ##
==========================================
- Coverage 82.63% 82.63% -0.01%
==========================================
Files 577 577
Lines 59316 59425 +109
Branches 9300 9316 +16
==========================================
+ Hits 49018 49107 +89
- Misses 7910 7913 +3
- Partials 2388 2405 +17
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the fix!
keras/src/backend/tensorflow/nn.py
Outdated
| result_shape = tf.shape(result) | ||
| assertion = tf.Assert( | ||
| tf.reduce_all(result_shape > 0), | ||
| [ | ||
| "The convolution operation resulted in an empty output. " | ||
| "Output shape:", | ||
| result_shape, | ||
| ". This can happen if the input is too small for the given " | ||
| "kernel size, strides, dilation rate, and padding mode. " | ||
| "Please check the input shape and convolution parameters.", | ||
| ], | ||
| ) | ||
| with tf.control_dependencies([assertion]): | ||
| return tf.identity(result) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I appreciate supporting dynamic shapes too, but I hear this type of dynamic asserts can be expensive. So let's only cover the statically known shape case (which should cover the vast majority of uses).
result_shape = result.shape
if result_shape.is_fully_defined() and math.prod(result_shape.as_list()) == 0:
raise ValueError(
...
)
return resultThere was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done! Gemini's suggestion was good but maybe overzealous :)
Addressing issue detailed in #19753 where Torch and OpenVINO properly raise an exception when a kernel is bigger than the input but Tensorflow, Numpy, and Jax do not.