pytorchを使った機械学習の流れについてまとめてみたよ♪
最近Pytorchを勉強を始めたので、ざっくり流れを紹介したいと思います。
まず、そもそもPytorchってなんなのかというと、
機械学習とかディープラーニングのためのオープソース(タダで使える♪)の
特に行列計算を得意とするPythonのライブラリです。
ライバルでいうとGoogleのテンソルフローとか日本製のchainerとかがあるんだけど、
まあここ最近流行っているらしいので、
これから自動売買コードを開発してガッっぽり稼ぐためにも、
Pytorchを勉強することにしました。
やるぞ!勝つぞ!!!
ということで、
早速、PyTorchを使った一般的な機械学習のステップを簡単に書いてみましょうか。
まずは、ライブラリのインポートをしましょう。
PyTorchを使用するには、まずPyTorchライブラリをインポートします。
# 本当はPytorchなんだけど、何故か「torch」なんですよ。
import torch
# 前のブログで書いたけど、「torch」ライブラリの「nn」パッケージを「nn」として
インポートするぜ♪ということですね。
import torch.nn as nn
# 「optim」って何よ?って思うと思うんだけど、これはoptimizer(最適化)するために
必要なの。
今は後で必要なんだくらいでいいから、型を覚えましょうか。
「torch」ライブラリの「optim」パッケージをインポート!
import torch.optim as optim
# numpyはもういいでしょ。どんな時でも必要なのでとりあえずインポートするよね。
import numpy as np
ここからは、機械学習なので当然データが必要だよねってことで、
適当に「data」という変数を作って、ランダムに作ってみます。
# ダミーデータを生成
data = np.random.rand(100, 2)
labels = np.random.randint(0, 2, size=(100,))
これは、Pytorchを使う時って、データが「numpy配列」や「pandasのdataframe」だと
エラーが起きてしまうんだよね。
だから、pytorchのテンソル型に変換する必要があるのです。
じゃあ、やりましょう。
で、data_tensorというのが訓練データで、
labels_tensorというのが教師データにしているよ。
# NumPy配列をPyTorchテンソルに変換
data_tensor = torch.tensor(data, dtype=torch.float32)
labels_tensor = torch.tensor(labels, dtype=torch.long)
さあ、データが準備できたので、いよいよモデルの構築をしましょう。
モデルは、ニューラルネットワークモデルを定義するので、
こんな感じになります。
class Net(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(2, 64)
self.fc2 = nn.Linear(64, 2)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
ここでやっているのは、「Net」というクラスを作ってます。
で、今回はニューラルネットワークモデルを作成するので、
「nn.Module」というMetaの天才社員たちが開発したクラスを継承することで、
簡単に開発ができるようになっています。
なので、当然パンピーの私たちは継承してガシガシ使っていきましょう♪
「def」が2つあるけど、1つ目がイニシャライザと言って、このクラスをインスタンス化した時に、自動で実行される関数やで。
なので、ここでは初期設定などを書く必要があるね。
このコードの例でいくと、
「super().__init__()」
→これは、さっき継承した「nn.Module」のイニシャライザを実行しているよ。
ここは、なんか分からないけど、これからディープラーニングするのに
いい感じに初期設定してくれてるんだな。くらいでいいよ。
「self.fc1」はニューラルネットワークの1−2層目、
「self.fc2」はニューラルネットワークの2−3層目を定義しているよ。
こんな簡単な記述で、もう全結合層を定義できるのはすごく便利だよね。
2つ目の「def」は順伝播(forward1関数)で、
今回のコード例だと、活性化関数は「RELU関数」を使っているね。
これもシンプルで実にわかりやすい。
Pytorchいいね!
では、モデルのインスタンス化をしましょう。
model = Net()
次に、損失関数とオプティマイザの定義をしましょうか。
モデルのトレーニングに必要な損失関数とオプティマイザを定義するで♪
criterion = nn.CrossEntropyLoss() # 交差エントロピー損失(多クラス分類)
optimizer = optim.SGD(model.parameters(), lr=0.01) # 確率的勾配降下法
さて、モデルのトレーニングをしましょう。
データを使ってモデルをトレーニングさせる♪
num_epochs = 10
for epoch in range(num_epochs):
# 順伝播と逆伝播の計算
outputs = model(data_tensor)
loss = criterion(outputs, labels_tensor)
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 進捗の表示
print(f’Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}’)
ふう、これで、簡単な機械学習モデルのトレーニングが完了するよ♪
実際のタスクに応じて、データの前処理、畳み込み層やリカレント層の使用など、さまざまな変更や拡張が可能だから、今後いろいろ触ってみるね♪
また、テストしてみたら報告します。
さよなら。