Я пытаюсь нарезать разреженный тензор в лямбда-слое для модели керас. Я столкнулся с некоторыми проблемами с более крупной моделью, включая этот слой, поэтому я попытался провести простой эксперимент, чтобы проверить, может ли Lambda выполнить sparse_slice в очень простом примере.
Даже это простое упражнение не удалось выполнить. Я попытался выполнить поиск без каких-либо ответов, есть ли что-то, чего мне здесь не хватает, или уже известно, что лямбда-слои не могут обрабатывать разреженные вводы или определенные разреженные операции?
В настоящее время я использую keras 2.2.4 и tenorflow 1.12
В первой части кода в качестве проверки работоспособности я сначала взял разреженный тензор и использовал tf.sparse_slice, чтобы разрезать его и оценил этот тензор без каких-либо проблем.
import numpy as np
import tensorflow as tf
import keras.backend as K
from keras.layers import Input, Lambda
from keras.models import Model
from scipy import sparse
# create sparse input for both experiments
_in1 = Input(batch_shape=(None,None), sparse=True)
spr = sparse.coo_matrix([[0,1,0],[1,1,0],[0,0,1]])
spr_tnsr = tf.SparseTensorValue(
np.mat([spr.row,spr.col]).T, spr.data, spr.shape)
1. Прямой tf slice op и eval работает и возвращает тензор среза
slc = tf.sparse_slice(_in1, [0,0], [2,3])
K.get_session().run(slc, feed_dict={_in1: spr_tnsr})
# output, the session run returns a sliced tensor
SparseTensorValue(indices=array([[0, 1],
[1, 0],
[1, 1]]), values=array([1., 1., 1.], dtype=float32), dense_shape=array([2, 3]))
2. Создайте модель keras и добавьте простой лямбда-слой с помощью операции sparse_slice без определения output_shape
_out = Lambda(lambda x: tf.sparse_slice(x, [0,0], [2,3]))(_in1)
# output, get a TypeError after above line
TypeError: Input must be a SparseTensor.
3. Добавить output_shape в Lambda, удалить ошибку TypeError
_out = Lambda(lambda x: tf.sparse_slice(x, [0,0], [2,3]), output_shape=(2,3))(_in1)
_model = Model(_in1, _out)
_model.predict(spr_tnsr, steps=1)
# output, instead of the TypeError above, running predict here raises
# an attribute error
AttributeError: 'SparseTensorValue' object has no attribute 'ndim'
Я ожидаю, что он просто вернет разреженный тензор среза.