「ハンズオンディープラーニング+PyTorch」3.9多層パーセプトロン(MLP)でゼロからの学習ノートを実現


序文

私たちは、線形回帰とソフトマックス回帰を含む単層ニューラル ネットワークを研究してきました。ただし、ディープラーニングは主に多層モデルに焦点を当てています。今回は簡単な多層パーセプトロン(多層パーセプトロン、MLP)を完成させます。


1.ライブラリをインポートする

import torch
import numpy as np
import sys
sys.path.append("..")
import d2lzh_pytorch as d2l

2 つのステップ

1. データの読み取り

batch_size = 256
train_iter , test_iter = d2l.load_data_fashion_mnist(batch_size)

トレーニング セットとテスト セットを読む

2.パラメータ設定

num_inputs, num_outputs, num_hiddens = 784, 10, 256

W1 = torch.tensor(np.random.normal(0, 0.01, (num_inputs, num_hiddens)), dtype=torch.float)
b1 = torch.zeros(num_hiddens, dtype=torch.float)
W2 = torch.tensor(np.random.normal(0, 0.01, (num_hiddens, num_outputs)), dtype=torch.float)
b2 = torch.zeros(num_outputs, dtype=torch.float)

params =[W1, b1, W2, b2]
for param in params:
    param.requires_grad_(requires_grad=True)

2.アクティベーション機能

def relu(X):
    return torch.max(input=X, other=torch.tensor(0.0))

def net(X):
    X =X.view((-1, num_inputs))
    H = relu(torch.matmul(X, W1) + b1)
    return torch.matmul(H, W2) + b2

torch.max(input=X, other=torch.tensor(0.0))

関数内の他のパラメーターの意味は、テスト コードの一部を通じて理解できます。

python import torch import numpy as np import sys
sys.path.append("..") import d2lzh_pytorch as d2l

def relu(X):
    return torch.max(input=X, other=torch.tensor(0.0))

X = torch.tensor(np.random.normal(0, 0.01, (2, 2)), dtype=torch.float)
Y = relu(X)

print(X, '\n'  , Y) 

出力は次のとおりです。

python tensor([[-0.0035,  0.0065],
        [-0.0013,  0.0013]])   tensor([[0.0000, 0.0065],
        [0.0000, 0.0013]]) 

定義されたルール関数が活性化関数が持つべき機能を実現していることがわかります. 他のパラメータの意味はテンソルを与えることです. 入力テンソル X において, 対応する位置が与えられた他のテンソルより小さい場合,値を他のテンソルの変更された値に置き換えます。そうでない場合は、変更されていないことを意味します。

torch.matmul(X, W1)t

orch.matmul()これはテンソルの乗算であり、入力は高次元にすることができます。
入力が2次元の場合は通常の行列の乗算となり、tensor.mm()関数の使い方と同じになります。

3. 損失​​関数

loss = torch.nn.CrossEntropyLoss()

この関数の詳細については、クロスエントロピー損失関数の詳細を参照してください。

4. トレーニングモデル

本からのコード:

num_epochs, lr = 5, 100.0
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, params, lr)

lr=100.0線形フィッティングを学習するときに、学習率を大きくしすぎないほうがよいと言いましたが、なぜここで lr が大きくなるのですか?
学習率を強制的に次のように変更するとlr=0.1

epoch 1, loss 0.0090, train acc 0.139, test acc 0.163
epoch 2, loss 0.0090, train acc 0.190, test acc 0.210
epoch 3, loss 0.0090, train acc 0.237, test acc 0.251
epoch 4, loss 0.0089, train acc 0.284, test acc 0.293
epoch 5, loss 0.0089, train acc 0.320, test acc 0.324

トレーニング後のモデルの正解率は非常に低いことがわかります。そのため、学習率を無理に変更することはお勧めできません。

私たちが見つけたsgd()定義:

def sgd(params, lr, batch_size):
    # 为了和原书保持一致,这里除以了batch_size,但是应该是不用除的,因为一般用PyTorch计算loss时就
    # 默认已经沿batch维求了平均了。
    for param in params:
        param.data -= lr * param.grad / batch_size # 注意这里更改param时用的param.data

私たちが知っている定義sgd()は、本で提供されているパッケージに保存されていますd2lzh_pytorch, PyTorch によって公式に提供されていません. 定義のコメントには、PyTorch によって公式に提供されている損失計算関数がバッチ次元に沿って平均化されていると記載されています. 元の本との一貫性を保つために、ここでは Dividedbatch_sizeですが、分割すべきではありません。
私たちのモデルはバッチ ディメンションに沿った公式の PyTorchtorch.nn.CrossEntropyLoss()平均を使用しているため、 sgd で除算する必要はありませんbatch_size

sgd 関数は元々、「ハンズオン ディープラーニング + PyTorch」3.2 ゼロからの線形回帰実装学習
ノート
で定義されており、そのブログでは、パラメータ戻り値の損失関数と sgd() 関数が d2lzh_pytorch パッケージに含まれています。 、またはすべて PyTorch 公式であり、削除は 1 回だけなbatch_sizeので問題はありませんが、この記事では損失関数が公式であり、パッケージが学習モデルd2l.train_ch3()で使用されてsgd()いるd2lzh_pytorchため、この問題が発生します。

そこでbatch_sizesgd() の除算をコメントアウトすると、モデルをトレーニングするコードは次のようになります。

num_epochs, lr = 5, 0.2
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, params, lr)

出力:

epoch 1, loss 0.0034, train acc 0.690, test acc 0.786
epoch 2, loss 0.0020, train acc 0.814, test acc 0.783
epoch 3, loss 0.0018, train acc 0.837, test acc 0.805
epoch 4, loss 0.0017, train acc 0.849, test acc 0.824
epoch 5, loss 0.0016, train acc 0.858, test acc 0.847

正解率はまだ大丈夫であることがわかります。


要約する

「ハンズオンディープラーニング+PyTorch」3.9多層パーセプトロン(MLP)でゼロからの学習ノートを実現

おすすめ

転載: blog.csdn.net/qq_27839923/article/details/122552687