Python 如何训练Keras中只有嵌入层且没有标签的模型
我有一些没有任何标签的文本。只是一堆文本文件。我想训练一个嵌入层,将单词映射到嵌入向量。到目前为止,我看到的大多数示例如下:Python 如何训练Keras中只有嵌入层且没有标签的模型,python,machine-learning,keras,word-embedding,Python,Machine Learning,Keras,Word Embedding,我有一些没有任何标签的文本。只是一堆文本文件。我想训练一个嵌入层,将单词映射到嵌入向量。到目前为止,我看到的大多数示例如下: from keras.models import Sequential from keras.layers import Embedding, Flatten, Dense model = Sequential() model.add(Embedding(max_words, embedding_dim, input_length=maxlen)) model.add(
from keras.models import Sequential
from keras.layers import Embedding, Flatten, Dense
model = Sequential()
model.add(Embedding(max_words, embedding_dim, input_length=maxlen))
model.add(Flatten())
model.add(Dense(32, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.summary()
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['acc'])
model.fit(x_train, y_train,
epochs=10,
batch_size=32,
validation_data=(x_val, y_val))
他们都假设嵌入层是试图预测标签的更大模型的一部分。但就我而言,我没有标签。我不想把任何东西分类。我只想训练从单词(更精确地说是整数)到嵌入向量的映射。但是模型的fit
方法要求x\u列车
和y\u列车
(如上所示)
我如何训练一个只有嵌入层而没有标签的模型
[更新]
根据我从@Daniel Möller那里得到的答案,Keras中的嵌入层实现了一种有监督的算法,因此没有标签就无法进行训练。最初,我认为它是Word2Vec的一个变体,因此不需要对标签进行培训。显然,情况并非如此。就我个人而言,我最终使用了与Keras或Python无关的。在没有标签/目标的情况下这样做有意义吗 如果没有目标,您的模型将如何决定向量中的哪些值对任何事情都有好处 所有嵌入件都经过专门的“培训”。没有目标就没有目标,没有目标就没有训练 如果您真的想在向量中转换单词而没有任何目的/目标,您有两个选项:
- 制作一个热编码向量。您可以使用Keras
来进行分类李>
- 使用预训练的嵌入。有一些是可用的,比如手套,谷歌的嵌入,等等(他们都是为了某种目的而在某个时候接受培训的)李>
考虑到单词距离,这是一种基于聊天的非常简单的方法 警告:我对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)
现在,我们的模型直接输出单词距离,我们的标签将是“零”,它们实际上不是监督训练的标签,但它们是模型的预期结果,是Keras工作所必需的
例如,我们可以将mae
(平均绝对误差)或mse
(均方误差)作为损失函数
model.compile(optimizer='adam', loss='mse')
并以单词2作为单词1后的单词进行培训:
xTrain = entireText
xTrain1 = entireText[:-1]
xTrain2 = entireText[1:]
yTrain = np.zeros((len(xTrain1),))
model.fit([xTrain1,xTrain2], yTrain, .... more params.... )
虽然Word2Vec的实际功能可能完全错误,但它显示了以下要点:
- 嵌入层没有特殊的属性,它们只是可训练的查找表
- 创建嵌入的规则应由模型和预期输出定义
- Keras模型需要“目标”,即使这些目标不是“标签”,而是实现预期结果的数学技巧李>