Estou tentando começar a aprender sobre RNNs e estou usando o Keras. Entendo a premissa básica das camadas RNN e LSTM de baunilha, mas estou tendo problemas para entender um certo ponto técnico do treinamento.
Na documentação do keras , diz que a entrada para uma camada RNN deve ter forma (batch_size, timesteps, input_dim)
. Isso sugere que todos os exemplos de treinamento têm um comprimento de sequência fixo, a saber timesteps
.
Mas isso não é especialmente típico, é? Talvez eu queira que o RNN opere em sentenças de comprimentos variados. Quando treiná-lo em algum corpus, alimentarei lotes de frases, com comprimentos diferentes.
Suponho que a coisa mais óbvia a fazer seria encontrar o comprimento máximo de qualquer sequência no conjunto de treinamento e zerá-lo. Mas então isso significa que não posso fazer previsões no tempo de teste com tamanho de entrada maior que isso?
Esta é uma pergunta sobre a implementação específica de Keras, suponho, mas também estou perguntando o que as pessoas normalmente fazem quando enfrentam esse tipo de problema em geral.
Masking
camada como ignorRespostas:
Isso não está correto, pois essa dimensão pode ser
None
, ou seja, comprimento variável. Dentro de um único lote , você deve ter o mesmo número de timesteps (normalmente é onde você encontra preenchimento de 0 e máscara). Mas entre lotes não existe essa restrição. Durante a inferência, você pode ter qualquer comprimento.Código de exemplo que cria lotes aleatórios de dados de treinamento.
E é isso que imprime. Observe que as formas de saída estão
(None, None, x)
indicando tamanho de lote variável e tamanho de timestep variável.fonte
fit()
, podemos passar osequence_lenth
parâmetro para especificar o comprimento da sequência para excluí-lo. Parece que a abordagem do gerador não permite ignorar 0 seqüências?(inputs, targets, sample_weights)
e você pode definirsample_weights
seus pads 0 como 0. No entanto, não tenho certeza se isso funcionaria perfeitamente para RNNs bidirecionais.model.predict_generator
com um conjunto de testes. Quando tento prever com um gerador, recebo um erro em relação à concatenação (o conjunto de testes também possui seqüências de comprimento variável). Minha solução foi usar o padrão demodel.predict
maneira hacky. Talvez isso seja mais adequado para uma nova pergunta?@kbrose parece ter uma solução melhor
Geralmente é uma boa solução. Talvez tente o comprimento máximo da sequência + 100. Use o que for melhor para o seu aplicativo.
Não necessariamente. A razão pela qual um comprimento fixo é usado no keras é porque ele melhora muito o desempenho ao criar tensores de formas fixas. Mas isso é apenas para treinamento. Após o treinamento, você aprenderá os pesos certos para sua tarefa.
Vamos supor que, após o treinamento por horas, você perceba que o comprimento máximo do seu modelo não era grande / pequeno o suficiente e agora precisa alterar as etapas de tempo, basta extrair os pesos aprendidos do modelo antigo, criar um novo modelo com as novas etapas de tempo e injetar os pesos aprendidos nele.
Você provavelmente pode fazer isso usando algo como:
new_model.set_weights(old_model.get_weights())
Eu ainda não tentei. Experimente e publique seus resultados aqui para benefício de todos. Aqui estão alguns links: um dois
fonte
max length + 100
. Veja minha resposta, por exemplo, código.Bidirectional(LSTM)()
e asRepeatVector()
camadas, e as previsões são perfeitamente viáveis.