CNN、RNN、および GNN モデルのデバッグとトレーニングに適した、汎用データ生成クラスを構築するための深層学習スキル 22 のスキルのアプリケーション

こんにちは、Weixue AI です。今日は、ディープ ラーニング スキル アプリケーション 22 - CNN、RNN、GNN モデルのデバッグとトレーニングに適したユニバーサル データ生成クラスを構築するスキルを紹介します。この記事では、ユニバーサル データ生成クラスの作成を実現し、PyTorch フレームワークを使用して CNN、RNN、および GNN モデルをトレーニングします。

内容:
1. 背景の紹介
2. 依存ライブラリの紹介
3. ユニバーサル データ ジェネレーターの紹介
4. CNN、RNN、GNN モデルの構築
5. データ生成とモデルのトレーニング
6. トレーニングの結果と概要
ここに画像の説明を挿入

1. 背景の紹介

AI モデルのトレーニングのプロセスでは、いくつかの実験、テスト、またはデバッグを行う必要があり、アルゴリズムやモデルを検証するために特定の形状と量のデータセットが必要になる場合があります。ユニバーサル データ ジェネレーターを構築することで、実際のデータセットを手作業で作成したり準備したりすることなく、さまざまな形状やサイズのデータ​​セットを柔軟に生成できます。

次に、データ ジェネレーターは、データセットの性質と特性を調査するためにも使用できます。特定の分布、特徴、または規則性を持つデータセットを生成することにより、データ間の関係、特徴間の相互作用、データの構造などをより深く理解することができます。これは、データの前処理、特徴量エンジニアリング、モデルの選択に非常に役立ちます。

さらに、データ ジェネレーターを使用してデータ拡張手法を実装することもできます。データ拡張とは、元のデータに対して一連の変換または摂動を実行して、トレーニング データの多様性と汎化能力を高めることによって新しいトレーニング サンプルを生成することを指します。ユニバーサル データ ジェネレーターを構築することで、さまざまなデータ拡張方法を定義し、トレーニング中に拡張サンプルを動的に生成して、モデルの堅牢性と信頼性を向上させることができます。

2. 依存ライブラリの紹介

まず、次の依存ライブラリを導入する必要があります。

  • トーチ: PyTorch フレームワーク
  • torch.optim: torch.optim は、モデルのパラメーターを最適化するための PyTorch フレームワークのモジュールです。確率的勾配降下法 (SGD)、Adam、Adagrad などのさまざまな最適化アルゴリズムを提供します。適切な最適化アルゴリズムを選択し、パラメーターを調整することで、モデルをより適切に収束させ、トレーニング中により優れたパフォーマンスを達成できます。
  • torch.utils.data: torch.utils.data は、PyTorch フレームワークのモジュールであり、データセットを処理するためのツール クラスです。データのロード、バッチ処理、データの反復、データ変換など、一般的に使用されるデータ処理操作をいくつか提供します。torch.utils.data を使用すると、トレーニング用のモデルにデータセットを読み込むのに便利で、さまざまな形式のデータを柔軟に処理できます。
  • numpy: numpy は、主に数値計算および科学計算に使用される Python ライブラリです。これは、多次元配列オブジェクト (ndarray) と配列を操作するための一連の関数を提供します。Numpy は数値演算を効率的に実行でき、ブロードキャスト演算やベクトル化演算をサポートしているため、科学計算、データ分析、機械学習で広く使用されています。PyTorch では、numpy を torch.Tensor でシームレスに変換して、データの処理と変換を容易にすることができます。

3. ユニバーサルデータジェネレーターの紹介

まず、UniversalDataset というデータセット クラスを定義する必要があります。これは、特定の形状と量を持つデータとラベルを生成するために使用されます。

クラス初期化メソッド __init__ では、3 つのパラメーターを渡します。 data_shape はデータ (タプル) の形状を表し、target_shape はラベル (タプル) の形状を表し、num_samples はデータセット内のサンプル数を表します。これら 3 つのパラメータを通じてデータを生成します。

次に、データセット内のサンプル数 num_samples を返す __len__ メソッドを実装しました。

次に、インデックス idx に従ってデータセット内のインデックスに対応するデータとラベルを返す __getitem__ メソッドを定義します。このメソッドでは、まず data_shape と同じ形状のすべて 0 のテンソル データと、target_shape と同じ形状のすべて 0 のテンソル ターゲットを作成します。

次に、データとラベルの次元、つまりそれぞれ data_dims と target_dims を計算しました。

この記事では、torch.linspace 関数を使用して、0 ~ 1 の間の data_dim_size の長さを持つ等間隔のデータ範囲 data_range を生成し、 reshape メソッドを通じてそれを data_shape_expanded 形状のテンソルに再形成します。次に、この整形されたデータ範囲をデータ テンソル データに追加します。

ラベルに対して同様の操作を実行し、通常のラベル テンソル ターゲットを生成します。

最後に、データ テンソル データとラベル テンソル ターゲットをこのインデックスに対応するサンプルとして返します。

このクラスを通じて、必要に応じて指定された形状と量のデータ セットを生成できます。データとラベルは規則的であるため、その後のトレーニングと評価に便利です。

import torch
from torch import nn
from torch.utils.data import DataLoader, Dataset

class UniversalDataset(Dataset):
    def __init__(self, data_shape, target_shape, num_samples):
        self.data_shape = data_shape
        self.target_shape = target_shape
        self.num_samples = num_samples

    def __len__(self):
        return self.num_samples

    def __getitem__(self, idx):
        # 生成数据和标签
        data = torch.zeros(self.data_shape)
        target = torch.zeros(self.target_shape)

        # 计算数据和标签的维度
        data_dims = len(self.data_shape)
        target_dims = len(self.target_shape)

        # 生成有规律的数据和标签
        for dim in range(data_dims):
            data_dim_size = self.data_shape[dim]
            data_range = torch.linspace(0, 1, data_dim_size)
            data_shape_expanded = [1] * data_dims
            data_shape_expanded[dim] = data_dim_size
            data += data_range.reshape(data_shape_expanded)

        for dim in range(target_dims):
            target_dim_size = self.target_shape[dim]
            target_range = torch.linspace(0, 1, target_dim_size)
            target_shape_expanded = [1] * target_dims
            target_shape_expanded[dim] = target_dim_size
            target += target_range.reshape(target_shape_expanded)

        return data, target

4. CNN、RNN、GNN モデルの構築

class CNNModel(nn.Module):
    def __init__(self, input_shape):
        super(CNNModel, self).__init__()
        self.conv1 = nn.Conv2d(input_shape[0], 16, kernel_size=3, stride=1, padding=1)
        self.fc = nn.Linear(16 * (input_shape[1] // 2) * (input_shape[2] // 2), 10)

    def forward(self, x):
        x = self.conv1(x)
        x = nn.functional.relu(x)
        x = nn.functional.max_pool2d(x, 2)
        x = x.view(x.size(0), -1)
        x = self.fc(x)
        return x

class RNNModel(nn.Module):
    def __init__(self, input_shape):
        super(RNNModel, self).__init__()
        self.rnn = nn.RNN(input_shape[1], 64, batch_first=True)
        self.fc = nn.Linear(64, 10)

    def forward(self, x):

        _, h_n = self.rnn(x)
        x = self.fc(h_n.squeeze(0))
        return x

class GNNModel(nn.Module):
    def __init__(self, input_shape):
        super(GNNModel, self).__init__()
        self.fc1 = nn.Linear(input_shape[1], 32)
        self.fc2 = nn.Linear(32, 10)

    def forward(self, x):
        x = torch.mean(x, dim=1)
        x = self.fc1(x)
        x = nn.functional.relu(x)
        x = self.fc2(x)
        return x

5. データ生成とモデルのトレーニング

# 定义训练函数
def train(model, dataloader, criterion, optimizer):
    running_loss = 0.0
    correct = 0
    total = 0

    for inputs, labels in dataloader:
        optimizer.zero_grad()

        outputs = model(inputs)
        loss = criterion(outputs, labels)

        _, predicted = torch.max(outputs.data, dim=1)
        total += labels.size(0)

        correct += (predicted == labels.argmax(dim=1)).sum().item()

        loss.backward()
        optimizer.step()

        running_loss += loss.item()

    epoch_loss = running_loss / len(dataloader)
    epoch_acc = correct / total

    return epoch_loss, epoch_acc

# 设置参数
data_shape_cnn = (3, 32, 32)  # (channels, height, width)
target_shape = (10,)
num_samples = 1000
batch_size = 32
learning_rate = 0.001
num_epochs = 10

# 创建数据集和数据加载器
dataset = UniversalDataset(data_shape_cnn, target_shape, num_samples)
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)

# 创建CNN模型、优化器和损失函数
cnn_model = CNNModel(data_shape_cnn)
cnn_optimizer = torch.optim.Adam(cnn_model.parameters(), lr=learning_rate)
cnn_criterion = nn.CrossEntropyLoss()

print('CNN模型训练:')
# 训练CNN模型
for epoch in range(num_epochs):
    cnn_loss, cnn_acc = train(cnn_model, dataloader, cnn_criterion, cnn_optimizer)
    print(f'CNN - Epoch {
      
      epoch+1}/{
      
      num_epochs}, Loss: {
      
      cnn_loss:.4f}, Accuracy: {
      
      cnn_acc:.4f}')


# 重新创建数据集和数据加载器
data_shape_rnn = (20, 32)  # (sequence_length, input_size, hidden_size)
dataset = UniversalDataset(data_shape_rnn, target_shape, num_samples)
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)

# 创建RNN模型、优化器和损失函数
rnn_model = RNNModel(data_shape_rnn)
rnn_optimizer = torch.optim.Adam(rnn_model.parameters(), lr=learning_rate)
rnn_criterion = nn.CrossEntropyLoss()

print('RNN模型训练:')
# 训练RNN模型
for epoch in range(num_epochs):
    rnn_loss, rnn_acc = train(rnn_model, dataloader, rnn_criterion, rnn_optimizer)
    print(f'RNN - Epoch {
      
      epoch+1}/{
      
      num_epochs}, Loss: {
      
      rnn_loss:.4f}, Accuracy: {
      
      rnn_acc:.4f}')

# 重新创建数据集和数据加载器
data_shape_gnn = (10, 100)  # (num_nodes, node_features)
dataset = UniversalDataset(data_shape_gnn, target_shape, num_samples)
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)

# 创建GNN模型、优化器和损失函数
gnn_model = GNNModel(data_shape_gnn)
gnn_optimizer = torch.optim.Adam(gnn_model.parameters(), lr=learning_rate)
gnn_criterion = nn.CrossEntropyLoss()

print('GNN模型训练:')
# 训练GNN模型
for epoch in range(num_epochs):
    gnn_loss, gnn_acc = train(gnn_model, dataloader, gnn_criterion, gnn_optimizer)
    print(f'GNN - Epoch {
      
      epoch+1}/{
      
      num_epochs}, Loss: {
      
      gnn_loss:.4f}, Accuracy: {
      
      gnn_acc:.4f}')

6. 研修結果と概要

操作結果:

CNN模型训练:
CNN - Epoch 1/10, Loss: 10.4031, Accuracy: 0.5840
CNN - Epoch 2/10, Loss: 10.2561, Accuracy: 1.0000
CNN - Epoch 3/10, Loss: 10.2503, Accuracy: 1.0000
CNN - Epoch 4/10, Loss: 10.2496, Accuracy: 1.0000
CNN - Epoch 5/10, Loss: 10.2495, Accuracy: 1.0000
CNN - Epoch 6/10, Loss: 10.2494, Accuracy: 1.0000
CNN - Epoch 7/10, Loss: 10.2493, Accuracy: 1.0000
CNN - Epoch 8/10, Loss: 10.2493, Accuracy: 1.0000
CNN - Epoch 9/10, Loss: 10.2493, Accuracy: 1.0000
CNN - Epoch 10/10, Loss: 10.2493, Accuracy: 1.0000
RNN模型训练:
RNN - Epoch 1/10, Loss: 10.3851, Accuracy: 0.9680
RNN - Epoch 2/10, Loss: 10.2606, Accuracy: 1.0000
RNN - Epoch 3/10, Loss: 10.2551, Accuracy: 1.0000
RNN - Epoch 4/10, Loss: 10.2531, Accuracy: 1.0000
RNN - Epoch 5/10, Loss: 10.2520, Accuracy: 1.0000
RNN - Epoch 6/10, Loss: 10.2513, Accuracy: 1.0000
RNN - Epoch 7/10, Loss: 10.2509, Accuracy: 1.0000
RNN - Epoch 8/10, Loss: 10.2506, Accuracy: 1.0000
RNN - Epoch 9/10, Loss: 10.2504, Accuracy: 1.0000
RNN - Epoch 10/10, Loss: 10.2502, Accuracy: 1.0000
GNN模型训练:
GNN - Epoch 1/10, Loss: 10.9591, Accuracy: 0.0400
GNN - Epoch 2/10, Loss: 10.3914, Accuracy: 1.0000
GNN - Epoch 3/10, Loss: 10.2818, Accuracy: 1.0000
GNN - Epoch 4/10, Loss: 10.2635, Accuracy: 1.0000
GNN - Epoch 5/10, Loss: 10.2569, Accuracy: 1.0000
GNN - Epoch 6/10, Loss: 10.2539, Accuracy: 1.0000
GNN - Epoch 7/10, Loss: 10.2524, Accuracy: 1.0000
GNN - Epoch 8/10, Loss: 10.2515, Accuracy: 1.0000
GNN - Epoch 9/10, Loss: 10.2509, Accuracy: 1.0000
GNN - Epoch 10/10, Loss: 10.2505, Accuracy: 1.0000

この記事では、入力された形状パラメータに応じてさまざまな形状のデータを生成できる汎用データ生成クラスの作成方法を主に紹介します。次に、生成されたデータとラベルを CNN、RNN、GNN モデルに入力してトレーニングし、損失値と精度率を出力します。将来的には、実際のアプリケーションで必要になる可能性のある特定のタスクに応じて、さらに多くの修正や拡張を行うことができます。

おすすめ

転載: blog.csdn.net/weixin_42878111/article/details/131513253