Компилятор будет генерировать код для каждого экземпляра шаблона при использовании шаблона во время этапа компиляции. В процессе компиляции и компоновки файлы .cpp преобразуются в чистый объектный или машинный код, который в них содержит ссылки или неопределенные символы, поскольку файлы .h, которые включены в ваш main.cpp, не имеют реализации YET. Они готовы быть связаны с другим объектным файлом, который определяет реализацию для вашего шаблона, и, следовательно, у вас есть полный исполняемый файл a.out. Однако, поскольку шаблоны необходимо обрабатывать на этапе компиляции, чтобы сгенерировать код для каждого экземпляра шаблона, который вы делаете в своей основной программе, ссылка не поможет, поскольку компиляция main.cpp в main.o, а затем компиляция вашего шаблона .cpp в template.o, а затем ссылка не будет достигать цели шаблонов, потому что я связываю различные экземпляры шаблонов с одной и той же реализацией шаблона! И шаблоны должны делать обратное, т. Е. Иметь одну реализацию, но допускать много доступных экземпляров посредством использования одного класса.
Значение typename T
get заменяется во время этапа компиляции, а не на этапе связывания, поэтому, если я попытаюсь для компиляции шаблона без замены T
в качестве конкретного типа значения, чтобы он не работал, потому что это определение шаблонов - это процесс времени компиляции, а мета-программирование btw - все об использовании этого определения.
Предполагается, что расположение слов будет различным. Нет никакого «правильного» места для слов, просто взаимных договоренностей, которые хороши в задании обучения (предсказывая слова из других близлежащих слов) - и алгоритм включает случайную инициализацию, случайный выбор во время обучения и (как правило) многопоточную операцию, которая может меняться эффективный порядок учебных примеров и, следовательно, конечные результаты, даже если вы должны были попытаться устранить случайность, полагаясь на генератор псевдослучайных чисел с детерминированным посевом.
В gensim есть класс, называемый TranslationMatrix
, который реализует метод learn-a-projection-between-two-spaces, используемый для машинного перевода между естественными языками в одной из ранних статей word2vec. Для этого требуется, чтобы некоторые слова, которые вы указываете, должны иметь эквивалентные векторы - набор привязки / набора ссылок, а затем другие слова найдут свои позиции по отношению к ним. Существует демо-версия его использования в ноутбуках документации gensim:
https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/translation_matrix.ipynb
Но есть и другие методы, которые вы могли бы также рассмотреть:
model.trainables
есть экспериментальное свойство с окончанием имени _lockf
, которое позволяет масштабировать обновления для каждого слова. Если вы установите его значения равным 0.0, вместо определенных по умолчанию 1.0 для определенных слотов слов эти слова не могут быть дополнительно обновлены. Поэтому после повторной загрузки модели вы можете «заморозить» ваши опорные слова, установив их значения _lockf
равными 0.0, чтобы только другие слова обновляются по второстепенному обучению, и , они все еще связаны с координатами, которые имеют смысл в отношении неподвижных якорных слов. Читайте исходный код , чтобы лучше понять как работает _lockf
.)