質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.37%

pytorchを使った学習を行いたいがmat1 and mat2 shapes cannot be multipliedとエラーが出る

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 3,715

score 3

前提・実現したいこと

pytorchを使った学習を行いたいがmat1 and mat2 shapes cannot be multipliedとエラーが出る

発生している問題・エラーメッセージ

Traceback (most recent call last):
  File "C:~~~/test.py", line 52, in <module>
    output=net(input)
  File "C:~~~\module.py", line 727, in _call_impl
    result = self.forward(*input, **kwargs)
  File "C:~~~/test.py", line 30, in forward
    x = F.relu(self.fc1(x))
  File "C:~~~\module.py", line 727, in _call_impl
    result = self.forward(*input, **kwargs)
  File "C:~~~\linear.py", line 93, in forward
    return F.linear(input, self.weight, self.bias)
  File "C:~~~\functional.py", line 1690, in linear
    ret = torch.addmm(bias, input, weight.t())
RuntimeError: mat1 and mat2 shapes cannot be multiplied (1x400 and 576x120)

該当のソースコード

class Net(nn.Module):

    def __init__(self):
        super(Net, self).__init__()
        self.conv1=nn.Conv2d(1,6,3)
        self.conv2=nn.Conv2d(6,16,3)
        self.fc1=nn.Linear(16*6*6,120)
        self.fc2=nn.Linear(120,84)
        self.fc3=nn.Linear(84,10)

    def forward(self,x):
        x=F.max_pool2d(F.relu(self.conv1(x)),(2,2))
        x = F.max_pool2d(F.relu(self.conv2(x)), 2)
        x = x.view(-1, self.num_flat_features(x))
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

    def num_flat_features(self, x):
        size = x.size()[1:]  # all dimensions except the batch dimension
        num_features = 1
        for s in size:
            num_features *= s
        return num_features

net = Net()
print(net)


input=torch.randn(1,1,28,28)
print(input)
output=net(input)
print('output', output)
target=torch.randn(10)
print('target',target)
target=target.view(1,-1)
criterion  = nn.MSELoss()

試したこと

参考にしたコードではinput = torch.randn(1, 1, 32, 32)となっていたものをinput = torch.randn(1, 1, 28, 28)としたところエラーが表示されるようになりました。
エラー内容からすると行列の形が合わないということだと思うのですが1x400の部分が理解できません。576x120は(16*6*6,120)から理解できますが、1x400の部分は28x28で1x784になると思ったのですがなぜエラーメッセージのようになるのでしょうか。

補足情報(FW/ツールのバージョンなど)

Python 3.7.9
torch   1.7.1

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

元のコードでは入力画像のサイズが32なので
入力:32×32×1 (サイズ×サイズ×チャネル)
Conv:30×30×6
MaxPool:15×15×6
Conv:13×13×16
MaxPool:6×6×16
1次元化:576
となり、長さ576のベクトルが渡されるため、エラーが出ずに正しく計算できていました。

ここで、画像のサイズを28に変えてしまうと
入力:28×28×1
Conv:26×26×6
MaxPool:13×13×6
Conv:11×11×16
MaxPool:5×5×16
1次元化:400
となり、全結合層に渡されるベクトルサイズは400になります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る