Conv1D
weightをすべて1。biasをすべて0にした場合、
kernel_size分の要素を足して、filters分の次元数にコピーして出力される。
Conv1D(filters=5, kernel_size=3, padding="same", activation='relu', input_shape=(4,1)) # input data [ [ [1] [2] [3] [4] ] ] # output data [ [ [3. 3. 3. 3. 3.] [6. 6. 6. 6. 6.] [9. 9. 9. 9. 9.] [7. 7. 7. 7. 7.] ] ]
axis2の要素数が増えた場合もすべての要素が足される。
Conv1D(filters=5, kernel_size=3, padding="same", activation='relu', input_shape=(4,2)) # input data [[[1 2] [3 4] [5 6] [7 8]]] # output data [ [ [10. 10. 10. 10. 10.] [21. 21. 21. 21. 21.] [33. 33. 33. 33. 33.] [26. 26. 26. 26. 26.] ] ]
padding=”valid”にすると入力データがない範囲は出力されない。(axis 1の次元数が減る)
Conv1D(filters=5, kernel_size=3, padding="valid", activation='relu', input_shape=(4,1)) # input data [ [ [1] [2] [3] [4] ] ] # output [ [ [6. 6. 6. 6. 6.] [9. 9. 9. 9. 9.] ] ]
weightとbiasを含めた計算の流れ。
MaxPooling1D
pool_sizeごとに要素のまとまりをつくり、その中の最大値を出力にする。
MaxPooling1D(pool_size=2, padding='same', input_shape=(4,1))) # input data [ [ [1], [2], [3], [4], ] ] # output data [ [ [2], [4], ] ]
以下のように、axis 2(0ベース)の次元数(要素の数)が多い場合は、同一次元同士を比較して最大値を求める。
つまりaxis 2 の次元数は減らない。axis 1 の次元数は1/pool_sizeになる。
MaxPooling1D(pool_size=2, padding='same', input_shape=(4,2))) # input data: [ [ [1, 2], [3, 4], [5, 6], [7, 8], ] ] # output data [ [ [3, 4], [7, 8], ] ]