我想将稀疏张量作为简单的基于张量流的递归神经网络的输入。为此,我使用以下代码:
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。不幸的是,它们都没有解决我的问题而没有牺牲至少一批的稀疏性。没有其他可能性了吗?