首页 > 解决方案 > 为什么我的稀疏张量不能转换为张量

问题描述

我想将一个稀疏张量作为输入提供给一个简单的基于 tensorflow 的递归神经网络。为此,我使用以下代码:

model = keras.Sequential()
model.add(keras.Input(shape=(1, features_dim), sparse=True))
model.add(keras.layers.RNN(keras.layers.SimpleRNNCell(hidden_layer_dim, activation="sigmoid")))
model.add(keras.layers.Dense(labels_dim, activation='softmax'))

model.compile(optimizer=keras.optimizers.SGD(lr=learning_rate, momentum=0.0, decay=0.0, nesterov=False),
              loss='sparse_categorical_crossentropy',
              metrics=[keras.metrics.SparseCategoricalAccuracy()])

model.fit(
      training_data, 
      training_labels,
      epochs=num_epochs, 
      batch_size=batch_size, 
      shuffle=True
    )

features_dim表示数量特征,training_labels是一个包含相应标签的 NumPy 数组,training_data 是从 COO 格式的稀疏矩阵创建的稀疏张量,形状为 ([num_entries, 1, num_features])。

但是,当我尝试运行它时,我收到此错误:

TypeError:无法将 <class 'tensorflow.python.framework.sparse_tensor.SparseTensor'> 类型的对象转换为张量。内容:SparseTensor(indices=Tensor("cond_1/Identity:0", shape=(None, 3), dtype=int64, device=/job:localhost/replica:0/task:0/device:CPU:0), values=Tensor("cond_1/Identity_1:0", shape=(None,), dtype=float64, device=/job:localhost/replica:0/task:0/device:CPU:0), dense_shape=Tensor("堆栈:0",形状=(3,),dtype=int64,设备=/job:localhost/replica:0/task:0/device:CPU:0))。考虑将元素转换为支持的类型。

我对这个错误有点迷茫。我的印象是 TensorFlow 无需转换即可处理稀疏数据。此外,如果需要转换,我不确定它为什么会失败。如果我手动使用. _ tf.sparse.to_dense()因此,我如何从 coo 矩阵创建稀疏张量似乎没有任何问题(至少据我所知)。

编辑:

我现在已经广泛测试了 使用 Keras 和 Tensorflow 使用稀疏矩阵中提供的答案。不幸的是,它们都没有解决我的问题而不牺牲至少批次的稀疏性。难道就没有其他可能了吗?

标签: pythontensorflowkerassparse-matrix

解决方案


推荐阅读