machine-learning - principiantes - keras tensorflow
Explique con un ejemplo: cómo funciona la incrustación de capas en keras (1)
La capa de incrustación crea vectores de inserción de las palabras de entrada (yo mismo todavía no entiendo las matemáticas) de forma similar a lo que haría un guante word2vec o precalculado.
Antes de llegar a su código, hagamos un pequeño ejemplo.
texts = [''This is a text'',''This is not a text'']
Primero convertimos estas oraciones en el vector de los enteros, donde cada palabra es un número asignado a la palabra en el diccionario y el orden del vector crea la secuencia de las palabras.
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
from keras.utils import to_categorical
max_review_length = 6 #maximum length of the sentence
embedding_vecor_length = 3
top_words = 10
#num_words is tne number of unique words in the sequence, if there''s more top count words are taken
tokenizer = Tokenizer(top_words)
tokenizer.fit_on_texts(texts)
sequences = tokenizer.texts_to_sequences(texts)
word_index = tokenizer.word_index
input_dim = len(word_index) + 1
print(''Found %s unique tokens.'' % len(word_index))
#max_review_length is the maximum length of the input text so that we can create vector [... 0,0,1,3,50] where 1,3,50 are individual words
data = pad_sequences(sequences, max_review_length)
print(''Shape of data tensor:'', data.shape)
print(data)
[Out:]
''This is a text'' --> [0 0 1 2 3 4]
''This is not a text'' --> [0 1 2 5 3 4]
Ahora puede ingresarlos en la capa de inserción
from keras.models import Sequential
from keras.layers import Embedding
model = Sequential()
model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length,mask_zero=True))
model.compile(optimizer=''adam'', loss=''categorical_crossentropy'')
output_array = model.predict(data)
output_array contiene una matriz de tamaño (2, 6, 3): 2 comentarios de entrada u oraciones en mi caso, 6 es el número máximo de palabras en cada revisión (max_review_length) y 3 es embedding_vecor_length. P.ej
array([[[-0.01494285, -0.007915 , 0.01764857],
[-0.01494285, -0.007915 , 0.01764857],
[-0.03019481, -0.02910612, 0.03518577],
[-0.0046863 , 0.04763055, -0.02629668],
[ 0.02297204, 0.02146662, 0.03114786],
[ 0.01634104, 0.02296363, -0.02348827]],
[[-0.01494285, -0.007915 , 0.01764857],
[-0.03019481, -0.02910612, 0.03518577],
[-0.0046863 , 0.04763055, -0.02629668],
[-0.01736645, -0.03719328, 0.02757809],
[ 0.02297204, 0.02146662, 0.03114786],
[ 0.01634104, 0.02296363, -0.02348827]]], dtype=float32)
En su caso, tiene una lista de 5000 palabras, que puede crear una revisión de un máximo de 500 palabras (se recortarán más) y convertir cada una de estas 500 palabras en vector de tamaño 32.
Puede ejecutar un mapeo entre los índices de palabras y los vectores de incrustación ejecutando:
model.layers[0].get_weights()
En el caso a continuación, top_words fue 10, por lo que tenemos un mapeo de 10 palabras y puede ver que la asignación para 0, 1, 2, 3, 4 y 5 es igual a output_array anterior.
[array([[-0.01494285, -0.007915 , 0.01764857],
[-0.03019481, -0.02910612, 0.03518577],
[-0.0046863 , 0.04763055, -0.02629668],
[ 0.02297204, 0.02146662, 0.03114786],
[ 0.01634104, 0.02296363, -0.02348827],
[-0.01736645, -0.03719328, 0.02757809],
[ 0.0100757 , -0.03956784, 0.03794377],
[-0.02672029, -0.00879055, -0.039394 ],
[-0.00949502, -0.02805768, -0.04179233],
[ 0.0180716 , 0.03622523, 0.02232374]], dtype=float32)]
Como se menciona en https://stats.stackexchange.com/questions/270546/how-does-keras-embedding-layer-work, estos vectores se inician de forma aleatoria y se optimizan con los optimizadores de palabras clave al igual que con cualquier otro parámetro de la red.
No entiendo la capa de incrustación de Keras. Aunque hay muchos artículos que lo explican, aún estoy confundido. Por ejemplo, el siguiente código del análisis de sentimiento de imdb
top_words = 5000
max_review_length = 500
embedding_vecor_length = 32
model = Sequential()
model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length))
model.add(LSTM(100))
model.add(Dense(1, activation=''sigmoid''))
model.compile(loss=''binary_crossentropy'', optimizer=''adam'', metrics=[''accuracy''])
print(model.summary())
model.fit(X_train, y_train, nb_epoch=3, batch_size=64)
En este código, ¿qué hace exactamente la capa de incrustación, cuál sería el resultado de la capa de incrustación, sería bueno si alguien pudiera explicarlo con algún ejemplo puede ser !!