A diferença entre `Denso` e` TimeDistributedDense` de `Keras`

34

Ainda estou confuso sobre a diferença entre Densee TimeDistributedDensede Keras, embora já existam algumas perguntas semelhantes feitas aqui e aqui . As pessoas estão discutindo muito, mas não há conclusões comuns.

E mesmo assim, aqui , @fchollet afirmou que:

TimeDistributedDenseaplica uma mesma Denseoperação (totalmente conectada) a cada passo temporal de um tensor 3D.

Ainda preciso de uma ilustração detalhada sobre qual é exatamente a diferença entre eles.

fluency03
fonte

Respostas:

41

Digamos que você tenha dados de séries temporais com linhas e 700 colunas que você deseja alimentar para uma camada no Keras. Antes de alimentar isso com o RNN, é necessário remodelar os dados anteriores para um tensor 3D. Então, torna-se um N × 700 × 1 .N700SimpleRNN(200, return_sequence=True)N×700×1 1

RNN desenrolado

A imagem é tirada de https://colah.github.io/posts/2015-08-Understanding-LSTMs

Na RNN, suas colunas (as "700 colunas") são os intervalos de tempo da RNN. Seus dados são processados a partir de . Depois de alimentar os dados para o RNN, agora ele tem 700 saídas que são h 1 a h 700 , não h 1 a h 200 . Lembre-se de que agora o formato dos seus dados é N × 700 × 200, que são amostras (as linhas) x timesteps (as colunas) x canais .t=1 1 to 700h1 1h700h1 1h200N×700×200

E então, quando você aplica a TimeDistributedDense, está aplicando uma Densecamada em cada passo temporal, o que significa que está aplicando uma Densecamada em cada , h 2 , ..., h t, respectivamente. O que significa: na verdade, você está aplicando a operação totalmente conectada em cada um de seus canais (o "200"), respectivamente, de h 1 a h 700 . O primeiro " 1 × 1 × 200 " até o 700º " 1 × 1 × 200 ".h1 1h2hth1 1h7001 1×1 1×2001 1×1 1×200

Por que estamos fazendo isso? Porque você não deseja nivelar a saída RNN.

Por que não achatar a saída RNN? Porque você deseja manter os valores de cada intervalo de tempo separados.

Por que manter os valores de cada timestep separados? Porque:

  • você só deseja interagir com os valores entre seu próprio timestep
  • você não deseja ter uma interação aleatória entre diferentes intervalos de tempo e canais.
rilut
fonte
E então, quando você aplica um TimeDistributedDense, aplica uma camada Densa em cada timestep -> Isso significa que cada timestep compartilha o peso da camada Densa? Com a camada Densa, isso não se aplica apenas ao último timestep?
o0omycomputero0o
2
Por que TimeDistributedDense não é usado no exemplo de Keras em blog.keras.io/… ?
user1934212
Porque TimeDistributedDense já está obsoleto. Desde Keras 2.0, Dense pode lidar com tensor> 2-dimensional bem
rilut