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関数に直接入力することもできます。