質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

1966閲覧

pytorch LSTMのDataloaderを使ったバッチ学習

Mitsuki_0

総合スコア25

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/11/01 02:25

DataLoaderを使用しないコードをDataLoaderを使用したコードに変更しようとしているのですが

ーーーーDataLoaderを使用しないコードーーーーーー

python

1import matplotlib.pyplot as plt 2import numpy as np 3import pandas as pd 4from pandas_datareader import data 5import torch 6import torch.nn as nn 7from torch.utils.data import DataLoader 8from sklearn.preprocessing import MinMaxScaler 9from sklearn.model_selection import train_test_split 10%matplotlib inline 11 12torch.manual_seed(123) 13w = torch.linspace(0, 999, steps=1000) 14ww = torch.sin(w*2*3.1416/60) 15 16train_k, test_k = train_test_split(ww, test_size = 0.1, shuffle=False) 17 18#窓とラベルをセットにする関数の作成 19def sequence_creator(input_data, window): 20 dataset = [] 21 data_len = len(input_data) 22 23 for i in range(data_len-window): 24 window_fr = input_data[i:i+window] 25 label = input_data[i+window:i+window+1] 26 dataset.append((window_fr, label)) 27 28 return dataset 29 30window_size = 100 31train_set = sequence_creator(train_k, window_size) 32 33 34#モデル構築 35class LSTM_Model(nn.Module): 36 def __init__(self, input_size=1, hidden_layer_size=50, output_size=1): 37 super().__init__() 38 39 self.hidden_layer_size = hidden_layer_size 40 self.lstm = nn.LSTM(input_size, hidden_layer_size) 41 self.linear = nn.Linear(hidden_layer_size, output_size) 42 43 self.hidden_cell = (torch.zeros(1, 1, self.hidden_layer_size), 44 torch.zeros(1, 1, self.hidden_layer_size)) 45 46 def forward(self, input_seq): 47 lstm_out, self.hidden_cell = self.lstm(input_seq.view(len(input_seq), 1, 1), 48 self.hidden_cell) 49 pred = self.linear(lstm_out.view(len(input_seq), -1)) 50 51 return pred[-1] 52 53 54torch.manual_seed(123) 55model = LSTM_Model() 56criterion = nn.MSELoss() 57optimizer = torch.optim.SGD(model.parameters(), lr=0.01) 58 59epochs = 20 60loss_list = [] 61 62for epoch in range(epochs): 63 for sequence_in, y_train in train_set: 64 y_pred = model(sequence_in) 65 loss = criterion(y_pred, y_train) 66 67 optimizer.zero_grad() 68 model.hidden_cell = (torch.zeros(1, 1, model.hidden_layer_size), 69 torch.zeros(1, 1, model.hidden_layer_size)) 70 71 loss.backward() 72 optimizer.step() 73 74 loss_list.append(loss.detach()) 75 print(f'Epoch {epoch+1} Loss {loss.item()}') 76 77plt.plot(loss_list)

イメージ説明

python

1predict_list = [] 2xx = 100 3predict_list = train_k[-xx:].tolist() 4 5model.eval() 6 7test_size = len(test_k) 8for i in range(test_size): 9 sequence_in = torch.FloatTensor(predict_list[-xx:]) 10 11 with torch.no_grad(): 12 model.hidden_cell = (torch.zeros(1, 1, model.hidden_layer_size), 13 torch.zeros(1, 1, model.hidden_layer_size)) 14 predict_list.append(model(sequence_in).item()) 15 16plt.figure(figsize=(12,5)) 17plt.grid(True) 18plt.plot(ww.numpy()) 19plt.plot(range(len(ww)-test_size, len(ww)), predict_list[-test_size:]) 20plt.show()

イメージ説明

ーーーーーーーーーーーーーーーーーーーーー

上記のコードを
https://dajiro.com/entry/2020/05/06/183255
こちらのサイトを参考に下記のコードを実行してみたのですが
どうも上手くいっていません。

ーーーーDataLoaderを使用したコードーーーーー

python

1import matplotlib.pyplot as plt 2import numpy as np 3import pandas as pd 4from pandas_datareader import data 5import torch 6import torch.nn as nn 7from torch.utils.data import DataLoader 8from sklearn.preprocessing import MinMaxScaler 9from sklearn.model_selection import train_test_split 10%matplotlib inline 11 12torch.manual_seed(123) 13w = torch.linspace(0, 999, steps=1000) 14ww = torch.sin(w*2*3.1416/60) 15 16train_k, test_k = train_test_split(ww, test_size = 0.1, shuffle=False) 17 18 19#窓とラベルをセットにする関数の作成 20def sequence_creator(input_data, window): 21 dataset = [] 22 data_len = len(input_data) 23 24 for i in range(data_len-window): 25 window_fr = input_data[i:i+window] 26 label = input_data[i+window:i+window+1] 27 dataset.append((window_fr, label)) 28 29 return dataset 30 31window_size = 100 32train_set = sequence_creator(train_k, window_size) 33 34 35class LSTM(nn.Module): 36 def __init__(self, input_size=1, hidden_layer_size=100, 37 output_size=1, batch_size = 32): 38 super().__init__() 39 self.hidden_layer_size = hidden_layer_size 40 self.batch_size = batch_size 41 self.lstm = nn.LSTM(input_size, hidden_layer_size) 42 43 self.linear = nn.Linear(hidden_layer_size, output_size) 44 45 self.hidden_cell = (torch.zeros(1, self.batch_size, self.hidden_layer_size), 46 torch.zeros(1, self.batch_size, self.hidden_layer_size)) 47 48 def forward(self, input_seq): 49 batch_size, seq_len = input_seq.shape[0], input_seq.shape[1] 50 lstm_out, self.hidden_cell = self.lstm(input_seq.view(seq_len, batch_size, 1), 51 self.hidden_cell) #lstmのデフォルトの入力サイズは(シーケンスサイズ、バッチサイズ、特徴量次元数) 52 predictions = self.linear(self.hidden_cell[0].view(batch_size, -1)) 53 return predictions[:, 0] 54 55 56epochs = 10 57batch_size = 6 58 59dataloader = DataLoader(train_set, batch_size=batch_size) 60torch.manual_seed(123) 61model = LSTM() 62loss_function = nn.MSELoss() 63optimizer = torch.optim.Adam(model.parameters(), lr=0.01) 64 65 66loss = [] 67for i in range(epochs): 68 for b, tup in enumerate(dataloader): 69 X, y = tup 70 optimizer.zero_grad() 71 model.hidden_cell = (torch.zeros(1, len(X), model.hidden_layer_size), 72 torch.zeros(1, len(X), model.hidden_layer_size)) 73 74 y_pred = model(X) 75 76 #Y_predが1次元、yが2次元になるためview(-1) 77 single_loss = loss_function(y_pred, y.view(-1)) 78 single_loss.backward() 79 optimizer.step() 80 81 loss.append(single_loss.detach()) 82 print(f'epoch: {i:3} loss: {single_loss.item():10.8f}') 83 84plt.plot(loss)

イメージ説明

python

1predict_list = [] 2xx = 100 3predict_list = train_k[-100:].tolist() 4 5model.eval() 6 7test_size = len(test_k) 8for i in range(test_size): 9 sequence_in = torch.FloatTensor(predict_list[-xx:]) 10 11 with torch.no_grad(): 12 model.hidden_cell = (torch.zeros(1, 1, model.hidden_layer_size), 13 torch.zeros(1, 1, model.hidden_layer_size)) 14 predict_list.append(model(sequence_in.view(1,-1)).item()) 15 16plt.figure(figsize=(12,5)) 17plt.grid(True) 18plt.plot(ww.numpy()) 19plt.plot(range(len(ww)-test_size, len(ww)), predict_list[-test_size:]) 20plt.show()

イメージ説明

ーーーーーーーーーーーーーーーーーーーーー

参考サイトには検証のコードが無かった為
検証のやり方がおかしいのか、そもそも学習の方がおかしいのかよく分かっておりません。
ご教授頂けますようお願い致します。




ーーーーやったことーーーー
学習の際に参考サイトの「学習ループの定義」に書かれているままに

single_loss = loss_function(y_pred, y)

とすると
イメージ説明
このように警告が出た為、

single_loss = loss_function(y_pred, y.view(-1))

にしました。

検証の方では

predict_list.append(model(sequence_in).item())

の状態では
イメージ説明
このようなエラーが出た為

predict_list.append(model(sequence_in.view(1,-1)).item())

にしました。

また、

with torch.no_grad(): model.hidden_cell = (torch.zeros(1, 1, model.hidden_layer_size), torch.zeros(1, 1, model.hidden_layer_size))

これを学習の方と同様に

with torch.no_grad(): model.hidden_cell = (torch.zeros(1, len(sequence_in), model.hidden_layer_size), torch.zeros(1, len(sequence_in), model.hidden_layer_size))

とするとエラーが出ました。
イメージ説明
また、

predict_list.append(model(sequence_in.view(1,-1)).item())

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問