Numpy 在Keras和Tensorflow中使用稀疏输入
我正在尝试使用稀疏numpy矩阵作为后端tensorflow的keras。模型已编译,但拟合时出现错误。代码如下。感谢您的帮助Numpy 在Keras和Tensorflow中使用稀疏输入,numpy,tensorflow,keras,Numpy,Tensorflow,Keras,我正在尝试使用稀疏numpy矩阵作为后端tensorflow的keras。模型已编译,但拟合时出现错误。代码如下。感谢您的帮助 from keras.layers import Dense, Input from keras.models import Model inputs = Input(shape=(trainX.shape[1],), sparse=True) outputs = Dense(trainY.shape[1], activation='softmax')(inputs)
from keras.layers import Dense, Input
from keras.models import Model
inputs = Input(shape=(trainX.shape[1],), sparse=True)
outputs = Dense(trainY.shape[1], activation='softmax')(inputs)
model = Model(inputs=inputs, outputs=outputs)
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
trainX是
<2404941x337071 sparse matrix of type '<type 'numpy.float64'>'
with 4765705 stored elements in Compressed Sparse Row format>
给出以下错误
ValueError: setting an array element with a sequence.
如果编写自定义训练循环,则可以使用稀疏矩阵作为Keras模型的输入。 在下面的示例中,模型将稀疏矩阵作为输入,并输出密集矩阵
from keras.layers import Dense, Input
from keras.models import Model
import scipy
import numpy as np
trainX = scipy.sparse.random(1024, 1024)
trainY = np.random.rand(1024, 1024)
inputs = Input(shape=(trainX.shape[1],), sparse=True)
outputs = Dense(trainY.shape[1], activation='softmax')(inputs)
model = Model(inputs=inputs, outputs=outputs)
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
steps = 10
for i in range(steps):
# For simplicity, we directly use trainX and trainY in this example
# Usually, this is where batches are prepared
print(model.train_on_batch(trainX, trainY))
# [3549.2546, 0.0]
# ...
# [3545.6448, 0.0009765625]
从您的示例来看,您似乎也希望输出是稀疏矩阵。这更加困难,因为您的模型需要输出稀疏矩阵,并且必须使用稀疏矩阵计算损失。此外,我认为Keras还不支持稀疏输出。如果文档(例如,for
fit
)没有说参数可以是稀疏矩阵,那么它就不能。通常,如果输入不是数组,代码会将其包装在np.asarray(trainX)
中。如果输入是稀疏的,结果是一个1元素的对象数组,这不是你想要的。是的,我就是这么想的。但为什么他们会有一个稀疏的选择呢?在这里,一些人声称已经解决了@hpauljAnd这里的问题:我认为对于稀疏张量,使用了一个定制的批处理生成器,只将张量的一部分转换回稠密形式。Ref:我遇到了这个错误->试图将一个不支持类型()的值()转换成张量。
from keras.layers import Dense, Input
from keras.models import Model
import scipy
import numpy as np
trainX = scipy.sparse.random(1024, 1024)
trainY = np.random.rand(1024, 1024)
inputs = Input(shape=(trainX.shape[1],), sparse=True)
outputs = Dense(trainY.shape[1], activation='softmax')(inputs)
model = Model(inputs=inputs, outputs=outputs)
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
steps = 10
for i in range(steps):
# For simplicity, we directly use trainX and trainY in this example
# Usually, this is where batches are prepared
print(model.train_on_batch(trainX, trainY))
# [3549.2546, 0.0]
# ...
# [3545.6448, 0.0009765625]