AIプログラミング初心者がChatGPTにpytorchで簡単なAIを実装させてpytorchについて理解してみた

はじめに

前回はpytorchについて調査し、tensorflowとの違いなどを勉強しました。

今回から実際にChatGPTにコードを聞いてみてpytorchの動作原理など勉強していきたいと思います。

では、さっそくレッツゴー

ChatGPTにpytorchでAIを実装させてみた

聞いてみた

pytorchで簡単なAIを実装して

もちろんです。PyTorchを使用して、簡単な人工ニューラルネットワーク(AI)を実装しましょう。ここでは、基本的な分類問題に対するネットワークを作成します。例として、Iris(アヤメ)のデータセットを使用し、花の特徴からその種類を分類するモデルを構築します。

まずは、必要なライブラリをインポートし、データを準備します。次に、ニューラルネットワークを定義し、トレーニングプロセスを実装します。最後に、モデルのパフォーマンスを評価します。このプロセスには以下のステップが含まれます:

  1. ライブラリのインポートとデータセットの読み込み
  2. データの前処理
  3. ネットワークモデルの定義
  4. 損失関数とオプティマイザの設定
  5. モデルのトレーニング
  6. モデルの評価
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from torch.utils.data import DataLoader, TensorDataset

# Iris データセットの読み込み
iris = load_iris()
X, y = iris.data, iris.target

# データの前処理
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# PyTorchのテンソルに変換
X_train = torch.tensor(X_train, dtype=torch.float32)
y_train = torch.tensor(y_train, dtype=torch.long)
X_test = torch.tensor(X_test, dtype=torch.float32)
y_test = torch.tensor(y_test, dtype=torch.long)

# データローダーの作成
train_dataset = TensorDataset(X_train, y_train)
train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True)

# ニューラルネットワークの定義
class IrisNet(nn.Module):
    def __init__(self):
        super(IrisNet, self).__init__()
        self.fc1 = nn.Linear(4, 64)
        self.fc2 = nn.Linear(64, 64)
        self.fc3 = nn.Linear(64, 3)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        return self.fc3(x)

model = IrisNet()

# 損失関数とオプティマイザ
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# トレーニングプロセス
def train(model, criterion, optimizer, train_loader, epochs=100):
    for epoch in range(epochs):
        for inputs, targets in train_loader:
            optimizer.zero_grad()
            outputs = model(inputs)
            loss = criterion(outputs, targets)
            loss.backward()
            optimizer.step()
        if epoch % 10 == 0:
            print(f"Epoch {epoch}/{epochs}, Loss: {loss.item()}")

train(model, criterion, optimizer, train_loader)

# テストデータで評価
with torch.no_grad():
    outputs = model(X_test)
    _, predicted = torch.max(outputs, 1)
    accuracy = (predicted == y_test).sum().item() / y_test.size(0)

accuracy

コードを実行するためには、Python環境にPyTorchがインストールされている必要があります。それでは、Pythonコードを示します。

トレーニングが完了し、モデルはテストデータで評価されました。この簡単なニューラルネットワークモデルは、Irisデータセットに対して100%の精度で分類を行うことができました。ただし、実際のプロジェクトでは、より複雑なデータセットやタスクに対しては、モデルの構造やパラメータを調整する必要があるかもしれません。

ここで実装したモデルは、以下のような構造を持っています:

  1. 入力層: 4つの特徴を持つIrisデータセットの入力を受け取ります。
  2. 隠れ層: 2つの隠れ層を持ち、それぞれ64のニューロンを持っています。活性化関数としてReLU(Rectified Linear Unit)を使用しています。
  3. 出力層: 3つのクラス(Irisの種類)を分類するための出力を生成します。

損失関数にはクロスエントロピー損失(CrossEntropyLoss)が使用され、オプティマイザとしてはAdamが採用されています。また、トレーニングプロセスではバッチサイズ16でデータをシャッフルしながら100エポックでモデルをトレーニングしました。

この例は、PyTorchを使用した基本的な機械学習モデルの構築とトレーニングのプロセスを示しています。実際のプロジェクトでは、データの前処理、モデルの構造、トレーニングプロセスのパラメータ調整など、さらに多くの要素を考慮する必要があります。

これを実行してみます

Epoch 0/100, Loss: 0.9763084650039673
Epoch 10/100, Loss: 0.15774871408939362
Epoch 20/100, Loss: 0.19857019186019897
Epoch 30/100, Loss: 0.016028132289648056
Epoch 40/100, Loss: 0.06345167756080627
Epoch 50/100, Loss: 0.04621263965964317
Epoch 60/100, Loss: 0.09918151795864105
Epoch 70/100, Loss: 0.0058725979179143906
Epoch 80/100, Loss: 0.009060586802661419
Epoch 90/100, Loss: 0.004094504285603762

とりあえず、動きました。

では解読してみましょう。

ライブラリを調査

今回はライブラリを見てみようと思います。

import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from torch.utils.data import DataLoader, TensorDataset

1行目は言わずもがな今回の主役ですね。pytorchのtorchの部分ですね。

torch.nnについて

2行目のnnは何でしょうか?調べてみます。

こちらに非常に詳しく明記されています。

重みとバイアスを格納する箱のようなものが準備できるようです。

torch.optimについて

3票目のoptimは見るからに最適化関数のようにを見えますが、一応調べてみます。

こちらに詳しく載ってました。はやり最適化関数のようです。

前処理

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

この辺は前回tensorflowを調べたときと同じようなデータセット、訓練と検証データの分割、正規化っぽそうでうね。これは次回の前処理のときにより詳しく調べましょう。

DataLoader, TensorDatasetについて

from torch.utils.data import DataLoader, TensorDatasetですね。こちらは字面からは推測しにくいですね。調べてみます。

こちらこちらの方がDataLoader, TensorDatasetについて書いてくれている人がいました。ありがたいですねー。

ミニバッチ法を簡単にできるようですね。

コメント

タイトルとURLをコピーしました