ConvLSTM時空予測実戦コードの詳細解説

前に書いてある

時空間予測は多くの分野で問題となっており、時系列とは異なり、時間の変化を調べるだけでなく、空間の変化にも注意を払う必要があります。多くの予測問題では、今後 3 年間に誰かが特定の病気に罹る確率の予測や、カフェテリアで食事をする人の数など、時間の問題のみに一方的に注意が払われ、スペースの問題が無視されることがよくあります。たとえば、意思決定者として、明日の新しいクラウンで感染する人の数を知りたいだけでなく、正確に管理するために、これらの人々がどこで病気になるかも知りたいと考えています。言い換えれば、政策立案者は人口レベルにより注意を払いますが、介入と制御はスタッフの主な関心事です。空間問題は、予測問題に関する多くの人々の最後の質問、つまり、イベント A が起こる可能性がある場合、それはどこで起こるのか? に答えることができます。
近年、時空間予測に関する疑問が、機械学習分野の科学者や学者に刺激を与えています。従来の統計的時空間予測モデルとは異なり、機械学習または深層学習は、非線形フィッティング、高次元データ処理機能、モデルに対する変数の共線性の影響の心配が少ないなど、その強力な利点が証明されています。現在,時空間予測は,長期短期記憶ネットワークLSTMと畳み込みニューラルネットワークCNNを通じてそれぞれ時間的特徴と空間的特徴を抽出することによって実現することが可能となっている.この記事は主に,時空間予測-次フレームビデオ予測という古典的な問題を実現するために2015年にarxivプラットフォーム上で公開されたビルディングブロック記事「Convolutional LSTM Network: A Machine Learning Approach for Precipitation Nowcasting」に基づいている.もちろん,他の機械学習空間- 時間予測モデルと時空間予測問題はこの記事の範囲を超えていますので、興味のある学生は自分で試してみてください。

1. 時空間予測

時空間予測は、新型コロナウイルス感染症の流行、交通の流れ、天気予報、慢性疾患の地域リスク予測など、多くの問題に対して試行できます。通常の LSTM とは異なり、時空間予測は他の次元での位置が依然として変化することに注意してください。これは空間の現れです。
ここに画像の説明を挿入
論文で言及されているConvLSTMの数式原理については、多くのブログで詳しく解説されているので、ここではあまり紹介しませんが、興味のある方はインターネットで調べたり、原典の解釈を確認したりしてください。

2. データセットの選択とダウンロード

論文と同様に、モバイル MNIST データ セットである Moving-MNIST データ セットも選択します。この公開データ セットは、トロント大学が提供する Web サイトからダウンロードできます。Moving-MNIST データ セットは、時空間予測によく使用されるデータ セットの 1 つです。データ セットのダウンロード コードは次のとおりです。

import numpy as np
from tensorflow import keras
fpath = keras.utils.get_file(
    "moving_mnist.npy",
    "http://www.cs.toronto.edu/~nitish/unsupervised_video/mnist_test_seq.npy",
)
dataset = np.load(fpath)
print(dataset.shape)

データセットをダウンロードした後、データセットの形状を出力すると、結果は (20, 10000, 64, 64) となり、シーケンスには 20 枚の画像があり、最初の 10 フレームが入力され、最後の 10 フレームがターゲットであることを意味します。
ここに画像の説明を挿入

3. データセットの前処理とデータセットの分割

ConvLSTM が受け入れる入力は (サンプル、シーケンス、ワイド、高さ、チャネル) であるため、モデルの入力要件を満たすようにデータ セットを変換する必要があります。

# 转换数据集的seq和samples维度,便于输入我们的模型
dataset = np.swapaxes(dataset, 0, 1)
# 10000个样本太多,我们只选取1000个
dataset = dataset[:1000, ...]
# 我们此时是二维灰度图片,因此要增加一维,代表单通道,如果是彩色,则为3
dataset = np.expand_dims(dataset, axis=-1)
print(dataset.shape)

変換されたデータ セットの形状は (1000, 20, 64, 64, 1) であり、モデルの入力要件をすでに満たしています。次のステップは、データ セットを分割することです。ここで、トレーニング セットとテスト セットのランダムな分割を実現するには、インデックスを破壊する必要があります。

indexes = np.arange(dataset.shape[0])
np.random.shuffle(indexes)  # 打乱索引顺序
# 训练集:测试集=9:1
train_index = indexes[: int(0.9 * dataset.shape[0])]
val_index = indexes[int(0.9 * dataset.shape[0]):]
train_dataset = dataset[train_index]
val_dataset = dataset[val_index]
print(train_dataset.shape)
print(val_dataset.shape)

データセットを分割した後、255 で割って正規化を実現します。データセットを分割した後に正規化を完了する必要があります。そうしないと、データ漏洩につながります。

# 归一化,除255就是把3基色都调到0-1区间,得到绝对色彩信息
train_dataset = train_dataset / 255
val_dataset = val_dataset / 255

論文によると、x と y を分けて、下の図と同様に、最初の 20 フレームで最後の 20 フレームを予測します。
ここに画像の説明を挿入
コードは次のとおりです。

# 分离x和y,注意,此时的y是下一帧图像,既最后一个片子,我们用前20帧预测后20帧,既序号0-19
def create_shifted_frames(data):
    x = data[:, 0: data.shape[1] - 1, :, :]
    y = data[:, 1: data.shape[1], :, :]
    return x, y
x_train, y_train = create_shifted_frames(train_dataset)
x_val, y_val = create_shifted_frames(val_dataset)

4. モデルの構築

# 模型构建核心代码,这里我们修改超参数与keras官方超参数一致
model = Sequential([
    keras.layers.ConvLSTM2D(filters=64, kernel_size=(5, 5),
                   input_shape=(None, 64, 64, 1),
                   padding='same', return_sequences=True),
    keras.layers.BatchNormalization(),
    keras.layers.ConvLSTM2D(filters=64, kernel_size=(3, 3),
                   padding='same', return_sequences=True),
    keras.layers.BatchNormalization(),
    keras.layers.ConvLSTM2D(filters=64, kernel_size=(1, 1),
                   padding='same', return_sequences=True),
    keras.layers.Conv3D(filters=1, kernel_size=(3, 3, 3),
               activation='sigmoid',
               padding='same', data_format='channels_last')
])
model.compile(loss='binary_crossentropy', optimizer='adadelta')
model.summary()

モデルの構造は次のとおりです。
ここに画像の説明を挿入

5. モデルのトレーニング

モデルを構築した後、トレーニングを開始しました。私のコンピュータ グラフィックス カードは 6G メモリを搭載した GTX1660ti ですが、メモリが限られているため、バッチ サイズが削減され、一部のエポックが適切に増加します。計算能力が許せば、エポックとバッチ サイズを増やすことができます。学習の早期終了や学習率の調整のためのコールバック関数をここで定義しているため、無効な学習時間が増加する心配はありません。

# 定义回调
early_stopping = keras.callbacks.EarlyStopping(monitor="val_loss", patience=10)
reduce_lr = keras.callbacks.ReduceLROnPlateau(monitor="val_loss", patience=5)

# 设置训练参数
epochs = 50
batch_size = 2

# 拟合模型.
model.fit(
    x_train,
    y_train,
    batch_size=batch_size,
    epochs=epochs,
    validation_data=(x_val, y_val),
    callbacks=[early_stopping, reduce_lr],
)
model.save('model.h5')

6. 結果を表示する

ここに画像の説明を挿入

自然言語処理とは異なり、時空間予測では精度や F1 スコアなどの指標を単純に比較することはできず、予測結果と実際の結果の差を比較する必要があります。何人かのブロガーのソリューションをチェックしました。SSIM (構造類似性) 損失関数を使用することを提案する人、学習率を下げることを提案する人、デコンボリューションを使用することを提案する人などがありますが、深層学習自体は「錬金術」プロセスです。それはいくつかの畳み込みカーネルを追加するか、いくつかの畳み込み層を追加または削減することにすぎません。このタスクにおける ConvLSTM の本質は画像生成です。画像生成のハイパーパラメータ調整はより敏感です。私は tensorflow_ をインストールしていないので、 contrib ライブラリ、SSIM ロス機能が使えない 今後新しいものがあれば進捗状況を随時掲載していきます。
ここに画像の説明を挿入

ここに画像の説明を挿入

7. まとめ

現在、医療分野での空間統計の利用は、特に感染症と環境曝露因子の研究において一般的となっており、論文著者が時空間統計モデルを使用しているのがよく見られるが、CONLSTMの誕生や、感染症と環境曝露因子における機械学習に基づく時空間予測モデルの改良を推進することもできるほか、Convlstmを点に分割することも可能である、患者のビデオデータ(歩行や特定領域の慢性疾患のリスクマトリックス図など)の分析も可能である。 AIの力を借りて、これらの分野がより活発に発展していく可能性があると信じています。

おすすめ

転載: blog.csdn.net/JaysonWong/article/details/128373966