TensorFlow 2.6使用2D稀疏输入接入Dense层报错如何解决?
报错原因
- TensorFlow 2.6版本的
Dense层仅支持2维SparseTensor输入(即形状为(batch_size, 特征数)的稀疏输入)。你定义的输入形状为(3,64),加上batch维度后实际传入Dense层的是3维SparseTensor,层内部无法自动将高维稀疏张量转换为普通张量进行矩阵运算,因此触发类型转换报错。 - 你将输入展平后,稀疏张量变成符合要求的2维结构,所以可以正常运行。
可行解决方案
方案1:保留原版本,增加展平处理
在输入层和第一个Dense层之间增加Flatten层对稀疏输入做展平,无需修改其他逻辑:
import tensorflow.keras as keras input1 = keras.layers.Input(shape=(3,64), sparse=True) # 新增展平层,将(None, 3, 64)的3维稀疏张量转为(None, 192)的2维稀疏张量 flatten = keras.layers.Flatten()(input1) layer1 = keras.layers.Dense(32)(flatten) output1 = keras.layers.Dense(32)(layer1) model = keras.Model(inputs = [input1], outputs = [output1]) model.compile() model.summary()
方案2:保留原输入维度,用TimeDistributed包裹Dense层
如果需要保留3维输入的结构(比如第二维是时间步需要单独处理),可以用TimeDistributed包裹Dense层,该层支持对高维稀疏张量的逐片段运算:
import tensorflow.keras as keras input1 = keras.layers.Input(shape=(3,64), sparse=True) # 对第二个维度的每个64维片段单独执行Dense运算,输出形状为(None, 3, 32) layer1 = keras.layers.TimeDistributed(keras.layers.Dense(32))(input1) output1 = keras.layers.TimeDistributed(keras.layers.Dense(32))(layer1) model = keras.Model(inputs = [input1], outputs = [output1]) model.compile() model.summary()
方案3:升级TensorFlow版本
TensorFlow 2.7及以上版本已经修复了Dense层高维稀疏张量的支持问题,升级到对应版本后你原本的代码可以直接正常运行。
内容的提问来源于stack exchange,提问作者Hans Jakob
相关产品推荐
相关产品推荐

