【コードエラー記録】表示データセット画像 - 画像テンソル問題

matplotlib 描画 imshow() 関数がエラー「TypeError: 画像データの寸法が無効です」を報告する

エラーコード

plt.imshow((img[6, :, :, :].moveaxis(0, 2)))

に変更

plt.imshow((img[6, :, :, :]))

エラー
TypeError: 画像データの寸法が無効です"

着替える:

plt.imshow((img[6, :, :, :].squeeze().numpy().transpose(1,2,0)))

参照
この問題を解決する鍵は、imshow 関数のパラメーターを理解することです。
matplotlib.pyplot.imshow() 関数の入力は、2 次元の numpy または 3 次元または 4 次元の numpy である必要があります。

  • 3 次元の深さが 1 の場合、np.squeeze() 関数を使用して、データを 2 次元配列に圧縮します。
  • 私は pytorch 環境で使用しているため、結果の出力は (batch_size、channel、width、height) のテンソルであるため、最初に detach() 関数を使用して逆伝播を遮断する必要があります。
  • imshow はテンソル表示をサポートしていないため、.cpu() 関数を使用して CPU に転送する必要があることに注意してください。
  • 前述のように、imshow 関数の入力は、2 次元の numpy または 3 次元または 4 次元の numpy である必要があります。
  • 私のユースケースはかなり特殊なので、もう 1 つの batch_size ディメンションがあります、しかし幸いなことに、batch_size を 1 のみに設定しました。この時点で、.squeeze() 関数を使用して 1 を削除し、(チャネル、幅、高さ) の numpy を取得できますが、これは明らかに入力要件と一致しません。 imshow。したがって、transpose 関数を使用して channel(=3) を最後に移動する必要があります。これが .transpose(1,2,0) のような使用法がある理由です。もちろん、表示する画像自体がchannel=1の場合は、squeeze()関数を使ってそれを取り除き、2次元のnumpyをimshow関数に直接入力することもできます。

おすすめ

転載: blog.csdn.net/zhe470719/article/details/127163650