Лямбда-слой Keras не может обрабатывать разреженные кусочки - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь нарезать разреженный тензор в лямбда-слое для модели керас. Я столкнулся с некоторыми проблемами с более крупной моделью, включая этот слой, поэтому я попытался провести простой эксперимент, чтобы проверить, может ли 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'

Я ожидаю, что он просто вернет разреженный тензор среза.

...