我有一些没有任何标签的文字。只是一堆文本文件。我想训练一个嵌入层,将单词映射到嵌入向量。到目前为止,我看到的大多数示例都是这样的:
let task = database_connection.then(|connection| match connection {
Ok(_) => io::write_all(stream, &b"success"[..]),
Err(_) => io::write_all(stream2, &b"error"[..]),
});
他们都假定嵌入层是试图预测标签的更大模型的一部分。但就我而言,我没有标签。我没有试图对任何东西进行分类。我只想训练从单词(更确切地说是整数)到嵌入向量的映射。但是模型的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_train
(如上面给出的示例)。
如何训练仅具有嵌入层且没有标签的模型?
[更新]
基于我从@DanielMöller那里获得的答案,Keras中的Embedding层正在实现一种监督算法,因此如果没有标签就无法进行训练。最初,我以为它是Word2Vec的变体,因此不需要训练标签。显然不是这样。我个人最终使用了FastText,它与Keras或Python无关。
答案 0 :(得分:1)
在没有标签/目标的情况下这样做是否有意义?
如果没有目标,您的模型将如何确定向量中的哪些值对任何事物都有好处?
所有嵌入都是出于特定目的而经过“训练”的。如果没有目标,就没有目标,如果没有目标,就没有培训。
如果您真的想在没有任何目的/目标的情况下转换向量中的单词,则有两种选择:
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)
现在,我们的模型直接输出一个单词距离,我们的标签将为“零”,它们并不是监督训练的真正标签,但它们是模型的预期结果,这对于Keras来说是必需的。
例如,我们可以将mae
(平均绝对误差)或mse
(平均平方误差)作为损失函数。
model.compile(optimizer='adam', loss='mse')
然后训练word2为word1之后的单词:
xTrain = entireText
xTrain1 = entireText[:-1]
xTrain2 = entireText[1:]
yTrain = np.zeros((len(xTrain1),))
model.fit([xTrain1,xTrain2], yTrain, .... more params.... )
尽管就Word2Vec的实际功能而言这可能是完全错误的,但它显示了以下要点: