はじめに
前回はpytorchについて調査し、tensorflowとの違いなどを勉強しました。
今回から実際にChatGPTにコードを聞いてみてpytorchの動作原理など勉強していきたいと思います。
では、さっそくレッツゴー
ChatGPTにpytorchでAIを実装させてみた
聞いてみた
pytorchで簡単なAIを実装して
もちろんです。PyTorchを使用して、簡単な人工ニューラルネットワーク(AI)を実装しましょう。ここでは、基本的な分類問題に対するネットワークを作成します。例として、Iris(アヤメ)のデータセットを使用し、花の特徴からその種類を分類するモデルを構築します。
まずは、必要なライブラリをインポートし、データを準備します。次に、ニューラルネットワークを定義し、トレーニングプロセスを実装します。最後に、モデルのパフォーマンスを評価します。このプロセスには以下のステップが含まれます:
- ライブラリのインポートとデータセットの読み込み
- データの前処理
- ネットワークモデルの定義
- 損失関数とオプティマイザの設定
- モデルのトレーニング
- モデルの評価
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%の精度で分類を行うことができました。ただし、実際のプロジェクトでは、より複雑なデータセットやタスクに対しては、モデルの構造やパラメータを調整する必要があるかもしれません。
ここで実装したモデルは、以下のような構造を持っています:
- 入力層: 4つの特徴を持つIrisデータセットの入力を受け取ります。
- 隠れ層: 2つの隠れ層を持ち、それぞれ64のニューロンを持っています。活性化関数としてReLU(Rectified Linear Unit)を使用しています。
- 出力層: 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について書いてくれている人がいました。ありがたいですねー。
ミニバッチ法を簡単にできるようですね。
コメント