[keras]レイヤー動作

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],
  ]
]

LINEで送る
Pocket

タグ: