PyTorch torch.nn.Sequential 関数

PyTorch torch.nn 参考手册PyTorch torch.nn リファレンスマニュアル


torch.nn.SequentialPyTorch でシーケンシャルなモデルを素早く構築するためのコンテナです。

宣言された順に各モジュールを実行し、単純な線形ネットワークの構築に適しています。

関数定義

torch.nn.Sequential(*args)

パラメータの説明:

  • *args: 任意の数のモジュール。渡された順に実行されます。

使用例

例 1: 基本的な使い方

Sequential を使用して単純なネットワークを構築:

例

import torch
import torch.nn as nn

# シーケンシャルコンテナを作成
model = nn.Sequential(
    nn.Linear(10, 20),
    nn.ReLU(),
    nn.Linear(20, 5)
)

# フォワード伝播をテスト
input_tensor = torch.randn(3, 10)
output = model(input_tensor)

print("モデル構造:")
print(model)
print("n入力形状:", input_tensor.shape)
print("出力形状:", output.shape)

例 2: OrderedDict を使用して層に名前を付ける

OrderedDict を使用して各層に名前を指定:

例

import torch
import torch.nn as nn
from collections import OrderedDict

# OrderedDict を使用して層に名前を付ける
model = nn.Sequential(OrderedDict([
    ('fc1', nn.Linear(784, 256)),
    ('relu1', nn.ReLU()),
    ('fc2', nn.Linear(256, 128)),
    ('relu2', nn.ReLU()),
    ('output', nn.Linear(128, 10))
]))

# 名前で層にアクセスできる
print("fc1 層:", model.fc1)
print("relu1 層:", model.relu1)

# テスト
x = torch.randn(32, 784)
output = model(x)
print("n出力形状:", output.shape)

例 3: CNN の例

畳み込みニューラルネットワークを構築:

例

import torch
import torch.nn as nn

cnn = nn.Sequential(
    # 1つ目の畳み込みブロック
    nn.Conv2d(3, 32, kernel_size=3, padding=1),
    nn.BatchNorm2d(32),
    nn.ReLU(),
    nn.MaxPool2d(2, 2),

    # 2つ目の畳み込みブロック
    nn.Conv2d(32, 64, kernel_size=3, padding=1),
    nn.BatchNorm2d(64),
    nn.ReLU(),
    nn.MaxPool2d(2, 2),

    # フラット化
    nn.Flatten(),
    nn.Linear(64 * 8 * 8, 256),
    nn.ReLU(),
    nn.Dropout(0.5),
    nn.Linear(256, 10)
)

# テスト
x = torch.randn(4, 3, 32, 32)
output = cnn(x)

print("CNN 構造:")
print(cnn)
print("n入力形状:", x.shape)
print("出力形状:", output.shape)

例 4: 中間層の出力にアクセスする

forward hook を使用して中間層にアクセス:

例

import torch
import torch.nn as nn

# 単純なネットワーク
model = nn.Sequential(
    nn.Linear(10, 20),
    nn.ReLU(),
    nn.Linear(20, 10)
)

# 方法1:フックを使用
feature = None

def hook_fn(module, input, output):
    global feature
    feature = output.clone()

# フックを登録
model[1].register_forward_hook(hook_fn)

# フォワード伝播
x = torch.randn(1, 10)
output = model(x)

print("ReLU 出力形状:", feature.shape)
print("ReLU 出力:", feature.squeeze().tolist())

Sequential vs 手動での forward 定義

方法 利点 欠点
nn.Sequential 簡潔ですばやく構築できる 柔軟性に乏しく、層を共有できない
手動での forward 定義 データフローを柔軟に制御できる コード量が多い

よくある質問

Q1: Sequential 内の特定の層を取得するには?

インデックスまたは名前でアクセス:model[0] 或 model.fc1

Q2: Sequential はすべてのネットワークに適していますか?

スキップ接続、分岐構造、複雑なデータフローを持つネットワークには適していません。

Q3: Sequential 内の層を変更するには?

次の方法でmodel[index] = new_module指定した層を置き換えることができます。


使用シーン

nn.Sequential主な使用シーンは次のとおりです:

  • 単純なネットワーク: 線形に積み重ねた MLP、CNN
  • 迅速なプロトタイピング: モデルのアイデアを素早く検証
  • 特徴抽出: 固定されたネットワーク構造

ヒント:複雑なネットワークの場合は、nn.Module を継承して forward メソッドを手動で定義することをお勧めします。


PyTorch torch.nn 参考手册PyTorch torch.nn リファレンスマニュアル

その他の拡張機能