Python 在TensorFlow函数API中嵌入200.000个不同单词字典

Python 在TensorFlow函数API中嵌入200.000个不同单词字典,python,tensorflow,keras,neural-network,word-embedding,Python,Tensorflow,Keras,Neural Network,Word Embedding,我检查了Stakoverflow和教程中关于Keras和TensorFlow嵌入的几个问题,但没有找到适合我的答案。我解释 我有一本20万字的字典。有10376个独特的“单词”。它们表示蜂窝设备ID.IMEI。在这个特殊的例子中,我想使用Keras函数API处理它们,然后在解决这个问题时最终和数值数据合并 但是我可以通过第一级,哪一部分是嵌入 这是密码 #example of device 0 jg4M/taYRc2cBJPGa8c8vw== 1 jg4M/taY

我检查了Stakoverflow和教程中关于Keras和TensorFlow嵌入的几个问题,但没有找到适合我的答案。我解释

我有一本20万字的字典。有10376个独特的“单词”。它们表示蜂窝设备ID.IMEI。在这个特殊的例子中,我想使用Keras函数API处理它们,然后在解决这个问题时最终和数值数据合并

但是我可以通过第一级,哪一部分是嵌入

这是密码

#example of device
0         jg4M/taYRc2cBJPGa8c8vw==
1         jg4M/taYRc2cBJPGa8c8vw==
2         jg4M/taYRc2cBJPGa8c8vw==
3         chIM3a44QxatbmmjyBFGDQ==
4         PdhyfpkIT8Weslb54thwuQ==
5         lrDcRnK7RtKkvaqaYjliBQ==

#lenght of the device 
device_len = len(device)
device_len
200000
#uniques device inside the 200000
top_words = len(np.unique(device))
top_words
10376

#keras encoded
encoded_docs = [one_hot(d, top_words) for d in device]

#max length of the vector for each word
max_length = 2
padded_docs = pad_sequences(encoded_docs, maxlen=max_length, padding='post')
print(padded_doc)

[[10269  9475]
 [10269  9475]
 [10269  9475]
 ...
 [ 1340  2630]
 [ 7270     0]
 [ 2364  9298]]

#converted to tensors
padded_docs = tf.convert_to_tensor(padded_docs)
sess = tf.InteractiveSession()  
print(padded_docs.eval())
sess.close()

#here is the networks
top_words = 10376
embedding_vector_length = 2
x = Embedding(top_words, embedding_vector_length)(padded_docs)
x = Dense(2, activation='sigmoid')(x)
modelx = Model(inputs=padded_docs, outputs = x)
我检查了类似的问题和答案,但找不到适合我的

如果有人能帮助我,我将不胜感激


非常感谢。

创建模型时,输入应该是输入层,而不是张量

input = keras.layers.Input((max_length,))
x = Embedding(top_words, embedding_vector_length)(input)
x = Dense(2, activation='sigmoid')(x)
modelx = Model(inputs=input, outputs=x)

您需要为您的模型输入
<代码>填充文档
不是张量,而是“数据”

此外,您需要填充的文档由“整数”组成,而不是由一个热编码组成。
嵌入层需要整数

需要注意的是,您不会将其作为张量传递,而是作为常规numpy数组传递,以便使用
model.fit
进行训练

因此,您需要删除
one\u hot
convert\u to\u tensor
部分


然后你会做一个
model.fit(填充的文档,无论输出什么,…等等)

我按照你的建议做了,我有一个新的错误:ValueError:模型的输出张量必须是Keras
层的输出(因此保存过去的层元数据)。发现:张量(“稠密/乙状:0”,形状=(200000,2,2),dtype=float32),你能帮忙吗?求你了?@Gabriel对不起,我错过了那部分。请参见编辑。我将嵌入层的输入从
padded_docs
更改为输入层。非常感谢,仍然有一个错误,我复制了您的代码。AttributeError:'Node'对象没有与嵌入有关的属性'output_masks'part@Gabriel不是100%确定如何修复,但这是另一个问题。谷歌它,如果你仍然需要帮助,问一个关于堆栈溢出的新问题。另外,另一件不相关的事情:
pad_序列中的
maxlen
是序列的最终长度,而不是嵌入向量的大小。谢谢。我想原始数据是一组数字和字母,如jg4M/taYRc2cBJPGa8c8vw==。如果不是一个hoe编码器,我如何将其转换为整数?丹尼尔:)d不是整数吗?
encoded\u docs=[设备中d的一个热门词(d,top\u words)]
设备是一个字符串,
d
不是整数,这就是我在这个项目中一直遇到的问题。如果我用Sequential()实现,它会工作,但如果我用函数API实现,它不会。我不得不使用函数式,因为数据集非常复杂。抱歉重播太晚了。不同的时区。如果它与
顺序
一起工作,那么它肯定与函数一起工作,您只需要
输入
张量,正如这里的两个答案所示。如果您将
填充文档
作为张量,那么
输入(张量=填充文档)
可能会工作。
input = keras.layers.Input((max_length,))
x = Embedding(top_words, embedding_vector_length)(input)
x = Dense(2, activation='sigmoid')(x)
modelx = Model(inputs=input, outputs=x)
 from keras.layers import Input

 inputs = Input((doc_length,))
 x = Embedding(top_words, embedding_vector_length)(inputs)
 x = Dense(2, activation='sigmoid')(x)

 modelx = Model(inputs=inputs, outputs = x)