kersas LSTMモデルを構築する際の長いシーケンスの処理動作
余計なことを言わないで、コードを見てください。
Summary
RNN
サンプルと同じように、計算された状態値と出力構造が一致しています。つまり、現在時刻の入力値も前の状態値と同じであれば、現在の状態値と現在の出力結果は一致しています。
RNNの最終状態値は最後の時刻の出力値と一致している。
入力データの要求フォーマットは、shop=(batch_)です。size,step_time_size,input_size)では、stateのshop=(batch_size,state_size;outputのshop=(batchu)size,step_time_size,state_size)そして最後の有効出力(有効シーケンス長、paddingを含まない部分)は状態値と同じです。
LSTM
LSTMとRNNは基本的に一致していますが、その状態には二つのc_があります。stateとh_state、それらのshopは同じで、出力値Outputの最後の有効出力はh_と同じです。state一致
RNNを長くする訓練で、その入力フォーマットを要求してもshop=(batch_)とする。size,step_time_size,input_size)は、各ロットの有効シーケンス長を指定することができ、有効長さ内ではその状態値と出力値原理は変わらないが、有効長さを超える部分の状態値は変更されず、出力値はshape=(state_)となる。size,)のゼロベクトル(注:RNNもこの原理です)
なお、無効シーケンス長部分の全paddingが0であるために出力が全て0となるのではなく、状態は不変である。出力値と状態は現在時刻の入力値だけでなく、前の時刻の状態値にも依存するからである。その内部原理は、mask matirix行列を利用して有効部分と無効部分をマークします。これは無効部分では計算しなくてもいいです。つまり、この部分は逆方向に伝搬する時のパラメータの更新を引き起こしません。もちろん、paddingがゼロでなければ、paddingのこの部分の出力と状態は同じくpaddingがゼロであるという結果は同じである。
考え方例コード
print(np.shape(X))#(1920, 45, 20)
X=sequence.pad_sequences(X, maxlen=100, padding='post')
print(np.shape(X))#(1920, 100, 20)
model = Sequential()
model.add(Masking(mask_value=0,input_shape=(100,20)))
model.add(LSTM(128,dropout_W=0.5,dropout_U=0.5))
model.add(Dense(13,activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
# , ,
checkpointer = ModelCheckpoint(filepath="keras_rnn.hdf5", verbose=1, save_best_only=True, )
history = LossHistory()
result = model.fit(X, Y, batch_size=10,
nb_epoch=500, verbose=1, validation_data=(testX, testY),
callbacks=[checkpointer, history])
model.save('keras_rnn_epochend.hdf5')
追加知識:RNN(LSTM)データ形式及びPadding操作処理が長くなるシーケンスdynamic_rnSummary
RNN
サンプルと同じように、計算された状態値と出力構造が一致しています。つまり、現在時刻の入力値も前の状態値と同じであれば、現在の状態値と現在の出力結果は一致しています。
RNNの最終状態値は最後の時刻の出力値と一致している。
入力データの要求フォーマットは、shop=(batch_)です。size,step_time_size,input_size)では、stateのshop=(batch_size,state_size;outputのshop=(batchu)size,step_time_size,state_size)そして最後の有効出力(有効シーケンス長、paddingを含まない部分)は状態値と同じです。
LSTM
LSTMとRNNは基本的に一致していますが、その状態には二つのc_があります。stateとh_state、それらのshopは同じで、出力値Outputの最後の有効出力はh_と同じです。state一致
RNNを長くする訓練で、その入力フォーマットを要求してもshop=(batch_)とする。size,step_time_size,input_size)は、各ロットの有効シーケンス長を指定することができ、有効長さ内ではその状態値と出力値原理は変わらないが、有効長さを超える部分の状態値は変更されず、出力値はshape=(state_)となる。size,)のゼロベクトル(注:RNNもこの原理です)
なお、無効シーケンス長部分の全paddingが0であるために出力が全て0となるのではなく、状態は不変である。出力値と状態は現在時刻の入力値だけでなく、前の時刻の状態値にも依存するからである。その内部原理は、mask matirix行列を利用して有効部分と無効部分をマークします。これは無効部分では計算しなくてもいいです。つまり、この部分は逆方向に伝搬する時のパラメータの更新を引き起こしません。もちろん、paddingがゼロでなければ、paddingのこの部分の出力と状態は同じくpaddingがゼロであるという結果は同じである。
'''
# (batch_size,time_step_size, input_size[embedding_size]) , samples=4,timesteps=3,features=3, 、 ,
'''
import pandas as pd
import numpy as np
import tensorflow as tf
train_X = np.array([[[0, 1, 2], [9, 8, 7], [3,6,8]],
[[3, 4, 5], [0, 10, 110], [0,0,0]],
[[6, 7, 8], [6, 5, 4], [1,7,4]],
[[9, 0, 1], [3, 7, 4], [0,0,0]],
[[9, 0, 1], [3, 3, 4], [0,0,0]]
])
sequence_length = [3, 1, 3, 2, 2]
train_X.shape, train_X[:,2:3,:].reshape(5, 3)
tf.reset_default_graph()
x = tf.placeholder(tf.float32, shape=(None, 3, 3)) # shape ,list ,shape shape , shape
rnn_cell = tf.nn.rnn_cell.BasicRNNCell(num_units=6) # state_size[hidden_size]
lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(num_units=6) # state_size[hidden_size]
outputs1, state1 = tf.nn.dynamic_rnn(rnn_cell, x, dtype=tf.float32, sequence_length=sequence_length)
outputs2, state2 = tf.nn.dynamic_rnn(lstm_cell, x, dtype=tf.float32, sequence_length=sequence_length)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer()) # rnn_cell
outputs1, state1 = sess.run((outputs1, state1), feed_dict={x: train_X})
outputs2, state2 = sess.run([outputs2, state2], feed_dict={x: train_X})
print(outputs1.shape, state1.shape) # (4, 3, 5)->(batch_size, time_step_size, state_size), (4, 5)->(batch_size, state_size)
print(outputs2.shape) # state2 LSTMStateTuple(c_state, h_state)
print("---------output1<rnn>state1-----------")
print(outputs1) # output1 state1, output1[:,-1,:] state1
print(state1)
print(np.all(outputs1[:,-1,:] == state1))
print("---------output2<lstm>state2-----------")
print(outputs2) # output2 LSTMStateTuple h
print(state2)
print(np.all(outputs2[:,-1,:] == state2[1]))
また、恨みdy namic_rnnのデータ系列長tricks考え方例コード
from collections import Counter
import numpy as np
origin_data = np.array([[1, 2, 3],
[3, 0, 2],
[1, 1, 4],
[2, 1, 2],
[0, 1, 1],
[2, 0, 3]
])
# ( RNN ),
# [[[1, 2, 3], [0, 0, 0], [0, 0, 0]],
# [[3, 0, 2], [2, 0, 3], [0, 0, 0]],
# [[1, 1, 4], [2, 1, 2], [0, 1, 1]]]
# ,
def groupby(a, col_index): #
max_len = max(Counter(a[:, col_index]).values())
for i in set(a[:, col_index]):
d[i] = []
for sample in a:
d[sample[col_index]].append(list(sample))
# for key in d:
# d[key].extend([[0]*a.shape[1] for _ in range(max_len-len(d[key]))])
return list(d.values()), [len(_) for _ in d.values()]
samples, sizes = groupby(origin_data, 2)
# , max(sizes) padding ( , ( padding )), ( ) padding ,
paddig_samples = np.zeros([len(samples), max(sizes), 3])
for seq_index, seq in enumerate(samples):
paddig_samples[seq_index, :len(seq), :] = seq
paddig_samples
以上のkersはLSTMモデルを構築する時に、長いシーケンスに対する処理操作は小編集で皆さんに共有する内容です。参考にしてもらいたいです。どうぞよろしくお願いします。