skka3134

skka3134

email
telegram

機械学習と量子投資:4. LSTMの構築

  1. CPU または GPU を使用してトレーニングを行うように選択します。
if torch.cuda.is_available():
	device = torch.device("cuda")
else:
	device = torch.device("cpu")
  1. LSTM モデルを構築します。
class LSTM(nn.Module):
    def __init__(self, input_size, hidden_size, num_stacked_layers,output_size):
        super().__init__() #親クラスのコンストラクタを初期化します
        self.hidden_size = hidden_size
        self.num_stacked_layers = num_stacked_layers
        self.lstm = nn.LSTM(input_size, hidden_size, num_stacked_layers, batch_first=True)#LSTMモデルを構築します
        self.fc = nn.Linear(hidden_size,output_size) #全結合層
    #順伝播
    def forward(self, x):
        batch_size = x.size(0)
        #隠れ層の状態を初期化します
        h0 = torch.zeros(self.num_stacked_layers, batch_size, self.hidden_size).to(device)
        c0 = torch.zeros(self.num_stacked_layers, batch_size, self.hidden_size).to(device)
        out, _ = self.lstm(x, (h0, c0)) #隠れ状態を分離して勾配爆発を防ぎます
        out = self.fc(out[:, -1, :]) #最後の隠れ層の状態のみを取得します
        return out 

#LSTMモデルを初期化します
input_size=1 #入力次元、close
hidden_size=4 #隠れ層の次元
num_stacked_layers=1  #LSTMの層数
output_size=1 #出力次元、close
model = LSTM(input_size,hidden_size,num_stacked_layers,output_size)
# model.to(device)

パラメータの設定

#学習率を定義します
learning_rate = 0.001
#損失関数を定義します
loss_function = nn.MSELoss() #nn.CrossEntropyLossは2クラス分類問題の解決によく使用され、nn.NLLLossは画像認識によく使用されます
#オプティマイザを定義します
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate) #オプティマイザの選択についてはhttps://blog.csdn.net/S20144144/article/details/103417502を参照してください

3. トレーニング

def train_one_epoch():
    model.train(True)
    print(f'Epoch: {epoch + 1}')
    running_loss = 0.0
    
    for batch_index, batch in enumerate(train_loader):
        x_batch, y_batch = batch[0].to(device), batch[1].to(device)

        output = model(x_batch)#順伝播
        loss = loss_function(output, y_batch)#損失を計算
        running_loss += loss.item()
        optimizer.zero_grad() #勾配をリセットします
        loss.backward() #逆伝播
        optimizer.step() #パラメータを更新します

        if batch_index % 100 == 99:  # 100バッチごとに表示
            avg_loss_across_batches = running_loss / 100
            print('Batch {0}, Loss: {1:.3f}'.format(batch_index+1,avg_loss_across_batches))
            running_loss = 0.0
    print()

4. 検証

def validate_one_epoch():
    model.train(False)
    running_loss = 0.0
    #テストセットを反復処理し、データを取得し、予測します
    for batch_index, batch in enumerate(test_loader):
        x_batch, y_batch = batch[0].to(device), batch[1].to(device)
        with torch.no_grad():
            output = model(x_batch)
            loss = loss_function(output, y_batch)
            running_loss += loss.item()
    #計算
    avg_loss_across_batches = running_loss / len(test_loader)
    #表示
    print('Val Loss: {0:.3f}'.format(avg_loss_across_batches))

5. トレーニング回数の定義

num_epochs = 10
for epoch in range(num_epochs):
    train_one_epoch()
    validate_one_epoch()
with torch.no_grad():
    predicted = model(X_train.to(device)).to('cpu').numpy()

image
5. 可視化

plt.plot(y_train, label='実際の終値')
plt.plot(predicted, label='予測された終値')
plt.xlabel('日')
plt.ylabel('終値')
plt.legend()
plt.show()

image

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。