パラメータ数の計算まとめ
NN , CNN , Embedding , SimpleRNN, LSTM, GRU
#CNN, NN(Dense)
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',
input_shape=(150, 150, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(GlobalAveragePooling2D())
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
* MaxPooling2Dは2*2の範囲ごとの最大値を取るだけのためパラメーターなし
* GlobalAveragePooling2Dは各チャンネルの平均を取るだけのためパラメーターなし
#Conv2D(1つ目)
3 * 3 * 3 * 32 + 32 = 896
フィルターの縦 * フィルターの横 * 入力のチャンネル数 * 出力のチャンネル数 + バイアス(1チャンネルごとに1つ)
#Conv2D(2つ目)
3 * 3 * 32 * 64 + 64 = 18496
フィルターの縦 * フィルターの横 * 入力のチャンネル数 * 出力のチャンネル数 + バイアス(1チャンネルごとに1つ)
##図解
#Dense
128 * 32 + 32 = 4128
入力ユニット数 * 出力ユニット数 + バイアス(出力1ユニットごとに1つ)
シンプルなニューラルネットワーク, バイアスを忘れずに
##図解
#Embedding , SimpleRNN, LSTM, GRU
model = Sequential()
model.add(Embedding(4000,32,input_length=20))
model.add(LSTM(64))
#model.add(SimpleRNN(64))
#model.add(GRU(64))
model.add(Dense(3))
model.add(Activation("softmax"))
#Embedding
4000 * 32 = 128000
・Embedding層は全結合層だが、バイアスはない
・ワンホットベクトルを小さな(密な)ベクトルに変換するための層
##図解
#SimpleRNN
32 * 64 + 64 * 64 + 64 = 6208
・入力に対しての重み
入力の次元数x隠れ状態の次元数
→ 32*64
・隠れ状態に対しての重み
隠れ状態の次元数 x 隠れ状態の次元数
→ 64*64
・バイアス
隠れ状態の次元数
→ 64
##図解
#LSTM
32 * 64 * 4 + 64 * 64 * 4 + 64 * 4 = 24832
・入力に対しての重み
入力の次元数 * 隠れ状態の次元数 * 4 (forgetに1つ、inputに2つ、outputに1つ)
→ 32 * 64 * 4
・隠れ状態に対しての重み
隠れ状態(記憶セル)の次元数 * 隠れ状態の次元数 * 4 (forgetに1つ、inputに2つ、outputに1つ)
→ 64 * 64 * 4
・バイアス
隠れ状態の次元数 * 4 (forgetに1つ、inputに2つ、outputに1つ)
→ 64 * 4
#GRU
32643 + 64643 + 64*3 = 18624
・入力に対しての重み
入力の次元数 * 隠れ状態の次元数 * 3 (リセットゲートで1つ、更新ゲートで2つ)
→ 32 * 64 * 3
・隠れ状態に対しての重み
隠れ状態の次元数 * 隠れ状態の次元数 * 3 (リセットゲートで1つ、更新ゲートで2つ)
→ 64 * 64 * 3
・バイアス
隠れ状態の次元数 * 3 (リセットゲートで1つ、更新ゲートで2つ)
→ 64 * 3