ホームページ > 記事 > テクノロジー周辺機器 > 因果畳み込みニューラル ネットワーク
因果畳み込みニューラル ネットワークは、時系列データの因果関係の問題のために設計された特別な畳み込みニューラル ネットワークです。従来の畳み込みニューラル ネットワークと比較して、因果畳み込みニューラル ネットワークは、時系列の因果関係を保持するという独特の利点があり、時系列データの予測と分析に広く使用されています。
因果畳み込みニューラル ネットワークの中心的なアイデアは、畳み込み演算に因果関係を導入することです。従来の畳み込みニューラルネットワークは、現時点の前後のデータを同時に認識できますが、時系列予測では情報漏洩の問題が発生する可能性があります。現時点での予測結果は、将来の時点のデータに影響を受けるからです。この問題を解決するのが因果畳み込みニューラルネットワークであり、現時点と過去のデータのみを認識することができ、未来のデータを認識することができないため、時系列データの因果関係を保証することができる。したがって、因果畳み込みニューラル ネットワークは、時系列データの予測と分析の問題をより適切に処理できます。
因果畳み込みニューラル ネットワークを実装するには多くの方法がありますが、一般的な方法の 1 つは因果畳み込みカーネルを使用することです。コーザルコンボリューションカーネルは、現在の時点と以前のデータのみを認識でき、将来のデータを認識できない特殊なコンボリューションカーネルです。この設計により、畳み込み結果が将来のデータによって妨げられないことが保証され、時系列データの因果関係が可能になります。因果畳み込みニューラル ネットワークは、この特性を利用して、時系列データを処理するときに因果関係をより適切に捕捉します。したがって、因果畳み込みカーネルを導入することで、時系列データを効果的に処理でき、モデルのパフォーマンスを向上させることができます。
因果畳み込みカーネルに加えて、因果畳み込みニューラル ネットワークには、因果プーリングや残差構造の導入など、他の実装方法もあります。因果プーリングは、時系列データの因果関係を保存する特別なプーリング操作です。因果関係プーリングでは、各プーリング ウィンドウには現在の時点とそれ以前のデータのみが含まれ、将来のデータは含まれません。これにより、情報漏洩が効果的に回避され、モデルの安定性と堅牢性が向上します。
簡単な例を示します。まず、必要なライブラリとモジュールをインポートする必要があります:
import torch import torch.nn as nn import torch.optim as optim import numpy as np import pandas as pd from sklearn.preprocessing import MinMaxScaler
次に、データを読み取り、処理します:
data = pd.read_csv('temperature.csv') scaler = MinMaxScaler(feature_range=(-1, 1)) data['scaled_temperature'] = scaler.fit_transform(data['temperature'].values.reshape(-1, 1)) data.drop(['temperature'], axis=1, inplace=True)
次に、データ セットをトレーニング セットとテスト セットに分割します:
train_size = int(len(data) * 0.8) test_size = len(data) - train_size train_data, test_data = data.iloc[0:train_size], data.iloc[train_size:len(data)]
次に、因果畳み込みニューラル ネットワーク モデルを定義します:
class CCN(nn.Module): def __init__(self, input_size, output_size, num_filters, kernel_size): super(CCN, self).__init__() self.conv1 = nn.Conv1d(input_size, num_filters, kernel_size, padding=kernel_size - 1) self.conv2 = nn.Conv1d(num_filters, num_filters, kernel_size, padding=kernel_size - 1) self.conv3 = nn.Conv1d(num_filters, num_filters, kernel_size, padding=kernel_size - 1) self.conv4 = nn.Conv1d(num_filters, num_filters, kernel_size, padding=kernel_size - 1) self.conv5 = nn.Conv1d(num_filters, num_filters, kernel_size, padding=kernel_size - 1) self.conv6 = nn.Conv1d(num_filters, num_filters, kernel_size, padding=kernel_size - 1) self.conv7 = nn.Conv1d(num_filters, num_filters, kernel_size, padding=kernel_size - 1) self.conv8 = nn.Conv1d(num_filters, num_filters, kernel_size, padding=kernel_size - 1) self.conv9 = nn.Conv1d(num_filters, num_filters, kernel_size, padding=kernel_size - 1) self.conv10 = nn.Conv1d(num_filters, output_size, kernel_size, padding=kernel_size - 1) def forward(self, x): x = torch.relu(self.conv1(x)) x = torch.relu(self.conv2(x)) x = torch.relu(self.conv3(x)) x = torch.relu(self.conv4(x)) x = torch.relu(self.conv5(x)) x = torch.relu(self.conv6(x)) x = torch.relu(self.conv7(x)) x = torch.relu(self.conv8(x)) x = torch.relu(self.conv9(x)) x = self.conv10(x) return x
モデルの定義が完了したら、データを次のようにする必要があります。モデルに入力できるように前処理する必要があります。データを PyTorch の Tensor タイプに変換し、それを 3D tensor、つまり (batch_size、sequence_length、input_size) の形式に変換します。
def create_sequences(data, seq_length): xs = [] ys = [] for i in range(len(data) - seq_length - 1): x = data[i:(i + seq_length)] y = data[i + seq_length] xs.append(x) ys.append(y) return np.array(xs), np.array(ys) sequence_length = 10 trainX, trainY = create_sequences(train_data['scaled_temperature'], sequence_length) testX, testY = create_sequences(test_data['scaled_temperature'], sequence_length) trainX = torch.from_numpy(trainX).float() trainY = torch.from_numpy(trainY).float() testX = torch.from_numpy(testX).float() testY = torch.from_numpy(testY).float() trainX = trainX.view(-1, sequence_length, 1) trainY = trainY.view(-1, 1) testX = testX.view(-1, sequence_length, 1) testY = testY.view(-1, 1)
次に、トレーニング プロセスを定義します:
num_epochs = 1000 learning_rate = 0.001 num_filters = 64 kernel_size = 2 model = CCN(input_size=1, output_size=1, num_filters=num_filters, kernel_size=kernel_size) criterion = nn.MSELoss() optimizer= optim.Adam(model.parameters(), lr=learning_rate) for epoch in range(num_epochs): optimizer.zero_grad() outputs = model(trainX) loss = criterion(outputs, trainY) loss.backward() optimizer.step() if epoch % 100 == 0: print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item()))
最後に、テスト セットを使用してモデルを評価します。
with torch.no_grad(): test_outputs = model(testX) test_loss = criterion(test_outputs, testY) print('Test Loss: {:.4f}'.format(test_loss.item())) test_outputs = scaler.inverse_transform(test_outputs.numpy()) testY = scaler.inverse_transform(testY.numpy()) test_outputs = np.squeeze(test_outputs) testY = np.squeeze(testY) plt.plot(test_outputs, label='Predicted') plt.plot(testY, label='True') plt.legend() plt.show()
上記は、時系列データの予測に使用できる、単純な因果畳み込みニューラル ネットワーク モデルの実装プロセスです。実際のアプリケーションでは、より良いパフォーマンスを達成するために、特定のタスクに応じてモデルを調整および最適化する必要がある場合があることに注意してください。
従来の畳み込みニューラル ネットワークと比較して、因果畳み込みニューラル ネットワークには、時系列データを処理する際に独特の利点があります。情報漏洩の問題を効果的に回避し、時系列の因果関係をより適切に保存できます。したがって、時系列データの予測と分析において、因果畳み込みニューラル ネットワークは一部のタスクで優れたパフォーマンスを示しています。たとえば、音声認識、自然言語処理、株価予測などの分野では、因果畳み込みニューラル ネットワークが広く使用されており、いくつかの目覚ましい成果を上げています。
以上が因果畳み込みニューラル ネットワークの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。