moegIi6016 / vgg16

vgg16を用いて機械学習を行うためのリポジトリ
0 stars 0 forks source link

RuntimeError #1

Open moegIi6016 opened 1 year ago

moegIi6016 commented 1 year ago

エラー内容

RuntimeError: mat1 and mat2 shapes cannot be multiplied (32x25088 and 2500x4096)

行ったこと

vgg/net.classifierにnn.Sequentialを以下のようにしたらエラーメッセージが表示される ーーー

   vgg_net = vgg_net.to(device)

    vgg_net.classifier = nn.Sequential(
        nn.Linear(2500, 4096),
        nn.ReLU(inplace=True),
        nn.Dropout(0.5),
        nn.Linear(3000, 4096),
        nn.ReLU(inplace=True),
        nn.Dropout(0.5),
        nn.Linear(3000, num_classes)
    )

ーーー

moegIi6016 commented 1 year ago

このエラーは、vgg_netモデルの最終の全結合層の入力サイズと出力サイズが一致していないことが原因です。現在のコードでは、入力サイズを2500次元としていますが、その後の層では3000次元を期待しています。この不一致を解決するには、入力サイズを正しく設定する必要があります。

入力サイズを正確に把握するためには、vgg_netモデルのアーキテクチャを確認することが重要です。具体的には、print(vgg_net)を追加し、モデルの概要を表示します。以下は、修正したコード例です。

vgg_net = vgg_net.to(device)

# モデルのアーキテクチャを確認
print(vgg_net)

# 入力サイズを正しく設定する
input_size = <適切な入力サイズを指定する>
vgg_net.classifier = nn.Sequential(
    nn.Linear(input_size, 4096),
    nn.ReLU(inplace=True),
    nn.Dropout(0.5),
    nn.Linear(4096, 4096),
    nn.ReLU(inplace=True),
    nn.Dropout(0.5),
    nn.Linear(4096, num_classes)
)

上記のコードでは、<適切な入力サイズを指定する>の部分を適切な値に置き換える必要があります。モデルのアーキテクチャを確認し、最終の全結合層への入力サイズを特定してください。

例えば、VGG16モデルの最終の畳み込み層の出力サイズを確認し、それに基づいて入力サイズを設定することができます。入力画像のサイズやデータセットの特性によっても異なる可能性がありますので、具体的な値は確認してください。

適切な入力サイズを設定することで、エラーが解決するはずです。

moegIi6016 commented 1 year ago

nn.Linearは、ニューラルネットワークの線形変換を表すモジュールです。このモジュールは、入力テンソルと重み行列の行列積を計算し、バイアス項を追加します。

具体的には、nn.Linear(in_features, out_features)の形式で使用されます。in_featuresは入力の次元数を指定し、out_featuresは出力の次元数を指定します。行列積によって、入力テンソルの次元がin_featuresからout_featuresに変換されます。

したがって、与えられたコードのnn.Linear(25088, 4096)は、入力次元数が25088であり、出力次元数が4096である線形変換を表しています。同様に、nn.Linear(4096, 4096)は4096次元から4096次元への線形変換を表しています。最後のnn.Linear(4096, num_classes)は、4096次元からクラス数(num_classes)の次元への線形変換を表しています。

パラメータの数値を小さくしたい場合は、nn.Linearの重み行列の初期化方法を変更することができます。例えば、nn.Linearの重み行列をガウス分布からランダムに初期化する場合、標準偏差を小さくすることでパラメータの数値を小さくすることができます。

以下は、パラメータの数値を小さくするために標準偏差を調整する例です:

import torch.nn.init as init

# パラメータの数値を小さくするために標準偏差を調整
model.classifier[0].weight.data.normal_(0, 0.01)
model.classifier[3].weight.data.normal_(0, 0.01)

上記のコードでは、model.classifierの最初のnn.Linearモジュールと3番目のnn.Linearモジュールの重み行列を、平均0、標準偏差0.01のガウス分布からランダムに初期化しています。これにより、パラメータの数値が小さくなります。

適切な標準偏差の値は具体的な問題やモデルのアーキテクチャによって異なる場合がありますので、適切な値を見つけるためには実験や調整が必要になるかもしれません。