Meh*_*ran 4 python machine-learning keras word-embedding
我有一些没有任何标签的文本。只是一堆文本文件。我想训练一个嵌入层将单词映射到嵌入向量。到目前为止我见过的大多数例子都是这样的:
\n\nfrom keras.models import Sequential\nfrom keras.layers import Embedding, Flatten, Dense\n\nmodel = Sequential()\nmodel.add(Embedding(max_words, embedding_dim, input_length=maxlen))\nmodel.add(Flatten())\nmodel.add(Dense(32, activation=\'relu\'))\nmodel.add(Dense(1, activation=\'sigmoid\'))\nmodel.summary()\nmodel.compile(optimizer=\'rmsprop\',\n loss=\'binary_crossentropy\',\n metrics=[\'acc\'])\nmodel.fit(x_train, y_train,\n epochs=10,\n batch_size=32,\n validation_data=(x_val, y_val))\nRun Code Online (Sandbox Code Playgroud)\n\n他们都假设嵌入层是试图预测标签的更大模型的一部分。但就我而言,我没有标签。我并不是想对任何东西进行分类。我只想训练从单词(更准确地说是整数)到嵌入向量的映射。但fit模型的方法要求x_train和y_train(如上面给出的示例)。
如何训练仅具有嵌入层且没有标签的模型?
\n\n[更新]
\n\n根据我从 @Daniel M\xc3\xb6ller 得到的答案,Keras 中的嵌入层正在实现监督算法,因此无法在没有标签的情况下进行训练。最初,我认为它是 Word2Vec 的变体,因此不需要训练标签。显然,情况并非如此。就我个人而言,我最终使用了FastText,它与 Keras 或 Python 无关。
\n在没有标签/目标的情况下这样做有意义吗?
如果没有目标,你的模型将如何决定向量中的哪些值对任何事情都有好处?
所有嵌入都是为了某种目的而“训练”的。没有目的就没有目标,没有目标就没有训练。
如果您确实想在没有任何目的/目标的情况下转换向量中的单词,您有两个选择:
to_categorical函数来实现此目的。 警告:我对 Word2Vec 一无所知,但我将尝试展示如何使用某种朴素的单词距离添加嵌入规则,以及如何使用虚拟“标签”来满足 Keras 的训练方式。
from keras.layers import Input, Embedding, Subtract, Lambda
import keras.backend as K
from keras.models import Model
input1 = Input((1,)) #word1
input2 = Input((1,)) #word2
embeddingLayer = Embedding(...params...)
word1 = embeddingLayer(input1)
word2 = embeddingLayer(input2)
#naive distance rule, subtract, expect zero difference
word_distance = Subtract()([word1,word2])
#reduce all dimensions to a single dimension
word_distance = Lambda(lambda x: K.mean(x, axis=-1))(word_distance)
model = Model([input1,input2], word_distance)
Run Code Online (Sandbox Code Playgroud)
现在我们的模型直接输出单词距离,我们的标签将是“零”,它们并不是真正的监督训练标签,但它们是模型的预期结果,是 Keras 工作所必需的。
例如,我们可以将mae(平均绝对误差)或(均方误差)作为损失函数。mse
model.compile(optimizer='adam', loss='mse')
Run Code Online (Sandbox Code Playgroud)
并用 word2 作为 word1 之后的单词进行训练:
xTrain = entireText
xTrain1 = entireText[:-1]
xTrain2 = entireText[1:]
yTrain = np.zeros((len(xTrain1),))
model.fit([xTrain1,xTrain2], yTrain, .... more params.... )
Run Code Online (Sandbox Code Playgroud)
尽管这对于 Word2Vec 的真正用途可能是完全错误的,但它显示了以下要点:
| 归档时间: |
|
| 查看次数: |
5132 次 |
| 最近记录: |