CNN と RNN を組み合わせてシーケンスを処理する (Tensorflow)

1. コンボリューションをシーケンス処理に使用できる理由

前述したように、
サイクリック ニューラル ネットワークは、シーケンス データを入力として受け取り、シーケンスの進化方向に再帰を実行し、すべてのノード (サイクリック ユニット) がチェーンで接続される、一種の再帰的ニューラル ネットワーク (再帰ニューラル ネットワーク) です。
LSTM、GRU、BRNN (双方向リカレント ニューラル ネットワーク) はすべて、単語と周囲の単語を関連付けるように設計されており、遠すぎる単語間の相関は弱いため、多くの計算が無駄になります。

畳み込みニューラル ネットワークの各畳み込み層は複数の畳み込みユニットで構成され、各畳み込みユニットのパラメーターはバックプロパゲーション アルゴリズムを通じて最適化されます。特徴マッピングは、畳み込み演算を通じて入力のさまざまな特徴を抽出することによって実現されます。畳み込み層は、グローバル パターンをローカル パターンに変換しますビジョン
処理では、 2D 畳み込みを使用します
ここに画像の説明を挿入

したがって、1 次元畳み込みを使用して、シーケンスからシーケンス セグメントを抽出し、シーケンス内の局所的なパターンを識別することができます。
ここに画像の説明を挿入

2 つの 1 次元畳み込みニューラル ネットワーク

1 次元畳み込みニューラル ネットワークは、音声生成、機械翻訳などに使用できます。1 次元畳み込みニューラル ネットワークを使用して文章を処理すると、単語と単語セグメントを非常によく認識でき、単語レベルの 1 次元ニューラル ネットワークで単語の構成を学習できます。

1. 1 次元畳み込み層 Conv1D:

使用方法はConv2Dとほぼ同じです。

kernel_size : 1D 畳み込みウィンドウの長さを指定する整数または整数のタプル/リスト。
strides: ステップサイズを示します。
padding: パディング方法を示します。「SAME」はパディング方法を使用することを意味します。これは単にエッジを 0 でパディングすることとして理解されます。ストライドが 1 の場合、入力と出力の次元は同じです。「VALID」はパディングを使用せず、冗長に破棄することを意味します。「CAUSAL」は、因果的(拡張された)畳み込みを引き起こします。つまり、output[t] は input[t+1:] に依存しません。モデルが時間順序に違反しないように時間データをモデル化する場合に役立ちます。

入力は (サンプル、時間、特徴) であり、畳み込みウィンドウは時間軸上の 1 次元ウィンドウです。

tf.keras.layers.Conv1D(
フィルター、kernel_size、strides=1、padding='valid'、
data_format='channels_last'、dilation_rate=1、groups=1、
activation=None、use_bias=True、kernel_initializer='glorot_uniform'、
bias_initializer='zeros'、kernel_regulatory=None、bias_regulatory
=None、 activity _regulator=なし、kernel_constraint=なし、
bias_constraint=なし、**kwargs
)

# The inputs are 128-length vectors with 10 timesteps, and the batch size
# is 4.
input_shape = (4, 10, 128)
x = tf.random.normal(input_shape)
y = tf.keras.layers.Conv1D(32, 3, activation='relu',input_shape=input_shape[1:])(x)
print(y.shape)

2. 1 次元プーリング MaxPool1D:

1次元部分列を抽出し、その最大値(最大プーリング)または平均値(平均プーリング)を出力し、入力長を短縮します。

pool_size で定義されたウィンドウの最大値を使用して、入力表現をダウンサンプリングします。ウィンドウはかなりのステップで移動します。「有効な」パディング オプションを使用した場合の出力の結果の形状は次のとおりです。output_shape = (input_shape - pool_size + 1) / strides「
同じ」パディング オプションを使用した場合の出力の形状は次のとおりです。output_shape = input_shape/strides
pool_size: 整数、最大プーリング ウィンドウのサイズ。
strides : 整数またはなし。各マージ ステップでマージ ウィンドウをどれだけシフトするかを指定します。None の場合、デフォルトの pool_size になります。
「有効」または「同じ」のいずれかを入力します(大文字と小文字は区別されません)。「有効」はパディングがないことを意味します。"same" を指定すると、出力の高さ/幅の寸法が入力と同じになるように、入力の左/右または上/下に均等なパディングが行われます。

tf.keras.layers.MaxPool1D(
pool_size=2, strides=None, padding='valid',
data_format='channels_last', **kwargs
)

x = tf.constant([1., 2., 3., 4., 5.])
x = tf.reshape(x, [1, 5, 1])
tf.keras.layers.MaxPooling1D(pool_size=2,strides=1, padding='valid')

3. 1次元畳み込みニューラルネットワークの実現

Conv1D レイヤーMaxPooling1D レイヤーをスタックし、最後にグローバル プーリングを実行するか、Flatten レイヤーを使用して3D 出力を 2D に変換します分類と回帰のために、高密度レイヤーをモデルに追加できます。

例:

import tensorflow as tf
from tensorflow import keras
from keras.datasets import imdb
from keras.preprocessing import sequence

#加载数据集
import numpy as np
max_features = 1000
max_len = 500

(x_train,y_train),(x_test,y_test) = imdb.load_data(num_words=max_features)
x_train = sequence.pad_sequences(x_train,maxlen=max_len)
x_test = sequence.pad_sequences(x_test,maxlen=max_len)

#一维卷积神经网络

model = keras.Sequential([
  keras.layers.Embedding(max_features,128,input_length=max_len),
  keras.layers.Conv1D(32,7,activation='relu'),
  keras.layers.MaxPooling1D(5),
  keras.layers.Conv1D(32,7,activation='relu'),
  keras.layers.GlobalMaxPooling1D(), #全局池化
  keras.layers.Dense(1)    
])

#model.summary()

model.compile(optimizer=tf.optimizers.RMSprop(lr=1e-4),loss=tf.losses.binary_crossentropy,metrics=['acc'])

history = model.fit(x_train,y_train,epochs=10,batch_size=128)

3. CNNとRNNを組み合わせた処理シーケンス

1D 畳み込みニューラル ネットワークは、各入力シーケンス セグメントを個別に処理し、時間の影響を受けず、すべての位置でパターンを学習しますが、そのパターンの時間的位置は知りません。新しいデータ ポイントは、以前のデータ ポイントとは異なる方法で解釈される必要があります。
したがって、畳み込みニューラル ネットワークの速度と軽量性と、 RNN の次数感度を組み合わせます
畳み込みは、RNN の前で前処理ステップとして使用できます。

おすすめ

転載: blog.csdn.net/qq_43842886/article/details/113852939