TensorFlow 2 Keras中意外的遮罩形状
我有形状的批处理张量TensorFlow 2 Keras中意外的遮罩形状,tensorflow,keras,mask,Tensorflow,Keras,Mask,我有形状的批处理张量(批处理大小、n个时间步长、n个特征、n个通道)。它们产生于形状的张量(n_时间步、n_特征、n_通道),其中n_时间步不是常数。在构建批时,张量被填充到最大值n\u time\u steps 这些张量应输入以下结构的神经网络: 由于填充,输入被屏蔽 每个时间步的张量被馈送到时间分布的CNN块。掩码被传播 提取的特征被馈送到RNN 在最后一层中,我遇到了一个错误,因为遮罩具有形状(批大小,n时间步数,n时间特征),但RNN希望它具有形状(批大小,n时间步数) 有人知道如何得到
(批处理大小、n个时间步长、n个特征、n个通道)
。它们产生于形状的张量(n_时间步、n_特征、n_通道)
,其中n_时间步
不是常数。在构建批时,张量被填充到最大值n\u time\u steps
这些张量应输入以下结构的神经网络:
(批大小,n时间步数,n时间特征)
,但RNN希望它具有形状(批大小,n时间步数)
有人知道如何得到合适形状的面具吗
下面是一个简单的例子:
将tensorflow导入为tf
类TimeDistributedMaskPropagating(tf.keras.layers.TimeDistributed):
“”“传播掩码的时间分布层。”“”
定义初始化(self,*args,**kwargs):
super()
self.supports\u masking=True
def计算掩码(自身、输入、掩码=无):
返回掩码
n_特征=3
n_通道=1
cnn_block=tf.keras.layers.Flatten()
估计量=tf.keras.Sequential([
tf.keras.layers.Input(shape=(无,n个特征,n个通道)),
tf.keras.layers.Masking(),
时间分布的广播(cnn_区块),
#tf.keras.layers.LSTM(10)
#收益率值错误:维度必须相等,但为3和10
])
x1=tf.随机.均匀((4,3,1))#形状:4,3,1
x2=tf.随机.均匀((3,3,1))#形状:3,3,1
填充=tf.常数([[0,1],[0,0],[0,0]])
填充垫(x2,填充物)#形状:4,3,1
小批量=tf.stack((x1,填充x2))#形状:2,4,3,1
logits=估计器(小批量)#形状:2,4,3
打印(logits._keras_mask)#形状:2,4,3
#遮罩具有带值的形状2、4、3
#真的
#[对]
#[对]
#[正确]]
#
#[[True]
#[对]
#[对]
#[错误]]]
#遮罩应具有带值的形状2、4
#[[True]
#[对错]]
在实施tensorflow.keras.layers.Masking
时,仅要求最后一个轴的所有值都等于mask_值
,以便在mask中生成条目False
。因此,掩码的张量秩变为输入张量的张量秩减1(而不是2,一个用于批量大小
,一个用于时间步长
,如预期)
这个问题可以通过定义一个自定义屏蔽层来解决,其中axis=-1
来自方法compute\u mask
中的原始代码,call
被axis=[2,3]
(在我的例子中)或更一般地被axis=list(范围(2,len(inputs.shape))
取代
以下是完整的代码:
类自定义屏蔽(层):
定义初始值(自身,掩码值=0.,**kwargs):
超级(自定义屏蔽,自我)。\uuuuu初始化(**kwargs)
self.supports\u masking=True
self.mask\u值=mask\u值
self.\u compute\u output\u和\u mask\u联合=真
def计算掩码(自身、输入、掩码=无):
返回K.any(数学运算不相等(输入、自身掩码值),
轴=列表(范围(2,len(inputs.shape)))
def呼叫(自我,输入):
轴=列表(范围(2,长度(inputs.shape)))
布尔掩码=K.any(数学运算不相等(输入、自掩码值),
轴=轴,keepdims=真)
输出=输入*数学运算.cast(布尔掩码,输入.dtype)
#同时计算掩码和输出。
输出。_keras_mask=数组_ops.squence(布尔_mask,axis=轴)35; pylint:disable=受保护访问
返回输出
def计算输出形状(自身、输入形状):
返回输入形状
def get_配置(自身):
config={'mask_value':self.mask_value}
base_config=super(掩蔽,self).get_config()
return dict(list(base_config.items())+list(config.items())
在实施tensorflow.keras.layers.Masking
时,仅要求最后一个轴的所有值都等于mask_值
,以便在mask中生成条目False
。因此,掩码的张量秩变为输入张量的张量秩减1(而不是2,一个用于批量大小
,一个用于时间步长
,如预期)
这个问题可以通过定义一个自定义屏蔽层来解决,其中axis=-1
来自方法compute\u mask
中的原始代码,call
被axis=[2,3]
(在我的例子中)或更一般地被axis=list(范围(2,len(inputs.shape))
取代
以下是完整的代码:
类自定义屏蔽(层):
定义初始值(自身,掩码值=0.,**kwargs):
超级(自定义屏蔽,自我)。\uuuuu初始化(**kwargs)
self.supports\u masking=True
self.mask\u值=mask\u值
self.\u compute\u output\u和\u mask\u联合=真
def计算掩码(自身、输入、掩码=无):
返回K.any(数学运算不相等(输入、自身掩码值),
轴=列表(范围(2,len(inputs.shape)))
def呼叫(自我,输入):
轴=列表(范围(2,长度(inputs.shape)))
布尔掩码=K.any(数学运算不相等(输入、自掩码值),
轴=轴,keepdims=真)
输出=输入*数学运算.cast(布尔掩码,输入.dtype)
#同时计算掩码和输出。
输出。U keras_UMask=数组\u ops.挤压(布尔屏蔽,axis=axe