Встраивание слов для сверточной нейронной сети

Я пытаюсь применить word2vec для сверточной нейронной сети. Я новичок в Tensorflow. Вот мой код для слоя перед поездом.

W = tf.Variable(tf.constant(0.0, shape=[vocabulary_size, embedding_size]),
                trainable=False, name="W")
embedding_placeholder = tf.placeholder(tf.float32, [vocabulary_size, embedding_size])
embedding_init = W.assign(embedding_placeholder)
sess = tf.Session()
sess.run(embedding_init, feed_dict={embedding_placeholder: final_embeddings})

Я думаю, что мне следует использовать embedding_lookup, но не знаю, как его использовать. Я действительно appreace это кто-то может дать несколько советов.

Спасибо


person ngoduyvu    schedule 07.07.2016    source источник


Ответы (3)


Ты на правильном пути. Поскольку embedding_lookup работает в предположении, что слова представлены как целочисленные идентификаторы, вам необходимо преобразовать ваши входные векторы, чтобы они соответствовали этому. Кроме того, вам нужно убедиться, что ваши преобразованные слова правильно проиндексированы в матрице встраивания. Что я сделал, так это использовал информацию об отображении индекса в слово, сгенерированную из модели встраивания (я использовал gensim для обучения своих вложений), чтобы создать таблицу поиска слова в индекс, которую я впоследствии использовал для преобразования моих входных векторов. .

person Frobb    schedule 08.07.2016
comment
Спасибо, Фробб, я так рад это слышать. Я пытался использовать embedding_lookup , однако у меня возникли проблемы с передачей аргумента. У меня есть обучающие данные, которые помечены, я использовал word2vec_basic.py для предварительной подготовки своих данных. Я читал на многих веб-сайтах, что некоторые говорили, что мне нужно сопоставить вектор слова со словарем. Вот так embedded_chars = tf.nn.embedding_lookup(W,dictionary) Но это дало ошибку, что-то с размерностью Tensor, я попытался изменить переменную «словарь» на «данные» или «обратный_словарь», но не помогло. Не могли бы вы дать мне какой-либо совет. Спасибо - person ngoduyvu; 08.07.2016
comment
Второй аргумент embedding_lookup должен быть тензором, содержащим ваши входные данные. Взгляните на сообщение в блоге, предоставленное @Kashyap, и вы увидите, что второй аргумент — это тензор-заполнитель для (пакетных) входных данных. Вам просто нужно убедиться, что слова ваших входных данных были преобразованы в целые числа в соответствии со схемой слова в индекс, о которой я упоминал ранее. - person Frobb; 08.07.2016
comment
В блоге писатель сказал, что индексы словарных слов сопоставляются с низкоразмерными векторными представлениями. В word2vec_basic.py переменная хранит данные с индексом distionary. Итак, я сделал так: embedded_chars = tf.nn.embedding_lookup(W, data) Я запустил его, и он не выдал никаких ошибок. Как вы думаете, это правильный путь? Спасибо - person ngoduyvu; 09.07.2016
comment
Я не уверен, что следую. Я раньше не работал с этим кодом, но он выглядит как переменная data для word2vec_basic.py (если вы имеете в виду этот исходный код?) содержит версию разархивированных исходных данных с преобразованием слова в индекс, которая содержится в переменной words. Это то, что вы пытаетесь ввести в слой внедрения вашей CNN? - person Frobb; 12.07.2016
comment
Да, это код, который я использовал, я пытался сопоставить индекс с созданным мной весом. Вот полный код W = tf.Variable(tf.constant(0.0, shape=[vocabulary_size, embedding_size]), trainable=False, name="W") embedding_placeholder = tf.placeholder(tf.float32, [vocabulary_size, embedding_size]) embedding_init = W.assign(embedding_placeholder) sess = tf.Session() sess.run(embedding_init, feed_dict={embedding_placeholder: final_embeddings}) embedded_chars = tf.nn.embedding_lookup(W, data) embedded_chars_expanded = tf.expand_dims(embedded_chars, -1) - person ngoduyvu; 14.07.2016
comment
Что ж, если это данные, которые вы хотите ввести в свой CNN, тогда все в порядке! Вы ищете вложения набора текстовых данных, которые закодированы целым числом в соответствии с индексами матрицы вложения. Я просто всегда предполагал, что вы хотите использовать предварительно обученные вложения в W для какой-то другой последующей задачи, например, для классификации какого-либо другого набора данных. - person Frobb; 14.07.2016
comment
Да, это то, что я хочу сделать. - person ngoduyvu; 15.07.2016

В Tensorflow есть пример использования word2vec-cnn для классификации текста: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/skflow/text_classification_cnn.py

person Zichen Wang    schedule 07.07.2016
comment
Спасибо за ваш ответ. их код мало чем отличается. Они используют вектор onehot для кодирования слова, а не word2vec. В этой строке: могу ли я изменить его, используя мой final_embedded ? byte_list = tf.reshape(learn.ops.one_hot_matrix(x, 256), [-1, MAX_DOCUMENT_LENGTH, 256, 1]) - person ngoduyvu; 08.07.2016

Я делаю что-то подобное. Я наткнулся на этот блог, который реализует статью «Сверточные нейронные сети для классификации предложений». Этот блог хорош. http://www.wildml.com/2015/12/implementing-a-cnn-for-text-classification-in-tensorflow/

person Kashyap    schedule 07.07.2016
comment
Да, я видел это, но они не используют встраивание слов. - person ngoduyvu; 08.07.2016