Como utilizar a camada Embedding para Recurrent Neural Network (RNN) em Keras

votos
9

Eu sou um pouco novo para Redes Neurais e da Biblioteca Keras e eu estou querendo saber como eu posso usar a Camada Embedding como descrito aqui para mascarar meus dados de entrada a partir de um tensor 2D para um tensor 3D para uma RNN .

Dizem que os dados meus TimeSeries procura da seguinte forma (com um tempo cada vez maior):

X_train = [
   [1.0,2.0,3.0,4.0],
   [2.0,5.0,6.0,7.0],
   [3.0,8.0,9.0,10.0],
   [4.0,11.0,12.0,13.0],
   ...
] # with a length of 1000

Agora, digamos que eu gostaria de dar a RNN últimos 2 vetores de características, a fim de prever o vetor de características para o tempo t + 1.

Atualmente (sem a camada Embedding), eu estou criando o tensor 3D necessário com forma (nb_samples, Timesteps, input_dim) me (como no exemplo aqui ).

Relacionado com o meu exemplo, a final Tensor 3D, então, olhar como se segue:

X_train_2 = [
  [[1.0,2.0,3.0,4.0],
   [2.0,5.0,6.0,7.0]],
  [[2.0,5.0,6.0,7.0],
   [3.0,8.0,9.0,10.0]],
  [[3.0,8.0,9.0,10.0],
   [4.0,11.0,12.0,13.0]],
  etc...
]

e Y_train:

Y_train = [
   [3.0,8.0,9.0,10.0],
   [4.0,11.0,12.0,13.0],
   etc...
]

Meu modelo olha como segue (adaptado para o exemplo simplificado acima):

num_of_vectors = 2
vect_dimension = 4

model = Sequential()
model.add(SimpleRNN(hidden_neurons, return_sequences=False, input_shape=(num_of_vectors, vect_dimension))) 
model.add(Dense(vect_dimension))
model.add(Activation(linear))
model.compile(loss=mean_squared_error, optimizer=rmsprop)
model.fit(X_train, Y_train, batch_size=50, nb_epoch=10, validation_split=0.15)

E, finalmente, a minha pergunta seria, como posso evitar fazer os tensor 2D para 3D tensor remodelar a mim mesmo e usar a camada Embedding em vez disso? Eu acho que depois model = seqüencial () eu teria que adicionar algo como:

model.add(Embedding(?????))

Provavelmente a resposta é bastante simples, eu estou simplesmente confuso com a documentação da camada de incorporação.

Publicado 29/01/2016 em 14:57
fonte usuário
Em outras línguas...                            


2 respostas

votos
7

Você pode você da seguinte forma:

Nota:

  1. I gerou alguma X e Y como 0s só para lhe dar uma ideia da estrutura de entrada.

  2. Se você está tendo uma classe y_train multi, você precisará binarize.

  3. Talvez seja necessário adicionar preenchimento se você tiver dados de vários comprimentos.

  4. Se eu entendi corretamente sobre a previsão no tempo t + 1, você pode querer olhar para Sequence à aprendizagem Sequence.

Tente algo como:

hidden_neurons = 4
nb_classes =3
embedding_size =10

X = np.zeros((128, hidden_neurons), dtype=np.float32)
y = np.zeros((128, nb_classes), dtype=np.int8)


model = Sequential()
model.add(Embedding(hidden_neurons, embedding_size))
model.add(SimpleRNN(hidden_neurons, return_sequences=False)) 
model.add(Dense(nb_classes))
model.add(Activation("softmax"))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', class_mode="categorical")
model.fit(X, y, batch_size=1, nb_epoch=1)
Respondeu 10/02/2016 em 00:14
fonte usuário

votos
0

Pelo que eu sei até agora, a camada Embedding parece ser mais ou menos para redução de dimensionalidade como palavra incorporação . Então, nesse sentido, não parece aplicável como ferramenta geral reformulação.

Basicamente, se você tem um mapeamento de palavras para números inteiros, como {carro: 1, mouse: 2 ... zebra: 9999}, o seu texto de entrada seria vetor de palavras representadas por eles inteiro id, como [1, 2, 9999 .. .], o que significaria carro [, rato, zebra ...]. Mas parece ser eficiente para mapear palavras para vetores de números reais com comprimento da vocabular, por isso, se o seu texto tem 1000 palavras únicas, você mapear cada palavra a vetor de números reais com comprimento de 1000. Não tenho certeza, mas eu acho que a maioria representa um peso de quão semelhantes um significado de uma palavra é para todas as outras palavras, mas eu não tenho certeza que é certo e wheher existem outras maneiras de incorporar palavras.

Respondeu 17/11/2016 em 20:42
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more