如何解决嵌入层后退出层
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)>
我希望这能消除您的困惑。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。