Python 作为TensorFlow层的一部分删除tensor切片

Python 作为TensorFlow层的一部分删除tensor切片,python,tensorflow,machine-learning,keras,deep-learning,Python,Tensorflow,Machine Learning,Keras,Deep Learning,版本:tensorflow 2.3.0、numpy 1.18.5、python 3.8.2 我想使用TensorFlow模型中的第一层删除输入张量的一些选定切片。例如,我有一个输入形状(180,90,25)(其中180是批量大小),我想从最后一个维度中删除索引列表索引=[3,4,5,6,7,22,23,24],这样,在调用输入张量的这个层之后,我会得到一个形状张量(180,90,25-len(索引)),其中,通过索引最后一个维度,已移除每个选定的(180,90)形张量切片 目前,我正在使用此层:

版本:tensorflow 2.3.0、numpy 1.18.5、python 3.8.2

我想使用TensorFlow模型中的第一层删除输入张量的一些选定切片。例如,我有一个输入形状
(180,90,25)
(其中180是批量大小),我想从最后一个维度中删除
索引列表
索引=[3,4,5,6,7,22,23,24]
,这样,在调用输入张量的这个层之后,我会得到一个形状张量
(180,90,25-len(索引))
,其中,通过索引最后一个维度,已移除每个选定的
(180,90)
形张量切片

目前,我正在使用此层:

类移除选定的骰子(tf.keras.layers.Layer):
定义初始(self,索引=[3,4,5,6,7,22,23,24]):
超级(RemoveSelectedDices,self)。\uuu初始化(name=“RemoveSelectedDices”)
self.index=self.add_weight(name=“index”,shape=len(index),dtype=tf.int32,trainable=False,
初始值设定项=lambda*args,**kwargs:index)
def构建(自我,输入_形状):
通过
def调用(自、输入张量):
X=tf.unstack(input_tensor,num=input_tensor.shape[-1],axis=2)#25(180,90)个形状切片的列表
索引=排序(列表(self.index.value().numpy())
对于反向中的i(指数):
德尔X[i]
X=tf.stack(X,axis=2)#将列表重新打包
返回X
当我测试它时(通过创建一个numpy数组并使用
tf.convert_to_tensor
,然后调用张量上的层),这工作得非常好,但是当我尝试使用此层作为第一层构建模型时,我得到一个错误:

将tensorflow导入为tf
从tensorflow.keras.layers导入输入
输入=输入(形状=(90,25))
X=移除选定的骰子()(输入)
#给我AttributeError:“Tensor”对象没有属性“numpy”
#引用行索引=排序(列表(self.index.value().numpy())
为什么会发生这种情况,我有什么办法可以避开它吗

(注意:我知道我可以对数据本身这样做,但是数据集是巨大的,除非我不得不这样做,否则我不想对数据集太乱。)


提前谢谢你

对于这种操作,只需使用Lambda层即可

to_remove = [3,4,5,6,7,22,23,24]

def select(X, to_remove):
    X = tf.stack([X[...,i] for i in range(X.shape[-1]) if i not in to_remove], -1)
    return X

inputs = Input(shape=(90, 25))
x = Lambda(lambda x: select(x, to_remove))(inputs)

我刚试过你的解决方案,一切都很好。非常感谢你!