为什么我的稀疏张量不能转换为张量

时间:2020-08-11 07:28:13

标签: python tensorflow keras sparse-matrix

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

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:无法将类型的对象转换为Tensor。内容: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),density_shape = Tensor(“ stack:0“,shape =(3,),dtype = int64,device = / job:localhost / replica:0 / task:0 / device:CPU:0)。考虑将元素强制转换为受支持的类型。

我对这个错误有点迷茫。我给人的印象是TensorFlow可以处理稀疏数据而无需进行转换。此外,如果有必要进行转换,我不确定为什么会失败。如果我使用tf.sparse.to_dense()手动转换,我可以运行上面的代码(没有sparse = True)很好。因此,我从coo-matrix来创建sparsetensor的方式似乎没有什么问题(至少据我所知)。

编辑:

我现在已经测试了提供的答案 Using sparse matrices with Keras and Tensorflow。不幸的是,它们都没有解决我的问题而没有牺牲至少一批的稀疏性。没有其他可能性了吗?

0 个答案:

没有答案