RuntimeError: mat1 and mat2 shapes cannot be multiplied の対処
このエラーは、行列の掛け算(多くは全結合層 nn.Linear の入力)で、2つの行列の次元が噛み合っていないときに出ます。エラー文に出る2組の形状 (a x b) と (c x d) を見比べ、bとcが一致するように入力かモデル定義を直します。
RuntimeError: mat1 and mat2 shapes cannot be multiplied (32x768 and 512x256)原因
行列の掛け算 A×B が成立するには、Aの列数とBの行数が一致している必要があります。上の例では mat1 が (32×768)、mat2 が (512×256) で、768と512が合っていないため失敗しています。典型的には、nn.Linear(in_features, out_features) の in_features が、実際に流れてくるデータの次元と食い違っています。
対処
- エラー文の2組の数字をそのまま書き出し、どちらが自分のデータで、どちらがモデルの重みかを特定します。
mat1 (32x768) ← 入力データ側。バッチ32、特徴量768mat2 (512x256) ← nn.Linearの重み。in_features=512 になっている- モデル定義のin_featuresを、実際の入力次元に合わせます。
# 誤りself.fc = nn.Linear(512, 256)# 正しくは入力の特徴量数(768)に合わせるself.fc = nn.Linear(768, 256)- 逆に、畳み込み層やFlattenの直後でサイズが想定と違うこともあります。
print(x.shape)を各層の前後に挟んで、実際の形状を確認します。
x = self.conv(x)print(x.shape) # 想定と合っているか確認x = x.view(x.size(0), -1)- 事前学習済みモデルを使う場合は、入力画像サイズや前処理(リサイズ)がモデルの想定と合っているかも確認します。
まとめ
・原因は行列の次元不一致。エラー文の2組の数字を照合する ・nn.Linearのin_featuresを実際の入力次元に合わせる ・print(x.shape)で各層の実際の形状を確認する ・事前学習済みモデルでは入力サイズの前処理も要確認