Выпадающий слой после встраивания слоя

#tensorflow #nlp #lstm #recurrent-neural-network #word-embedding

#tensorflow #nlp #lstm #рекуррентная нейронная сеть #word-встраивание

Вопрос:

 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) , если мы игнорируем размер пакета. Как выпадающий слой применяется к выходным данным слоя встраивания?

Случайно выпадающие строки или столбцы?

Ответ №1:

Выпадающий слой удаляет выходные данные предыдущих слоев.
Это случайным образом приведет к тому, что предыдущие выходные данные будут равны 0.
В вашем случае результатом вашего встраиваемого слоя будет 3d tensor (размер, 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)>
  

Я надеюсь, что это устраняет ваше замешательство.

Комментарии:

1. Спасибо. Я нахожу не интуитивно понятным представлять вывод слоя встраивания в виде нейронов. В этом случае, сколько нейронов существует до выпадения?

2. Не могли бы вы, пожалуйста, принять и поддержать, сработало ли решение.