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
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 t o 700 h1 1h700h1 1h200N× 700 × 200
E então, quando você aplica a TimeDistributedDense
, está aplicando uma Dense
camada em cada passo temporal, o que significa que está aplicando uma Dense
camada 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 × 2001 × 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.