嵌入层之后的丢弃层
Dropout layer after embedding layer
model = tf.keras.Sequential([
tf.keras.layers.Embedding(1000, 16, input_length=20),
tf.keras.layers.Dropout(0.2), # <- How does the dropout work?
tf.keras.layers.Conv1D(64, 5, activation='relu'),
tf.keras.layers.MaxPooling1D(pool_size=4),
tf.keras.layers.LSTM(64),
tf.keras.layers.Dense(1, activation='sigmoid')
])
我能理解什么时候在Dense层之间应用dropout,随机丢弃并阻止前层神经元更新参数。我不明白在 Embedding layer
.
之后 dropout 是如何工作的
假设 Embedding layer
的输出形状是 (batch_size,20,16)
或者如果我们忽略批量大小就简单地 (20,16)
。 dropout 如何应用于嵌入层的输出?
随机删除行或列?
dropout 层丢弃前面层的输出。
它会随机强制以前的输出为 0.
在您的情况下,嵌入层的输出将是 3d 张量 (size, 20, 16)
import tensorflow as tf
import numpy as np
tf.random.set_seed(0)
layer = tf.keras.layers.Dropout(0.5)
data = np.arange(1,37).reshape(3, 3, 4).astype(np.float32)
data
输出
array([[[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.]],
[[13., 14., 15., 16.],
[17., 18., 19., 20.],
[21., 22., 23., 24.]],
[[25., 26., 27., 28.],
[29., 30., 31., 32.],
[33., 34., 35., 36.]]], dtype=float32)
代码:
outputs = layer(data, training=True)
outputs
输出:
<tf.Tensor: shape=(3, 3, 4), dtype=float32, numpy=
array([[[ 0., 0., 6., 8.],
[ 0., 12., 0., 16.],
[18., 0., 22., 24.]],
[[26., 0., 0., 32.],
[34., 36., 38., 0.],
[ 0., 0., 46., 48.]],
[[50., 52., 54., 0.],
[ 0., 60., 0., 0.],
[ 0., 0., 0., 72.]]], dtype=float32)>
您应该考虑的一种方法是 SpatialDropout1d,它实际上会删除整个列。
layer = tf.keras.layers.SpatialDropout1D(0.5)
outputs = layer(data, training=True)
输出:
<tf.Tensor: shape=(3, 3, 4), dtype=float32, numpy=
array([[[ 2., 0., 6., 8.],
[10., 0., 14., 16.],
[18., 0., 22., 24.]],
[[26., 28., 0., 32.],
[34., 36., 0., 40.],
[42., 44., 0., 48.]],
[[ 0., 0., 54., 56.],
[ 0., 0., 62., 64.],
[ 0., 0., 70., 72.]]], dtype=float32)>
希望这能消除您的困惑。
model = tf.keras.Sequential([
tf.keras.layers.Embedding(1000, 16, input_length=20),
tf.keras.layers.Dropout(0.2), # <- How does the dropout work?
tf.keras.layers.Conv1D(64, 5, activation='relu'),
tf.keras.layers.MaxPooling1D(pool_size=4),
tf.keras.layers.LSTM(64),
tf.keras.layers.Dense(1, activation='sigmoid')
])
我能理解什么时候在Dense层之间应用dropout,随机丢弃并阻止前层神经元更新参数。我不明白在 Embedding layer
.
假设 Embedding layer
的输出形状是 (batch_size,20,16)
或者如果我们忽略批量大小就简单地 (20,16)
。 dropout 如何应用于嵌入层的输出?
随机删除行或列?
dropout 层丢弃前面层的输出。
它会随机强制以前的输出为 0.
在您的情况下,嵌入层的输出将是 3d 张量 (size, 20, 16)
import tensorflow as tf
import numpy as np
tf.random.set_seed(0)
layer = tf.keras.layers.Dropout(0.5)
data = np.arange(1,37).reshape(3, 3, 4).astype(np.float32)
data
输出
array([[[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.]],
[[13., 14., 15., 16.],
[17., 18., 19., 20.],
[21., 22., 23., 24.]],
[[25., 26., 27., 28.],
[29., 30., 31., 32.],
[33., 34., 35., 36.]]], dtype=float32)
代码:
outputs = layer(data, training=True)
outputs
输出:
<tf.Tensor: shape=(3, 3, 4), dtype=float32, numpy=
array([[[ 0., 0., 6., 8.],
[ 0., 12., 0., 16.],
[18., 0., 22., 24.]],
[[26., 0., 0., 32.],
[34., 36., 38., 0.],
[ 0., 0., 46., 48.]],
[[50., 52., 54., 0.],
[ 0., 60., 0., 0.],
[ 0., 0., 0., 72.]]], dtype=float32)>
您应该考虑的一种方法是 SpatialDropout1d,它实际上会删除整个列。
layer = tf.keras.layers.SpatialDropout1D(0.5)
outputs = layer(data, training=True)
输出:
<tf.Tensor: shape=(3, 3, 4), dtype=float32, numpy=
array([[[ 2., 0., 6., 8.],
[10., 0., 14., 16.],
[18., 0., 22., 24.]],
[[26., 28., 0., 32.],
[34., 36., 0., 40.],
[42., 44., 0., 48.]],
[[ 0., 0., 54., 56.],
[ 0., 0., 62., 64.],
[ 0., 0., 70., 72.]]], dtype=float32)>
希望这能消除您的困惑。