[CPU] ResizeBilinearGrad swaps height and width for rectangular inputs in TensorFlow.js 4.22.0

オープン 初心者向け
#8,757 コメント 0 件 リアクション 0 件 担当者 1 名 GitHub で見る

@nileshau-afk がすでに取り組んでいます。

2026年11月9日 から。

  • #8758 @ChengCK18 による — オープン

評価

難易度
2/5
見積もり時間
1〜3時間
初心者へのやさしさ
77/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
javascript, node.js, typescript

調査の方向性

tfjs-backend-cpu/src/kernels/ResizeBilinearGrad.tsを読み、CPU勾配カーネルが返す出力形状を調べてください。まず、提供された最小再現コード scripts/diagnostics/tfjs-resize-minimal.mjsを確認し、ランク3およびランク4の長方形入力、align-cornersの両方の設定、さまざまなバッチ数とチャンネル数について回帰テストを追加してください。CPU autodiffが入力形状を返し、回帰ケースがパスすれば完了です。

索引モデルが issue の本文から書いたものです。

説明

comp:backend-cpu type:bug

CPU ResizeBilinearGrad swaps height and width for rectangular inputs (TensorFlow.js 4.22.0)

Prepared 2026-11-08. This report contains synthetic tensors only; no application
models, photograph data, account information or credentials are required.

Environment

  • @tensorflow/tfjs: 4.22.0, including CPU/WebGL backends 4.22.0.
  • Windows x64; Node.js v24.21.0.
  • Independently reproduced in headless Microsoft Edge 157.0.0.0 on Windows.
  • WebGL comparison renderer: Intel HD Graphics 620 through ANGLE / Direct3D11.
  • Pure JavaScript CPU backend, not @tensorflow/tfjs-node.

Minimal reproduction

In an otherwise empty directory, install @tensorflow/[email protected], save the
following as repro.mjs, then run node repro.mjs:

import * as tf from '@tensorflow/tfjs';
await tf.setBackend('cpu');
await tf.ready();
tf.tidy(() => {
  const x = tf.ones([1, 2, 3, 1]);
  console.log(tf.image.resizeBilinear(x, [4, 5], true).shape);
  const gradient = tf.grad(
    image => tf.image.resizeBilinear(image, [4, 5], true).sum()
  )(x);
  console.log(gradient.shape);
});

Expected: forward shape [1,4,5,1]; gradient shape [1,2,3,1].

Actual: forward succeeds, then autodiff throws:

Error in gradient for op ResizeBilinear. The gradient of input 'images' has
shape '1,3,2,1', which does not match the shape of the input '1,2,3,1'

The same failure occurs for a portrait input [512,384,3] resized to [224,224]:
the internal gradient shape is [1,384,512,3] instead of [1,512,384,3].

Test matrix

The same 16 forward/autodiff cases were tested independently in each environment:
eight input shapes, each with alignCorners=false and alignCorners=true.

Input shapes:

[2,3,1], [3,2,1], [3,3,1], [1,2,3,1], [2,2,3,2],
[512,384,3], [384,512,3], [224,224,3]

Large rectangular inputs were resized to [224,224]; other inputs to [4,5].
Both channels and batch size vary in these checks.

Environment/backend Square gradients pass Rectangular gradients fail Forward failures
Node / CPU 4 12 0
Edge / CPU 4 12 0
Edge / WebGL 4 0 (all 12 pass) 0

All successful gradients had the expected input shape and finite values.
This is not a claim about every browser, graphics driver or other backend.

Numerical check and suspected cause

The installed CPU kernel ends with:

return backend.makeTensorInfo([batch, xWidth, xHeight, depth], 'float32', output);

Its input unpacking and accumulation indexing use NHWC with height before width.
The suspected correction is the output shape:

- [batch, xWidth, xHeight, depth]
+ [batch, xHeight, xWidth, depth]

To distinguish a shape problem from incorrect derivative values, the diagnostic
also directly evaluates the raw ResizeBilinearGrad kernel (without changing or
registering any kernels) and compares its flattened values against central
finite differences of a nonuniform weighted sum of the forward resize.

  • Shapes: [1,2,3,1], [1,3,3,1], [2,2,3,2].
  • Both align-corners settings; all input coordinates checked.
  • Central-difference epsilon: 0.001.
  • Maximum absolute discrepancy, Node CPU and Edge CPU: 0.00002975762.
  • Maximum absolute discrepancy, Edge WebGL: 0.00005230308.

This supports an output-shape metadata error for the tested settings. Simply
reshaping the result at application level cannot repair normal tf.grad,
because its shape check throws before returning that result.

No dependency patch has been applied. Proposed upstream regression tests should
cover rectangular rank-3/rank-4 inputs, multiple batches/channels, both
align-corners settings, and comparison against numerical gradients.

Scope

Forward image resizing works in these cases. The failure concerns CPU autodiff
through bilinear resize with rectangular inputs. No pretrained network or
application-specific code is involved.

The diagnostic files in this workspace are:

  • scripts/diagnostics/tfjs-resize-minimal.mjs: standalone minimal reproduction.
  • scripts/diagnostics/tfjs-resize-gradient.mjs: expanded Node/Edge checks.
  • test-data.local/tfjs-resize-gradient/results.json: recorded detailed results.

The expanded runner requires the existing Playwright/Edge installation. The
minimal reproduction requires only TensorFlow.js.

Upstream reporting

Intended tracker: https://github.com/tensorflow/tfjs/issues

The public source page inspected also contains the same swapped expression:
https://github.com/tensorflow/tfjs/blob/master/tfjs-backend-cpu/src/kernels/ResizeBilinearGrad.ts

The GitHub commits API queried on 2026-11-08 identifies the latest commit touching
that file as 087a02a2848db8ba1950c6894fc76d8be3936f11 (2022-11-29).
An immutable source reference is:
https://github.com/tensorflow/tfjs/blob/087a02a2848db8ba1950c6894fc76d8be3936f11/tfjs-backend-cpu/src/kernels/ResizeBilinearGrad.ts

Public GitHub issue search was queried for repo:tensorflow/tfjs ResizeBilinearGrad
and repo:tensorflow/tfjs resize gradient shape. These returned 7 and 2 results
respectively, including pull requests; none of their returned titles matched
this rectangular CPU gradient shape defect. This is a limited duplicate search,
not proof that no prior report exists. No issue has been submitted by this diagnostic.

Only installed 4.22.0 was runtime-tested. The public source view does not establish
a fresh runtime test of current upstream. Check existing issues before filing;
absence of a matching web-search result does not establish that no duplicate exists.

主要言語
TypeScript
スター
19.2k
フォーク
2k
PR マージ指標
30日以内にマージされた PR はありません

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

tensorflow/tfjs のほかの issue

tensorflow/tfjs の issue をすべて見る

似ている issue

TypeScript の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。