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

2024-06-18 16:35:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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_数据是一个稀疏张量,由具有形状([num_entries,1,num_features])的COO格式的稀疏矩阵创建

但是,当我尝试运行此命令时,会出现以下错误:

TypeError: Failed to convert object of type <class 'tensorflow.python.framework.sparse_tensor.SparseTensor'> to Tensor. Contents: 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("stack:0", shape=(3,), dtype=int64, device=/job:localhost/replica:0/task:0/device:CPU:0)). Consider casting elements to a supported type.

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

编辑:

我现在已经测试了中提供的答案 Using sparse matrices with Keras and Tensorflow广泛。不幸的是,它们都不能在不牺牲批次稀疏性的情况下解决我的问题。没有其他可能性吗


Tags: toaddtruelabelsmodeldevicelayerstraining