嵌入层后退出层

问题描述

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')
])

我可以理解何时在密集层之间应用了滤除,该滤除会随机丢弃并防止前一层神经元更新参数。我不明白Embedding layer之后辍学的工作原理。

比方说,Embedding layer输出形状为(batch_size,20,16),或者如果我们忽略批量大小,则简单地称为(20,16)。辍学如何应用于嵌入层的输出

随机删除行或列吗?

解决方法

辍学层丢弃前一层的输出。
它将随机将先前的输出强制为0。
在您的情况下,嵌入层的输出将为3d张量(大小为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,4),dtype=float32,numpy=
array([[[ 0.,0.,[ 0.,12.,[18.,[[26.,[34.,36.,38.,0.],46.,48.]],[[50.,52.,54.,60.,72.]]],dtype=float32)>

您应该考虑的一种方法是SpatialDropout1d,它实际上将删除整个列。

layer = tf.keras.layers.SpatialDropout1D(0.5)
outputs = layer(data,training=True)

输出:

<tf.Tensor: shape=(3,numpy=
array([[[ 2.,[10.,28.,40.],[42.,44.,[[ 0.,56.],62.,64.],70.,dtype=float32)>

我希望这能消除您的困惑。