TensorFlow 2.4.1运行Word2Vec示例报SparseTensor转Tensor错误
报错核心原因
- 原代码仅执行
vector_x.toarray()、vector_y.toarray()做控制台打印,没有将稠密转换结果回写到对应变量,实际传入model.fit()的还是文本向量化器返回的scipy稀疏矩阵。 - TensorFlow 2.4版本的Keras调整了稀疏输入的自动兼容逻辑:旧版Keras遇到scipy稀疏矩阵会自动适配处理,当前版本会将稀疏对象序列化为SparseTensor类型,但全连接Dense层不支持直接接收SparseTensor输入,最终触发类型转换失败的报错。
具体修复步骤
- 第一步:完成向量的稠密化赋值,替换原代码中只打印不赋值的片段:
# 替换原代码中两行单独的toarray()调用 vector_x = vectorizer.transform(x2).toarray() vector_y = vectorizer.transform(y2).toarray()
你的训练样本仅8条,词表大小为5,转成稠密数组后的内存占用可以忽略,完全没有必要保留稀疏格式。
- 第二步:统一张量数据类型,避免后续出现整数类型兼容问题:
import numpy as np # 匹配TensorFlow默认的float32计算精度 vector_x = vector_x.astype(np.float32) vector_y = vector_y.astype(np.float32)
- 第三步:修正示例代码自带的损失函数适配问题(非当前报错的触发原因,但会影响模型收敛效果):
当前训练任务是给定3个上下文词,预测1个中间目标词,标签为5类独热编码,使用categorical_crossentropy比原代码的binary_crossentropy更适配任务逻辑,替换编译行即可:
model.compile(loss='categorical_crossentropy', optimizer='adam')
- 修正后直接运行训练代码,不会再触发SparseTensor转换报错:
model.fit(vector_x, vector_y, epochs=1000, batch_size=4, verbose=1)
可选适配方案:如果是大样本场景不想转稠密占用内存,可以在模型最前面加一层显式声明稀疏输入的
Input层,Dense层会自动完成稀疏到稠密的转换,不过对于当前小样本实验场景,直接转稠密是最简便的方式。
内容的提问来源于stack exchange,提问作者dokondr
相关产品推荐
相关产品推荐

